Index: cc/scheduler/scheduler.cc |
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
index 904a0574515dac727b021f59386a721a0bb2f3c7..7fb1e5967deab82c99d784691febe5e746a3720e 100644 |
--- a/cc/scheduler/scheduler.cc |
+++ b/cc/scheduler/scheduler.cc |
@@ -87,6 +87,8 @@ Scheduler::Scheduler( |
primary_frame_source_internal_(external_begin_frame_source.Pass()), |
background_frame_source_internal_(), |
vsync_observer_(NULL), |
+ authoritative_vsync_interval_(base::TimeDelta()), |
+ last_vsync_timebase_(base::TimeTicks()), |
throttle_frame_production_(scheduler_settings.throttle_frame_production), |
settings_(scheduler_settings), |
client_(client), |
@@ -173,9 +175,14 @@ void Scheduler::OnPowerStateChange(bool on_battery_power) { |
void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, |
base::TimeDelta interval) { |
- // TODO(brianderson): We should not be receiving 0 intervals. |
- if (interval == base::TimeDelta()) |
+ 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 (vsync_observer_) |
vsync_observer_->OnUpdateVSyncParameters(timebase, interval); |
@@ -405,8 +412,7 @@ bool Scheduler::OnBeginFrameMixInDelegate(const BeginFrameArgs& args) { |
TRACE_EVENT1("cc,benchmark", "Scheduler::BeginFrame", "args", args.AsValue()); |
// Deliver BeginFrames to children. |
- if (settings_.forward_begin_frames_to_children && |
- state_machine_.children_need_begin_frames()) { |
+ if (state_machine_.children_need_begin_frames()) { |
BeginFrameArgs adjusted_args_for_children(args); |
// Adjust a deadline for child schedulers. |
// TODO(simonhong): Once we have commitless update, we can get rid of |
@@ -456,11 +462,16 @@ bool Scheduler::OnBeginFrameMixInDelegate(const BeginFrameArgs& args) { |
} |
void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) { |
- DCHECK(settings_.forward_begin_frames_to_children); |
state_machine_.SetChildrenNeedBeginFrames(children_need_begin_frames); |
ProcessScheduledActions(); |
} |
+void Scheduler::SetAuthoritativeVSyncInterval(const base::TimeDelta& interval) { |
+ authoritative_vsync_interval_ = interval; |
+ if (vsync_observer_) |
+ vsync_observer_->OnUpdateVSyncParameters(last_vsync_timebase_, interval); |
+} |
+ |
// BeginRetroFrame is called for BeginFrames that we've deferred because |
// the scheduler was in the middle of processing a previous BeginFrame. |
void Scheduler::BeginRetroFrame() { |