Index: cc/scheduler/scheduler.cc |
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
index 68214cd96b762f5ba0c96581f6ba0c0fb00c1a38..9fcf7b8eb9cf3a9fcac7c7cc49aeaeafa572fc9d 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), |
@@ -148,9 +150,14 @@ base::TimeTicks Scheduler::Now() const { |
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); |
@@ -431,6 +438,12 @@ void Scheduler::SetChildrenNeedBeginFrames(bool 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() { |