OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/trees/thread_proxy.h" | 5 #include "cc/trees/thread_proxy.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 LayerTreeHost* layer_tree_host, | 55 LayerTreeHost* layer_tree_host, |
56 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { | 56 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { |
57 return make_scoped_ptr( | 57 return make_scoped_ptr( |
58 new ThreadProxy(layer_tree_host, impl_task_runner)).PassAs<Proxy>(); | 58 new ThreadProxy(layer_tree_host, impl_task_runner)).PassAs<Proxy>(); |
59 } | 59 } |
60 | 60 |
61 ThreadProxy::ThreadProxy( | 61 ThreadProxy::ThreadProxy( |
62 LayerTreeHost* layer_tree_host, | 62 LayerTreeHost* layer_tree_host, |
63 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) | 63 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) |
64 : Proxy(impl_task_runner), | 64 : Proxy(impl_task_runner), |
65 animate_requested_(false), | 65 update_requested_(false), |
66 commit_requested_(false), | 66 commit_requested_(false), |
67 commit_request_sent_to_impl_thread_(false), | 67 commit_request_sent_to_impl_thread_(false), |
68 created_offscreen_context_provider_(false), | 68 created_offscreen_context_provider_(false), |
69 layer_tree_host_(layer_tree_host), | 69 layer_tree_host_(layer_tree_host), |
70 started_(false), | 70 started_(false), |
71 textures_acquired_(true), | 71 textures_acquired_(true), |
72 in_composite_and_readback_(false), | 72 in_composite_and_readback_(false), |
73 manage_tiles_pending_(false), | 73 manage_tiles_pending_(false), |
74 commit_waits_for_activation_(false), | 74 commit_waits_for_activation_(false), |
75 inside_commit_(false), | 75 inside_commit_(false), |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 base::Bind(&ThreadProxy::SetNeedsCommitOnImplThread, | 323 base::Bind(&ThreadProxy::SetNeedsCommitOnImplThread, |
324 impl_thread_weak_ptr_)); | 324 impl_thread_weak_ptr_)); |
325 } | 325 } |
326 | 326 |
327 const RendererCapabilities& ThreadProxy::GetRendererCapabilities() const { | 327 const RendererCapabilities& ThreadProxy::GetRendererCapabilities() const { |
328 DCHECK(IsMainThread()); | 328 DCHECK(IsMainThread()); |
329 DCHECK(!layer_tree_host_->output_surface_lost()); | 329 DCHECK(!layer_tree_host_->output_surface_lost()); |
330 return renderer_capabilities_main_thread_copy_; | 330 return renderer_capabilities_main_thread_copy_; |
331 } | 331 } |
332 | 332 |
333 void ThreadProxy::SetNeedsAnimate() { | |
334 DCHECK(IsMainThread()); | |
335 if (animate_requested_) | |
336 return; | |
337 | |
338 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsAnimate"); | |
339 animate_requested_ = true; | |
340 can_cancel_commit_ = false; | |
341 SendCommitRequestToImplThreadIfNeeded(); | |
342 } | |
343 | |
344 void ThreadProxy::SetNeedsUpdateLayers() { | 333 void ThreadProxy::SetNeedsUpdateLayers() { |
345 DCHECK(IsMainThread()); | 334 DCHECK(IsMainThread()); |
346 | 335 if (update_requested_) |
347 if (commit_request_sent_to_impl_thread_) | |
348 return; | 336 return; |
349 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsUpdateLayers"); | 337 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsUpdateLayers"); |
350 | 338 update_requested_ = true; |
351 SendCommitRequestToImplThreadIfNeeded(); | 339 SendCommitRequestToImplThreadIfNeeded(); |
352 } | 340 } |
353 | 341 |
354 void ThreadProxy::SetNeedsCommit() { | 342 void ThreadProxy::SetNeedsCommit() { |
355 DCHECK(IsMainThread()); | 343 DCHECK(IsMainThread()); |
356 // Unconditionally set here to handle SetNeedsCommit calls during a commit. | 344 // Unconditionally set here to handle SetNeedsCommit calls during a commit. |
357 can_cancel_commit_ = false; | 345 can_cancel_commit_ = false; |
358 | 346 |
359 if (commit_requested_) | 347 if (commit_requested_) |
360 return; | 348 return; |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 } | 719 } |
732 | 720 |
733 // Do not notify the impl thread of commit requests that occur during | 721 // Do not notify the impl thread of commit requests that occur during |
734 // the apply/animate/layout part of the BeginMainFrameAndCommit process since | 722 // the apply/animate/layout part of the BeginMainFrameAndCommit process since |
735 // those commit requests will get painted immediately. Once we have done | 723 // those commit requests will get painted immediately. Once we have done |
736 // the paint, commit_requested_ will be set to false to allow new commit | 724 // the paint, commit_requested_ will be set to false to allow new commit |
737 // requests to be scheduled. | 725 // requests to be scheduled. |
738 commit_requested_ = true; | 726 commit_requested_ = true; |
739 commit_request_sent_to_impl_thread_ = true; | 727 commit_request_sent_to_impl_thread_ = true; |
740 | 728 |
741 // On the other hand, the AnimationRequested flag needs to be cleared | 729 // On the other hand, the update_requested_ flag needs to be cleared |
742 // here so that any animation requests generated by the apply or animate | 730 // here so that any update requests generated by the apply or animate |
743 // callbacks will trigger another frame. | 731 // callbacks will trigger another frame. |
744 animate_requested_ = false; | 732 update_requested_ = false; |
745 | 733 |
746 if (!in_composite_and_readback_ && !layer_tree_host_->visible()) { | 734 if (!in_composite_and_readback_ && !layer_tree_host_->visible()) { |
747 commit_requested_ = false; | 735 commit_requested_ = false; |
748 commit_request_sent_to_impl_thread_ = false; | 736 commit_request_sent_to_impl_thread_ = false; |
749 | 737 |
750 TRACE_EVENT0("cc", "EarlyOut_NotVisible"); | 738 TRACE_EVENT0("cc", "EarlyOut_NotVisible"); |
751 bool did_handle = false; | 739 bool did_handle = false; |
752 Proxy::ImplThreadTaskRunner()->PostTask( | 740 Proxy::ImplThreadTaskRunner()->PostTask( |
753 FROM_HERE, | 741 FROM_HERE, |
754 base::Bind(&ThreadProxy::BeginMainFrameAbortedOnImplThread, | 742 base::Bind(&ThreadProxy::BeginMainFrameAbortedOnImplThread, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 make_scoped_ptr(new ResourceUpdateQueue); | 796 make_scoped_ptr(new ResourceUpdateQueue); |
809 | 797 |
810 bool updated = layer_tree_host_->UpdateLayers(queue.get()); | 798 bool updated = layer_tree_host_->UpdateLayers(queue.get()); |
811 | 799 |
812 // Once single buffered layers are committed, they cannot be modified until | 800 // Once single buffered layers are committed, they cannot be modified until |
813 // they are drawn by the impl thread. | 801 // they are drawn by the impl thread. |
814 textures_acquired_ = false; | 802 textures_acquired_ = false; |
815 | 803 |
816 layer_tree_host_->WillCommit(); | 804 layer_tree_host_->WillCommit(); |
817 | 805 |
| 806 // Before calling animate, we set update_requested_ to false. If it is true |
| 807 // now, it means SetNeedsUpdateLayers was called again, but during a state |
| 808 // when commit_request_sent_to_impl_thread_ = true. We need to force that call |
| 809 // to happen again now so that the commit request is sent to the impl thread. |
| 810 if (update_requested_) { |
| 811 // Forces SetNeedsUpdateLayers to consider posting a commit task. |
| 812 update_requested_ = false; |
| 813 SetNeedsUpdateLayers(); |
| 814 } |
| 815 |
818 if (!updated && can_cancel_this_commit) { | 816 if (!updated && can_cancel_this_commit) { |
819 TRACE_EVENT0("cc", "EarlyOut_NoUpdates"); | 817 TRACE_EVENT0("cc", "EarlyOut_NoUpdates"); |
820 bool did_handle = true; | 818 bool did_handle = true; |
821 Proxy::ImplThreadTaskRunner()->PostTask( | 819 Proxy::ImplThreadTaskRunner()->PostTask( |
822 FROM_HERE, | 820 FROM_HERE, |
823 base::Bind(&ThreadProxy::BeginMainFrameAbortedOnImplThread, | 821 base::Bind(&ThreadProxy::BeginMainFrameAbortedOnImplThread, |
824 impl_thread_weak_ptr_, | 822 impl_thread_weak_ptr_, |
825 did_handle)); | 823 did_handle)); |
826 | 824 |
827 // Although the commit is internally aborted, this is because it has been | 825 // Although the commit is internally aborted, this is because it has been |
828 // detected to be a no-op. From the perspective of an embedder, this commit | 826 // detected to be a no-op. From the perspective of an embedder, this commit |
829 // went through, and input should no longer be throttled, etc. | 827 // went through, and input should no longer be throttled, etc. |
830 layer_tree_host_->CommitComplete(); | 828 layer_tree_host_->CommitComplete(); |
831 layer_tree_host_->DidBeginMainFrame(); | 829 layer_tree_host_->DidBeginMainFrame(); |
832 return; | 830 return; |
833 } | 831 } |
834 | 832 |
835 // Before calling animate, we set animate_requested_ to false. If it is true | |
836 // now, it means SetNeedAnimate was called again, but during a state when | |
837 // commit_request_sent_to_impl_thread_ = true. We need to force that call to | |
838 // happen again now so that the commit request is sent to the impl thread. | |
839 if (animate_requested_) { | |
840 // Forces SetNeedsAnimate to consider posting a commit task. | |
841 animate_requested_ = false; | |
842 SetNeedsAnimate(); | |
843 } | |
844 | |
845 scoped_refptr<cc::ContextProvider> offscreen_context_provider; | 833 scoped_refptr<cc::ContextProvider> offscreen_context_provider; |
846 if (renderer_capabilities_main_thread_copy_.using_offscreen_context3d && | 834 if (renderer_capabilities_main_thread_copy_.using_offscreen_context3d && |
847 layer_tree_host_->needs_offscreen_context()) { | 835 layer_tree_host_->needs_offscreen_context()) { |
848 offscreen_context_provider = | 836 offscreen_context_provider = |
849 layer_tree_host_->client()->OffscreenContextProvider(); | 837 layer_tree_host_->client()->OffscreenContextProvider(); |
850 if (offscreen_context_provider.get()) | 838 if (offscreen_context_provider.get()) |
851 created_offscreen_context_provider_ = true; | 839 created_offscreen_context_provider_ = true; |
852 } | 840 } |
853 | 841 |
854 // Notify the impl thread that the main thread is ready to commit. This will | 842 // Notify the impl thread that the main thread is ready to commit. This will |
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1590 commit_to_activate_duration_history_.InsertSample( | 1578 commit_to_activate_duration_history_.InsertSample( |
1591 base::TimeTicks::HighResNow() - commit_complete_time_); | 1579 base::TimeTicks::HighResNow() - commit_complete_time_); |
1592 } | 1580 } |
1593 | 1581 |
1594 void ThreadProxy::DidManageTiles() { | 1582 void ThreadProxy::DidManageTiles() { |
1595 DCHECK(IsImplThread()); | 1583 DCHECK(IsImplThread()); |
1596 scheduler_on_impl_thread_->DidManageTiles(); | 1584 scheduler_on_impl_thread_->DidManageTiles(); |
1597 } | 1585 } |
1598 | 1586 |
1599 } // namespace cc | 1587 } // namespace cc |
OLD | NEW |