Index: cc/scheduler/scheduler.cc |
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
index 0cce5dc9adc6ea8dd58bd70da3ee6b12645ba1f1..99bd280e1ba0b27edea35adc8f9e860f7b906645 100644 |
--- a/cc/scheduler/scheduler.cc |
+++ b/cc/scheduler/scheduler.cc |
@@ -85,6 +85,7 @@ Scheduler::Scheduler( |
primary_frame_source_internal_(external_begin_frame_source.Pass()), |
background_frame_source_internal_(), |
vsync_observer_(NULL), |
+ authoritative_vsync_interval_(base::TimeDelta()), |
settings_(scheduler_settings), |
client_(client), |
layer_tree_host_id_(layer_tree_host_id), |
@@ -166,12 +167,18 @@ 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()) |
- interval = BeginFrameArgs::DefaultInterval(); |
+ base::TimeDelta vsync_interval; |
+ if (authoritative_vsync_interval_ != base::TimeDelta()) { |
+ vsync_interval = authoritative_vsync_interval_; |
+ } else if (interval == base::TimeDelta()) { |
+ // TODO(brianderson): We should not be receiving 0 intervals. |
+ vsync_interval = BeginFrameArgs::DefaultInterval(); |
+ } else { |
+ vsync_interval = interval; |
+ } |
if (vsync_observer_) |
- vsync_observer_->OnUpdateVSyncParameters(timebase, interval); |
+ vsync_observer_->OnUpdateVSyncParameters(timebase, vsync_interval); |
} |
void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
@@ -449,6 +456,10 @@ void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) { |
DCHECK_EQ(state_machine_.NextAction(), SchedulerStateMachine::ACTION_NONE); |
} |
+void Scheduler::SetAuthoritativeVSyncInterval(base::TimeDelta interval) { |
+ authoritative_vsync_interval_ = 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() { |