| 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/profiler/scoped_tracker.h" | 8 #include "base/profiler/scoped_tracker.h" |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "cc/debug/benchmark_instrumentation.h" | 10 #include "cc/debug/benchmark_instrumentation.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 } | 35 } |
| 36 | 36 |
| 37 SingleThreadProxy::SingleThreadProxy( | 37 SingleThreadProxy::SingleThreadProxy( |
| 38 LayerTreeHost* layer_tree_host, | 38 LayerTreeHost* layer_tree_host, |
| 39 LayerTreeHostSingleThreadClient* client, | 39 LayerTreeHostSingleThreadClient* client, |
| 40 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 40 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| 41 scoped_ptr<BeginFrameSource> external_begin_frame_source) | 41 scoped_ptr<BeginFrameSource> external_begin_frame_source) |
| 42 : Proxy(main_task_runner, NULL), | 42 : Proxy(main_task_runner, NULL), |
| 43 layer_tree_host_(layer_tree_host), | 43 layer_tree_host_(layer_tree_host), |
| 44 client_(client), | 44 client_(client), |
| 45 timing_history_(layer_tree_host->rendering_stats_instrumentation()), | |
| 46 next_frame_is_newly_committed_frame_(false), | 45 next_frame_is_newly_committed_frame_(false), |
| 47 #if DCHECK_IS_ON() | 46 #if DCHECK_IS_ON() |
| 48 inside_impl_frame_(false), | 47 inside_impl_frame_(false), |
| 49 #endif | 48 #endif |
| 50 inside_draw_(false), | 49 inside_draw_(false), |
| 51 defer_commits_(false), | 50 defer_commits_(false), |
| 52 animate_requested_(false), | 51 animate_requested_(false), |
| 53 commit_requested_(false), | 52 commit_requested_(false), |
| 54 inside_synchronous_composite_(false), | 53 inside_synchronous_composite_(false), |
| 55 output_surface_creation_requested_(false), | 54 output_surface_creation_requested_(false), |
| 56 weak_factory_(this) { | 55 weak_factory_(this) { |
| 57 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); | 56 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); |
| 58 DCHECK(Proxy::IsMainThread()); | 57 DCHECK(Proxy::IsMainThread()); |
| 59 DCHECK(layer_tree_host); | 58 DCHECK(layer_tree_host); |
| 60 | 59 |
| 61 if (layer_tree_host->settings().single_thread_proxy_scheduler && | 60 if (layer_tree_host->settings().single_thread_proxy_scheduler && |
| 62 !scheduler_on_impl_thread_) { | 61 !scheduler_on_impl_thread_) { |
| 63 SchedulerSettings scheduler_settings( | 62 SchedulerSettings scheduler_settings( |
| 64 layer_tree_host->settings().ToSchedulerSettings()); | 63 layer_tree_host->settings().ToSchedulerSettings()); |
| 65 // SingleThreadProxy should run in main thread low latency mode. | 64 // SingleThreadProxy should run in main thread low latency mode. |
| 66 scheduler_settings.main_thread_should_always_be_low_latency = true; | 65 scheduler_settings.main_thread_should_always_be_low_latency = true; |
| 67 scheduler_on_impl_thread_ = Scheduler::Create( | 66 scheduler_on_impl_thread_ = Scheduler::Create( |
| 68 this, scheduler_settings, layer_tree_host_->id(), | 67 this, scheduler_settings, layer_tree_host_->id(), |
| 69 MainThreadTaskRunner(), external_begin_frame_source.Pass()); | 68 MainThreadTaskRunner(), external_begin_frame_source.Pass(), |
| 69 layer_tree_host->rendering_stats_instrumentation()); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 | 72 |
| 73 void SingleThreadProxy::Start() { | 73 void SingleThreadProxy::Start() { |
| 74 DebugScopedSetImplThread impl(this); | 74 DebugScopedSetImplThread impl(this); |
| 75 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); | 75 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); |
| 76 } | 76 } |
| 77 | 77 |
| 78 SingleThreadProxy::~SingleThreadProxy() { | 78 SingleThreadProxy::~SingleThreadProxy() { |
| 79 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy"); | 79 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy"); |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 CommitComplete(); | 318 CommitComplete(); |
| 319 } | 319 } |
| 320 } | 320 } |
| 321 } | 321 } |
| 322 | 322 |
| 323 void SingleThreadProxy::CommitComplete() { | 323 void SingleThreadProxy::CommitComplete() { |
| 324 DCHECK(!layer_tree_host_impl_->pending_tree()) | 324 DCHECK(!layer_tree_host_impl_->pending_tree()) |
| 325 << "Activation is expected to have synchronously occurred by now."; | 325 << "Activation is expected to have synchronously occurred by now."; |
| 326 DCHECK(commit_blocking_task_runner_); | 326 DCHECK(commit_blocking_task_runner_); |
| 327 | 327 |
| 328 if (scheduler_on_impl_thread_) |
| 329 scheduler_on_impl_thread_->DidCommit(); |
| 330 |
| 328 // Notify commit complete on the impl side after activate to satisfy any | 331 // Notify commit complete on the impl side after activate to satisfy any |
| 329 // SetNextCommitWaitsForActivation calls. | 332 // SetNextCommitWaitsForActivation calls. |
| 330 layer_tree_host_impl_->CommitComplete(); | 333 layer_tree_host_impl_->CommitComplete(); |
| 331 | 334 |
| 332 DebugScopedSetMainThread main(this); | 335 DebugScopedSetMainThread main(this); |
| 333 commit_blocking_task_runner_.reset(); | 336 commit_blocking_task_runner_.reset(); |
| 334 layer_tree_host_->CommitComplete(); | 337 layer_tree_host_->CommitComplete(); |
| 335 layer_tree_host_->DidBeginMainFrame(); | 338 layer_tree_host_->DidBeginMainFrame(); |
| 336 timing_history_.DidCommit(); | |
| 337 | 339 |
| 338 next_frame_is_newly_committed_frame_ = true; | 340 next_frame_is_newly_committed_frame_ = true; |
| 339 } | 341 } |
| 340 | 342 |
| 341 void SingleThreadProxy::SetNeedsCommit() { | 343 void SingleThreadProxy::SetNeedsCommit() { |
| 342 DCHECK(Proxy::IsMainThread()); | 344 DCHECK(Proxy::IsMainThread()); |
| 343 client_->ScheduleComposite(); | 345 client_->ScheduleComposite(); |
| 344 if (commit_requested_) | 346 if (commit_requested_) |
| 345 return; | 347 return; |
| 346 commit_requested_ = true; | 348 commit_requested_ = true; |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 // This is required because NotifyReadyToActivate gets called immediately | 511 // This is required because NotifyReadyToActivate gets called immediately |
| 510 // after commit since single thread commits directly to the active tree. | 512 // after commit since single thread commits directly to the active tree. |
| 511 if (scheduler_on_impl_thread_) | 513 if (scheduler_on_impl_thread_) |
| 512 scheduler_on_impl_thread_->SetWaitForReadyToDraw(); | 514 scheduler_on_impl_thread_->SetWaitForReadyToDraw(); |
| 513 | 515 |
| 514 // Synchronously call to CommitComplete. Resetting | 516 // Synchronously call to CommitComplete. Resetting |
| 515 // |commit_blocking_task_runner| would make sure all tasks posted during | 517 // |commit_blocking_task_runner| would make sure all tasks posted during |
| 516 // commit/activation before CommitComplete. | 518 // commit/activation before CommitComplete. |
| 517 CommitComplete(); | 519 CommitComplete(); |
| 518 } | 520 } |
| 521 } |
| 519 | 522 |
| 520 timing_history_.DidActivateSyncTree(); | 523 void SingleThreadProxy::WillPrepareTiles() { |
| 524 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
| 525 DCHECK(Proxy::IsImplThread()); |
| 526 if (scheduler_on_impl_thread_) |
| 527 scheduler_on_impl_thread_->WillPrepareTiles(); |
| 521 } | 528 } |
| 522 | 529 |
| 523 void SingleThreadProxy::DidPrepareTiles() { | 530 void SingleThreadProxy::DidPrepareTiles() { |
| 524 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); | 531 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
| 525 DCHECK(Proxy::IsImplThread()); | 532 DCHECK(Proxy::IsImplThread()); |
| 526 if (scheduler_on_impl_thread_) | 533 if (scheduler_on_impl_thread_) |
| 527 scheduler_on_impl_thread_->DidPrepareTiles(); | 534 scheduler_on_impl_thread_->DidPrepareTiles(); |
| 528 } | 535 } |
| 529 | 536 |
| 530 void SingleThreadProxy::DidCompletePageScaleAnimationOnImplThread() { | 537 void SingleThreadProxy::DidCompletePageScaleAnimationOnImplThread() { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 "461509 SingleThreadProxy::DoComposite1")); | 710 "461509 SingleThreadProxy::DoComposite1")); |
| 704 | 711 |
| 705 // We guard PrepareToDraw() with CanDraw() because it always returns a valid | 712 // We guard PrepareToDraw() with CanDraw() because it always returns a valid |
| 706 // frame, so can only be used when such a frame is possible. Since | 713 // frame, so can only be used when such a frame is possible. Since |
| 707 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on | 714 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
| 708 // CanDraw() as well. | 715 // CanDraw() as well. |
| 709 if (!ShouldComposite()) { | 716 if (!ShouldComposite()) { |
| 710 return DRAW_ABORTED_CANT_DRAW; | 717 return DRAW_ABORTED_CANT_DRAW; |
| 711 } | 718 } |
| 712 | 719 |
| 713 timing_history_.DidStartDrawing(); | |
| 714 | |
| 715 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | 720 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 |
| 716 // is fixed. | 721 // is fixed. |
| 717 tracked_objects::ScopedTracker tracking_profile2( | 722 tracked_objects::ScopedTracker tracking_profile2( |
| 718 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 723 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 719 "461509 SingleThreadProxy::DoComposite2")); | 724 "461509 SingleThreadProxy::DoComposite2")); |
| 720 draw_result = layer_tree_host_impl_->PrepareToDraw(frame); | 725 draw_result = layer_tree_host_impl_->PrepareToDraw(frame); |
| 721 draw_frame = draw_result == DRAW_SUCCESS; | 726 draw_frame = draw_result == DRAW_SUCCESS; |
| 722 if (draw_frame) { | 727 if (draw_frame) { |
| 723 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | 728 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 |
| 724 // is fixed. | 729 // is fixed. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 740 tracked_objects::ScopedTracker tracking_profile5( | 745 tracked_objects::ScopedTracker tracking_profile5( |
| 741 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 746 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 742 "461509 SingleThreadProxy::DoComposite5")); | 747 "461509 SingleThreadProxy::DoComposite5")); |
| 743 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); | 748 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
| 744 | 749 |
| 745 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 | 750 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 |
| 746 // is fixed. | 751 // is fixed. |
| 747 tracked_objects::ScopedTracker tracking_profile7( | 752 tracked_objects::ScopedTracker tracking_profile7( |
| 748 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 753 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 749 "461509 SingleThreadProxy::DoComposite7")); | 754 "461509 SingleThreadProxy::DoComposite7")); |
| 750 timing_history_.DidFinishDrawing(); | |
| 751 } | 755 } |
| 752 | 756 |
| 753 if (draw_frame) { | 757 if (draw_frame) { |
| 754 DebugScopedSetImplThread impl(this); | 758 DebugScopedSetImplThread impl(this); |
| 755 | 759 |
| 756 // This CapturePostTasks should be destroyed before | 760 // This CapturePostTasks should be destroyed before |
| 757 // DidCommitAndDrawFrame() is called since that goes out to the | 761 // DidCommitAndDrawFrame() is called since that goes out to the |
| 758 // embedder, | 762 // embedder, |
| 759 // and we want the embedder to receive its callbacks before that. | 763 // and we want the embedder to receive its callbacks before that. |
| 760 // NOTE: This maintains consistent ordering with the ThreadProxy since | 764 // NOTE: This maintains consistent ordering with the ThreadProxy since |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 } | 903 } |
| 900 | 904 |
| 901 DCHECK(!queue_for_commit_); | 905 DCHECK(!queue_for_commit_); |
| 902 queue_for_commit_ = make_scoped_ptr(new ResourceUpdateQueue); | 906 queue_for_commit_ = make_scoped_ptr(new ResourceUpdateQueue); |
| 903 | 907 |
| 904 // New commits requested inside UpdateLayers should be respected. | 908 // New commits requested inside UpdateLayers should be respected. |
| 905 commit_requested_ = false; | 909 commit_requested_ = false; |
| 906 | 910 |
| 907 layer_tree_host_->UpdateLayers(queue_for_commit_.get()); | 911 layer_tree_host_->UpdateLayers(queue_for_commit_.get()); |
| 908 | 912 |
| 909 timing_history_.DidBeginMainFrame(); | |
| 910 | |
| 911 // TODO(enne): SingleThreadProxy does not support cancelling commits yet, | 913 // TODO(enne): SingleThreadProxy does not support cancelling commits yet, |
| 912 // search for CommitEarlyOutReason::FINISHED_NO_UPDATES inside | 914 // search for CommitEarlyOutReason::FINISHED_NO_UPDATES inside |
| 913 // thread_proxy.cc | 915 // thread_proxy.cc |
| 914 if (scheduler_on_impl_thread_) { | 916 if (scheduler_on_impl_thread_) { |
| 915 scheduler_on_impl_thread_->NotifyBeginMainFrameStarted(); | 917 scheduler_on_impl_thread_->NotifyBeginMainFrameStarted(); |
| 916 scheduler_on_impl_thread_->NotifyReadyToCommit(); | 918 scheduler_on_impl_thread_->NotifyReadyToCommit(); |
| 917 } | 919 } |
| 918 } | 920 } |
| 919 | 921 |
| 920 void SingleThreadProxy::BeginMainFrameAbortedOnImplThread( | 922 void SingleThreadProxy::BeginMainFrameAbortedOnImplThread( |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 layer_tree_host_impl_->PrepareTiles(); | 977 layer_tree_host_impl_->PrepareTiles(); |
| 976 } | 978 } |
| 977 | 979 |
| 978 void SingleThreadProxy::ScheduledActionInvalidateOutputSurface() { | 980 void SingleThreadProxy::ScheduledActionInvalidateOutputSurface() { |
| 979 NOTREACHED(); | 981 NOTREACHED(); |
| 980 } | 982 } |
| 981 | 983 |
| 982 void SingleThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { | 984 void SingleThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { |
| 983 } | 985 } |
| 984 | 986 |
| 985 base::TimeDelta SingleThreadProxy::DrawDurationEstimate() { | |
| 986 return timing_history_.DrawDurationEstimate(); | |
| 987 } | |
| 988 | |
| 989 base::TimeDelta SingleThreadProxy::BeginMainFrameToCommitDurationEstimate() { | |
| 990 return timing_history_.BeginMainFrameToCommitDurationEstimate(); | |
| 991 } | |
| 992 | |
| 993 base::TimeDelta SingleThreadProxy::CommitToActivateDurationEstimate() { | |
| 994 return timing_history_.CommitToActivateDurationEstimate(); | |
| 995 } | |
| 996 | |
| 997 void SingleThreadProxy::DidFinishImplFrame() { | 987 void SingleThreadProxy::DidFinishImplFrame() { |
| 998 layer_tree_host_impl_->DidFinishImplFrame(); | 988 layer_tree_host_impl_->DidFinishImplFrame(); |
| 999 #if DCHECK_IS_ON() | 989 #if DCHECK_IS_ON() |
| 1000 DCHECK(inside_impl_frame_) | 990 DCHECK(inside_impl_frame_) |
| 1001 << "DidFinishImplFrame called while not inside an impl frame!"; | 991 << "DidFinishImplFrame called while not inside an impl frame!"; |
| 1002 inside_impl_frame_ = false; | 992 inside_impl_frame_ = false; |
| 1003 #endif | 993 #endif |
| 1004 } | 994 } |
| 1005 | 995 |
| 1006 void SingleThreadProxy::SendBeginFramesToChildren(const BeginFrameArgs& args) { | 996 void SingleThreadProxy::SendBeginFramesToChildren(const BeginFrameArgs& args) { |
| 1007 layer_tree_host_->SendBeginFramesToChildren(args); | 997 layer_tree_host_->SendBeginFramesToChildren(args); |
| 1008 } | 998 } |
| 1009 | 999 |
| 1010 } // namespace cc | 1000 } // namespace cc |
| OLD | NEW |