Index: cc/trees/single_thread_proxy.cc |
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc |
index c25ed4d1dbb6d5f48337e29594a8044f09eab369..b9f6a4849131dfa14431b6f7a0b48dd4fe81fab9 100644 |
--- a/cc/trees/single_thread_proxy.cc |
+++ b/cc/trees/single_thread_proxy.cc |
@@ -50,11 +50,21 @@ 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()); |
DCHECK(layer_tree_host); |
+ |
+ if (layer_tree_host->settings().single_thread_proxy_scheduler && |
+ !scheduler_on_impl_thread_) { |
+ SchedulerSettings scheduler_settings( |
+ layer_tree_host->settings().ToSchedulerSettings()); |
+ // SingleThreadProxy should run in main thread low latency mode. |
+ scheduler_settings.main_thread_should_always_be_low_latency = true; |
+ scheduler_on_impl_thread_ = Scheduler::Create( |
+ this, scheduler_settings, layer_tree_host_->id(), |
+ MainThreadTaskRunner(), external_begin_frame_source.Pass()); |
+ } |
} |
void SingleThreadProxy::Start() { |
@@ -95,18 +105,7 @@ void SingleThreadProxy::SetLayerTreeHostClientReady() { |
// nothing to do. |
DCHECK(Proxy::IsMainThread()); |
DebugScopedSetImplThread impl(this); |
- if (layer_tree_host_->settings().single_thread_proxy_scheduler && |
- !scheduler_on_impl_thread_) { |
- SchedulerSettings scheduler_settings( |
- layer_tree_host_->settings().ToSchedulerSettings()); |
- // SingleThreadProxy should run in main thread low latency mode. |
- scheduler_settings.main_thread_should_always_be_low_latency = true; |
- scheduler_on_impl_thread_ = |
- Scheduler::Create(this, |
- scheduler_settings, |
- layer_tree_host_->id(), |
- MainThreadTaskRunner(), |
- external_begin_frame_source_.Pass()); |
+ if (scheduler_on_impl_thread_) { |
scheduler_on_impl_thread_->SetCanStart(); |
scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible()); |
} |
@@ -214,7 +213,6 @@ void SingleThreadProxy::DoCommit() { |
// fixed. |
tracked_objects::ScopedTracker tracking_profile1( |
FROM_HERE_WITH_EXPLICIT_FUNCTION("461509 SingleThreadProxy::DoCommit1")); |
- commit_requested_ = false; |
layer_tree_host_->WillCommit(); |
devtools_instrumentation::ScopedCommitTrace commit_task( |
layer_tree_host_->id()); |
@@ -334,8 +332,10 @@ void SingleThreadProxy::CommitComplete() { |
void SingleThreadProxy::SetNeedsCommit() { |
DCHECK(Proxy::IsMainThread()); |
- DebugScopedSetImplThread impl(this); |
client_->ScheduleComposite(); |
+ if (commit_requested_) |
+ return; |
+ DebugScopedSetImplThread impl(this); |
if (scheduler_on_impl_thread_) |
scheduler_on_impl_thread_->SetNeedsCommit(); |
commit_requested_ = true; |
@@ -766,7 +766,11 @@ void SingleThreadProxy::DidCommitAndDrawFrame() { |
} |
bool SingleThreadProxy::MainFrameWillHappenForTesting() { |
- return false; |
+ if (layer_tree_host_->output_surface_lost()) |
+ return false; |
+ if (!scheduler_on_impl_thread_) |
+ return false; |
+ return scheduler_on_impl_thread_->MainFrameForTestingWillHappen(); |
} |
void SingleThreadProxy::SetChildrenNeedBeginFrames( |
@@ -804,6 +808,8 @@ void SingleThreadProxy::SendBeginMainFrameNotExpectedSoon() { |
} |
void SingleThreadProxy::BeginMainFrame() { |
+ commit_requested_ = false; |
+ |
if (defer_commits_) { |
TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit", |
TRACE_EVENT_SCOPE_THREAD); |
@@ -831,6 +837,9 @@ void SingleThreadProxy::BeginMainFrame() { |
return; |
} |
+ // Prevent new commits from being requested inside DoBeginMainFrame. |
+ commit_requested_ = true; |
+ |
const BeginFrameArgs& begin_frame_args = |
layer_tree_host_impl_->CurrentBeginFrameArgs(); |
DoBeginMainFrame(begin_frame_args); |
@@ -855,6 +864,9 @@ void SingleThreadProxy::DoBeginMainFrame( |
DCHECK(!queue_for_commit_); |
queue_for_commit_ = make_scoped_ptr(new ResourceUpdateQueue); |
+ // New commits requested inside UpdateLayers should be respected. |
+ commit_requested_ = false; |
+ |
layer_tree_host_->UpdateLayers(queue_for_commit_.get()); |
timing_history_.DidBeginMainFrame(); |