Index: cc/trees/single_thread_proxy.cc |
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc |
index 1af657a3d0ead51ef2076e2a3133121699e800f1..f15c7ec269256105167466e691e5d94d306d60a4 100644 |
--- a/cc/trees/single_thread_proxy.cc |
+++ b/cc/trees/single_thread_proxy.cc |
@@ -23,15 +23,20 @@ namespace cc { |
scoped_ptr<Proxy> SingleThreadProxy::Create( |
LayerTreeHost* layer_tree_host, |
LayerTreeHostSingleThreadClient* client, |
- scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) { |
- return make_scoped_ptr( |
- new SingleThreadProxy(layer_tree_host, client, main_task_runner)); |
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
+ return make_scoped_ptr(new SingleThreadProxy( |
+ layer_tree_host, |
+ client, |
+ main_task_runner, |
+ external_begin_frame_source.Pass())); |
} |
SingleThreadProxy::SingleThreadProxy( |
LayerTreeHost* layer_tree_host, |
LayerTreeHostSingleThreadClient* client, |
- scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) |
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source) |
: Proxy(main_task_runner, NULL), |
layer_tree_host_(layer_tree_host), |
client_(client), |
@@ -43,6 +48,7 @@ SingleThreadProxy::SingleThreadProxy( |
commit_requested_(false), |
inside_synchronous_composite_(false), |
output_surface_creation_requested_(false), |
+ external_begin_frame_source_(external_begin_frame_source.Pass()), |
weak_factory_(this) { |
TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); |
DCHECK(Proxy::IsMainThread()); |
@@ -84,11 +90,13 @@ void SingleThreadProxy::SetLayerTreeHostClientReady() { |
if (layer_tree_host_->settings().single_thread_proxy_scheduler && |
!scheduler_on_impl_thread_) { |
SchedulerSettings scheduler_settings(layer_tree_host_->settings()); |
- scheduler_on_impl_thread_ = Scheduler::Create(this, |
- scheduler_settings, |
- layer_tree_host_->id(), |
- MainThreadTaskRunner(), |
- base::PowerMonitor::Get()); |
+ scheduler_on_impl_thread_ = |
+ Scheduler::Create(this, |
+ scheduler_settings, |
+ layer_tree_host_->id(), |
+ MainThreadTaskRunner(), |
+ base::PowerMonitor::Get(), |
+ external_begin_frame_source_.Pass()); |
scheduler_on_impl_thread_->SetCanStart(); |
scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible()); |
} |
@@ -101,7 +109,6 @@ void SingleThreadProxy::SetVisible(bool visible) { |
if (scheduler_on_impl_thread_) |
scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible()); |
// Changing visibility could change ShouldComposite(). |
- UpdateBackgroundAnimateTicking(); |
} |
void SingleThreadProxy::RequestNewOutputSurface() { |
@@ -161,6 +168,24 @@ void SingleThreadProxy::SetNeedsUpdateLayers() { |
SetNeedsCommit(); |
} |
+void SingleThreadProxy::DoAnimate() { |
+ // Don't animate if there is no root layer. |
+ // TODO(mithro): Both Animate and UpdateAnimationState already have a |
+ // "!active_tree_->root_layer()" check? |
+ if (!layer_tree_host_impl_->active_tree()->root_layer()) { |
+ return; |
+ } |
+ |
+ layer_tree_host_impl_->Animate( |
+ layer_tree_host_impl_->CurrentBeginFrameArgs().frame_time); |
+ |
+ // If animations are not visible, update the animation state now as it |
+ // won't happen in DoComposite. |
+ if (!layer_tree_host_impl_->AnimationsAreVisible()) { |
+ layer_tree_host_impl_->UpdateAnimationState(true); |
+ } |
+} |
+ |
void SingleThreadProxy::DoCommit() { |
TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit"); |
DCHECK(Proxy::IsMainThread()); |
@@ -202,8 +227,6 @@ void SingleThreadProxy::DoCommit() { |
layer_tree_host_impl_->CommitComplete(); |
- UpdateBackgroundAnimateTicking(); |
- |
#if DCHECK_IS_ON |
// In the single-threaded case, the scale and scroll deltas should never be |
// touched on the impl layer tree. |
@@ -212,12 +235,6 @@ void SingleThreadProxy::DoCommit() { |
DCHECK(!scroll_info->scrolls.size()); |
DCHECK_EQ(1.f, scroll_info->page_scale_delta); |
#endif |
- |
- RenderingStatsInstrumentation* stats_instrumentation = |
- layer_tree_host_->rendering_stats_instrumentation(); |
- benchmark_instrumentation::IssueMainThreadRenderingStatsEvent( |
- stats_instrumentation->main_thread_rendering_stats()); |
- stats_instrumentation->AccumulateAndClearMainThreadStats(); |
} |
if (layer_tree_host_->settings().impl_side_painting) { |
@@ -328,7 +345,6 @@ void SingleThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
TRACE_EVENT1( |
"cc", "SingleThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); |
DCHECK(Proxy::IsImplThread()); |
- UpdateBackgroundAnimateTicking(); |
if (scheduler_on_impl_thread_) |
scheduler_on_impl_thread_->SetCanDraw(can_draw); |
} |
@@ -340,6 +356,9 @@ void SingleThreadProxy::NotifyReadyToActivate() { |
scheduler_on_impl_thread_->NotifyReadyToActivate(); |
} |
+void SingleThreadProxy::NotifyReadyToDraw() { |
+} |
+ |
void SingleThreadProxy::SetNeedsRedrawOnImplThread() { |
client_->ScheduleComposite(); |
if (scheduler_on_impl_thread_) |
@@ -347,7 +366,9 @@ void SingleThreadProxy::SetNeedsRedrawOnImplThread() { |
} |
void SingleThreadProxy::SetNeedsAnimateOnImplThread() { |
- SetNeedsRedrawOnImplThread(); |
+ client_->ScheduleComposite(); |
+ if (scheduler_on_impl_thread_) |
+ scheduler_on_impl_thread_->SetNeedsAnimate(); |
} |
void SingleThreadProxy::SetNeedsManageTilesOnImplThread() { |
@@ -420,7 +441,6 @@ void SingleThreadProxy::DidActivateSyncTree() { |
weak_factory_.GetWeakPtr())); |
} |
- UpdateBackgroundAnimateTicking(); |
timing_history_.DidActivateSyncTree(); |
} |
@@ -498,6 +518,8 @@ void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
layer_tree_host_impl_->SynchronouslyInitializeAllTiles(); |
} |
+ DoAnimate(); |
+ |
LayerTreeHostImpl::FrameData frame; |
DoComposite(frame_begin_time, &frame); |
@@ -539,12 +561,6 @@ bool SingleThreadProxy::ShouldComposite() const { |
layer_tree_host_impl_->CanDraw(); |
} |
-void SingleThreadProxy::UpdateBackgroundAnimateTicking() { |
- DCHECK(Proxy::IsImplThread()); |
- layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
- !ShouldComposite() && layer_tree_host_impl_->active_tree()->root_layer()); |
-} |
- |
void SingleThreadProxy::ScheduleRequestNewOutputSurface() { |
if (output_surface_creation_callback_.IsCancelled() && |
!output_surface_creation_requested_) { |
@@ -572,16 +588,11 @@ DrawResult SingleThreadProxy::DoComposite(base::TimeTicks frame_begin_time, |
// DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
// CanDraw() as well. |
if (!ShouldComposite()) { |
- UpdateBackgroundAnimateTicking(); |
return DRAW_ABORTED_CANT_DRAW; |
} |
timing_history_.DidStartDrawing(); |
- layer_tree_host_impl_->Animate( |
- layer_tree_host_impl_->CurrentBeginFrameArgs().frame_time); |
- UpdateBackgroundAnimateTicking(); |
- |
draw_result = layer_tree_host_impl_->PrepareToDraw(frame); |
draw_frame = draw_result == DRAW_SUCCESS; |
if (draw_frame) |
@@ -629,10 +640,6 @@ bool SingleThreadProxy::MainFrameWillHappenForTesting() { |
return false; |
} |
-BeginFrameSource* SingleThreadProxy::ExternalBeginFrameSource() { |
- return layer_tree_host_impl_.get(); |
-} |
- |
void SingleThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) { |
layer_tree_host_impl_->WillBeginImplFrame(args); |
} |
@@ -742,8 +749,8 @@ void SingleThreadProxy::ScheduledActionCommit() { |
void SingleThreadProxy::ScheduledActionAnimate() { |
TRACE_EVENT0("cc", "ScheduledActionAnimate"); |
- layer_tree_host_impl_->Animate( |
- layer_tree_host_impl_->CurrentBeginFrameArgs().frame_time); |
+ DebugScopedSetImplThread impl(this); |
+ DoAnimate(); |
} |
void SingleThreadProxy::ScheduledActionUpdateVisibleTiles() { |