Index: cc/trees/single_thread_proxy.cc |
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc |
index 27350291ec21f220d2c07b2b2c546c932817ce4e..7cc96e500836bbc5620a8569adeb8a592917c488 100644 |
--- a/cc/trees/single_thread_proxy.cc |
+++ b/cc/trees/single_thread_proxy.cc |
@@ -57,7 +57,7 @@ SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layer_tree_host, |
void SingleThreadProxy::Start( |
scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
DebugScopedSetImplThread impl(task_runner_provider_); |
- external_begin_frame_source_ = std::move(external_begin_frame_source); |
+ begin_frame_source_ = std::move(external_begin_frame_source); |
if (layer_tree_host_->settings().single_thread_proxy_scheduler && |
!scheduler_on_impl_thread_) { |
@@ -71,11 +71,23 @@ void SingleThreadProxy::Start( |
CompositorTimingHistory::BROWSER_UMA, |
layer_tree_host_->rendering_stats_instrumentation())); |
+ if (!scheduler_settings.throttle_frame_production) { |
+ // Unthrottled source takes precedence over external sources. |
+ begin_frame_source_ = BackToBackBeginFrameSource::Create( |
+ task_runner_provider_->MainThreadTaskRunner()); |
+ } |
+ BeginFrameSource* frame_source = begin_frame_source_.get(); |
+ if (!frame_source) { |
+ synthetic_frame_source_ = SyntheticBeginFrameSource::Create( |
+ task_runner_provider_->MainThreadTaskRunner(), |
+ BeginFrameArgs::DefaultInterval()); |
+ frame_source = synthetic_frame_source_.get(); |
+ } |
+ |
scheduler_on_impl_thread_ = |
Scheduler::Create(this, scheduler_settings, layer_tree_host_->id(), |
task_runner_provider_->MainThreadTaskRunner(), |
- external_begin_frame_source_.get(), |
- std::move(compositor_timing_history)); |
+ frame_source, std::move(compositor_timing_history)); |
} |
layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); |
@@ -463,8 +475,17 @@ void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() { |
void SingleThreadProxy::CommitVSyncParameters(base::TimeTicks timebase, |
base::TimeDelta interval) { |
- if (scheduler_on_impl_thread_) |
- scheduler_on_impl_thread_->CommitVSyncParameters(timebase, interval); |
+ if (authoritative_vsync_interval_ != base::TimeDelta()) { |
+ interval = authoritative_vsync_interval_; |
+ } else if (interval == base::TimeDelta()) { |
+ // TODO(brianderson): We should not be receiving 0 intervals. |
+ interval = BeginFrameArgs::DefaultInterval(); |
+ } |
+ |
+ last_vsync_timebase_ = timebase; |
+ |
+ if (synthetic_frame_source_) |
+ synthetic_frame_source_->OnUpdateVSyncParameters(timebase, interval); |
} |
void SingleThreadProxy::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
@@ -699,7 +720,11 @@ void SingleThreadProxy::SetChildrenNeedBeginFrames( |
void SingleThreadProxy::SetAuthoritativeVSyncInterval( |
const base::TimeDelta& interval) { |
- scheduler_on_impl_thread_->SetAuthoritativeVSyncInterval(interval); |
+ authoritative_vsync_interval_ = interval; |
+ if (synthetic_frame_source_) { |
+ synthetic_frame_source_->OnUpdateVSyncParameters(last_vsync_timebase_, |
+ interval); |
+ } |
} |
void SingleThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) { |