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/single_thread_proxy.h" | 5 #include "cc/trees/single_thread_proxy.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/profiler/scoped_tracker.h" | 9 #include "base/profiler/scoped_tracker.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 void SingleThreadProxy::SetNeedsUpdateLayers() { | 181 void SingleThreadProxy::SetNeedsUpdateLayers() { |
182 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsUpdateLayers"); | 182 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsUpdateLayers"); |
183 DCHECK(task_runner_provider_->IsMainThread()); | 183 DCHECK(task_runner_provider_->IsMainThread()); |
184 SetNeedsCommit(); | 184 SetNeedsCommit(); |
185 } | 185 } |
186 | 186 |
187 void SingleThreadProxy::DoCommit() { | 187 void SingleThreadProxy::DoCommit() { |
188 TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit"); | 188 TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit"); |
189 DCHECK(task_runner_provider_->IsMainThread()); | 189 DCHECK(task_runner_provider_->IsMainThread()); |
190 | 190 |
191 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 is | |
192 // fixed. | |
193 tracked_objects::ScopedTracker tracking_profile1( | |
194 FROM_HERE_WITH_EXPLICIT_FUNCTION("461509 SingleThreadProxy::DoCommit1")); | |
195 layer_tree_host_->WillCommit(); | 191 layer_tree_host_->WillCommit(); |
196 devtools_instrumentation::ScopedCommitTrace commit_task( | 192 devtools_instrumentation::ScopedCommitTrace commit_task( |
197 layer_tree_host_->id()); | 193 layer_tree_host_->id()); |
198 | 194 |
199 // Commit immediately. | 195 // Commit immediately. |
200 { | 196 { |
201 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
202 // is fixed. | |
203 tracked_objects::ScopedTracker tracking_profile2( | |
204 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
205 "461509 SingleThreadProxy::DoCommit2")); | |
206 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); | 197 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); |
207 DebugScopedSetImplThread impl(task_runner_provider_); | 198 DebugScopedSetImplThread impl(task_runner_provider_); |
208 | 199 |
209 // This CapturePostTasks should be destroyed before CommitComplete() is | 200 // This CapturePostTasks should be destroyed before CommitComplete() is |
210 // called since that goes out to the embedder, and we want the embedder | 201 // called since that goes out to the embedder, and we want the embedder |
211 // to receive its callbacks before that. | 202 // to receive its callbacks before that. |
212 commit_blocking_task_runner_.reset(new BlockingTaskRunner::CapturePostTasks( | 203 commit_blocking_task_runner_.reset(new BlockingTaskRunner::CapturePostTasks( |
213 task_runner_provider_->blocking_main_thread_task_runner())); | 204 task_runner_provider_->blocking_main_thread_task_runner())); |
214 | 205 |
215 layer_tree_host_impl_->ReadyToCommit(); | 206 layer_tree_host_impl_->ReadyToCommit(); |
216 layer_tree_host_impl_->BeginCommit(); | 207 layer_tree_host_impl_->BeginCommit(); |
217 | 208 |
218 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
219 // is fixed. | |
220 tracked_objects::ScopedTracker tracking_profile6( | |
221 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
222 "461509 SingleThreadProxy::DoCommit6")); | |
223 if (layer_tree_host_impl_->EvictedUIResourcesExist()) | 209 if (layer_tree_host_impl_->EvictedUIResourcesExist()) |
224 layer_tree_host_->RecreateUIResources(); | 210 layer_tree_host_->RecreateUIResources(); |
225 | 211 |
226 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
227 // is fixed. | |
228 tracked_objects::ScopedTracker tracking_profile7( | |
229 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
230 "461509 SingleThreadProxy::DoCommit7")); | |
231 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); | 212 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); |
232 | 213 |
233 if (scheduler_on_impl_thread_) | 214 if (scheduler_on_impl_thread_) |
234 scheduler_on_impl_thread_->DidCommit(); | 215 scheduler_on_impl_thread_->DidCommit(); |
235 | 216 |
236 layer_tree_host_impl_->CommitComplete(); | 217 layer_tree_host_impl_->CommitComplete(); |
237 | 218 |
238 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
239 // is fixed. | |
240 tracked_objects::ScopedTracker tracking_profile8( | |
241 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
242 "461509 SingleThreadProxy::DoCommit8")); | |
243 // Commit goes directly to the active tree, but we need to synchronously | 219 // Commit goes directly to the active tree, but we need to synchronously |
244 // "activate" the tree still during commit to satisfy any potential | 220 // "activate" the tree still during commit to satisfy any potential |
245 // SetNextCommitWaitsForActivation calls. Unfortunately, the tree | 221 // SetNextCommitWaitsForActivation calls. Unfortunately, the tree |
246 // might not be ready to draw, so DidActivateSyncTree must set | 222 // might not be ready to draw, so DidActivateSyncTree must set |
247 // the flag to force the tree to not draw until textures are ready. | 223 // the flag to force the tree to not draw until textures are ready. |
248 NotifyReadyToActivate(); | 224 NotifyReadyToActivate(); |
249 } | 225 } |
250 } | 226 } |
251 | 227 |
252 void SingleThreadProxy::CommitComplete() { | 228 void SingleThreadProxy::CommitComplete() { |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 | 544 |
569 DrawResult SingleThreadProxy::DoComposite(LayerTreeHostImpl::FrameData* frame) { | 545 DrawResult SingleThreadProxy::DoComposite(LayerTreeHostImpl::FrameData* frame) { |
570 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite"); | 546 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite"); |
571 | 547 |
572 DrawResult draw_result; | 548 DrawResult draw_result; |
573 bool draw_frame; | 549 bool draw_frame; |
574 { | 550 { |
575 DebugScopedSetImplThread impl(task_runner_provider_); | 551 DebugScopedSetImplThread impl(task_runner_provider_); |
576 base::AutoReset<bool> mark_inside(&inside_draw_, true); | 552 base::AutoReset<bool> mark_inside(&inside_draw_, true); |
577 | 553 |
578 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
579 // is fixed. | |
580 tracked_objects::ScopedTracker tracking_profile1( | |
581 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
582 "461509 SingleThreadProxy::DoComposite1")); | |
583 | |
584 // We guard PrepareToDraw() with CanDraw() because it always returns a valid | 554 // We guard PrepareToDraw() with CanDraw() because it always returns a valid |
585 // frame, so can only be used when such a frame is possible. Since | 555 // frame, so can only be used when such a frame is possible. Since |
586 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on | 556 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
587 // CanDraw() as well. | 557 // CanDraw() as well. |
588 if (!ShouldComposite()) { | 558 if (!ShouldComposite()) { |
589 return DRAW_ABORTED_CANT_DRAW; | 559 return DRAW_ABORTED_CANT_DRAW; |
590 } | 560 } |
591 | 561 |
592 // This CapturePostTasks should be destroyed before | 562 // This CapturePostTasks should be destroyed before |
593 // DidCommitAndDrawFrame() is called since that goes out to the | 563 // DidCommitAndDrawFrame() is called since that goes out to the |
594 // embedder, and we want the embedder to receive its callbacks before that. | 564 // embedder, and we want the embedder to receive its callbacks before that. |
595 // NOTE: This maintains consistent ordering with the ThreadProxy since | 565 // NOTE: This maintains consistent ordering with the ThreadProxy since |
596 // the DidCommitAndDrawFrame() must be post-tasked from the impl thread | 566 // the DidCommitAndDrawFrame() must be post-tasked from the impl thread |
597 // there as the main thread is not blocked, so any posted tasks inside | 567 // there as the main thread is not blocked, so any posted tasks inside |
598 // the swap buffers will execute first. | 568 // the swap buffers will execute first. |
599 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); | 569 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); |
600 BlockingTaskRunner::CapturePostTasks blocked( | 570 BlockingTaskRunner::CapturePostTasks blocked( |
601 task_runner_provider_->blocking_main_thread_task_runner()); | 571 task_runner_provider_->blocking_main_thread_task_runner()); |
602 | 572 |
603 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
604 // is fixed. | |
605 tracked_objects::ScopedTracker tracking_profile2( | |
606 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
607 "461509 SingleThreadProxy::DoComposite2")); | |
608 draw_result = layer_tree_host_impl_->PrepareToDraw(frame); | 573 draw_result = layer_tree_host_impl_->PrepareToDraw(frame); |
609 draw_frame = draw_result == DRAW_SUCCESS; | 574 draw_frame = draw_result == DRAW_SUCCESS; |
610 if (draw_frame) { | 575 if (draw_frame) { |
611 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
612 // is fixed. | |
613 tracked_objects::ScopedTracker tracking_profile3( | |
614 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
615 "461509 SingleThreadProxy::DoComposite3")); | |
616 layer_tree_host_impl_->DrawLayers(frame); | 576 layer_tree_host_impl_->DrawLayers(frame); |
617 | |
618 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
619 // is fixed. | |
620 tracked_objects::ScopedTracker tracking_profile8( | |
621 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
622 "461509 SingleThreadProxy::DoComposite8")); | |
623 if (layer_tree_host_impl_->SwapBuffers(*frame)) { | 577 if (layer_tree_host_impl_->SwapBuffers(*frame)) { |
624 if (scheduler_on_impl_thread_) | 578 if (scheduler_on_impl_thread_) |
625 scheduler_on_impl_thread_->DidSwapBuffers(); | 579 scheduler_on_impl_thread_->DidSwapBuffers(); |
626 client_->DidPostSwapBuffers(); | 580 client_->DidPostSwapBuffers(); |
627 } | 581 } |
628 } | 582 } |
629 | |
630 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
631 // is fixed. | |
632 tracked_objects::ScopedTracker tracking_profile4( | |
633 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
634 "461509 SingleThreadProxy::DoComposite4")); | |
635 layer_tree_host_impl_->DidDrawAllLayers(*frame); | 583 layer_tree_host_impl_->DidDrawAllLayers(*frame); |
636 | 584 |
637 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | |
638 // is fixed. | |
639 tracked_objects::ScopedTracker tracking_profile5( | |
640 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
641 "461509 SingleThreadProxy::DoComposite5")); | |
642 bool start_ready_animations = draw_frame; | 585 bool start_ready_animations = draw_frame; |
643 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); | 586 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
644 } | 587 } |
645 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 is | |
646 // fixed. | |
647 tracked_objects::ScopedTracker tracking_profile9( | |
648 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
649 "461509 SingleThreadProxy::DoComposite9")); | |
650 DidCommitAndDrawFrame(); | 588 DidCommitAndDrawFrame(); |
651 | 589 |
652 return draw_result; | 590 return draw_result; |
653 } | 591 } |
654 | 592 |
655 void SingleThreadProxy::DidCommitAndDrawFrame() { | 593 void SingleThreadProxy::DidCommitAndDrawFrame() { |
656 if (next_frame_is_newly_committed_frame_) { | 594 if (next_frame_is_newly_committed_frame_) { |
657 DebugScopedSetMainThread main(task_runner_provider_); | 595 DebugScopedSetMainThread main(task_runner_provider_); |
658 next_frame_is_newly_committed_frame_ = false; | 596 next_frame_is_newly_committed_frame_ = false; |
659 layer_tree_host_->DidCommitAndDrawFrame(); | 597 layer_tree_host_->DidCommitAndDrawFrame(); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 void SingleThreadProxy::DidFinishImplFrame() { | 767 void SingleThreadProxy::DidFinishImplFrame() { |
830 layer_tree_host_impl_->DidFinishImplFrame(); | 768 layer_tree_host_impl_->DidFinishImplFrame(); |
831 #if DCHECK_IS_ON() | 769 #if DCHECK_IS_ON() |
832 DCHECK(inside_impl_frame_) | 770 DCHECK(inside_impl_frame_) |
833 << "DidFinishImplFrame called while not inside an impl frame!"; | 771 << "DidFinishImplFrame called while not inside an impl frame!"; |
834 inside_impl_frame_ = false; | 772 inside_impl_frame_ = false; |
835 #endif | 773 #endif |
836 } | 774 } |
837 | 775 |
838 } // namespace cc | 776 } // namespace cc |
OLD | NEW |