Index: content/browser/compositor/gpu_vsync_begin_frame_source.cc |
diff --git a/content/browser/compositor/gpu_vsync_begin_frame_source.cc b/content/browser/compositor/gpu_vsync_begin_frame_source.cc |
index 7e43be479adc6b1ff83bc7337b8cf60b29b15855..e4f039a782e5d99eb0121fd177d3b9d23dc6ffcb 100644 |
--- a/content/browser/compositor/gpu_vsync_begin_frame_source.cc |
+++ b/content/browser/compositor/gpu_vsync_begin_frame_source.cc |
@@ -22,7 +22,7 @@ void GpuVSyncBeginFrameSource::OnVSync(base::TimeTicks timestamp, |
if (!needs_begin_frames_) |
return; |
- base::TimeTicks now = base::TimeTicks::Now(); |
+ base::TimeTicks now = Now(); |
base::TimeTicks deadline = now.SnappedToNextTick(timestamp, interval); |
TRACE_EVENT1("cc", "GpuVSyncBeginFrameSource::OnVSync", "latency", |
@@ -39,4 +39,43 @@ void GpuVSyncBeginFrameSource::OnNeedsBeginFrames(bool needs_begin_frames) { |
vsync_control_->SetNeedsVSync(needs_begin_frames); |
} |
+base::TimeTicks GpuVSyncBeginFrameSource::Now() const { |
+ return base::TimeTicks::Now(); |
+} |
+ |
+cc::BeginFrameArgs GpuVSyncBeginFrameSource::GetMissedBeginFrameArgs( |
+ cc::BeginFrameObserver* obs) { |
+ if (!last_begin_frame_args_.IsValid()) |
+ return cc::BeginFrameArgs(); |
+ |
+ base::TimeTicks now = Now(); |
+ base::TimeTicks estimated_next_timestamp = now.SnappedToNextTick( |
+ last_begin_frame_args_.frame_time, last_begin_frame_args_.interval); |
+ base::TimeTicks missed_timestamp = |
+ estimated_next_timestamp - last_begin_frame_args_.interval; |
+ |
+ if (missed_timestamp > last_begin_frame_args_.frame_time) { |
+ // The projected missed timestamp is newer than the last known timestamp. |
+ // In this case create BeginFrameArgs with a new sequence number. |
+ next_sequence_number_++; |
+ last_begin_frame_args_ = cc::BeginFrameArgs::Create( |
+ BEGINFRAME_FROM_HERE, source_id(), next_sequence_number_, |
+ missed_timestamp, estimated_next_timestamp, |
+ last_begin_frame_args_.interval, cc::BeginFrameArgs::MISSED); |
+ return last_begin_frame_args_; |
+ } |
+ |
+ // The last known args object is up-to-date. Skip sending notification |
+ // if the observer has already seen it. |
+ const cc::BeginFrameArgs& last_observer_args = obs->LastUsedBeginFrameArgs(); |
+ if (last_observer_args.IsValid() && |
+ last_begin_frame_args_.frame_time <= last_observer_args.frame_time) { |
+ return cc::BeginFrameArgs(); |
+ } |
+ |
+ cc::BeginFrameArgs missed_args = last_begin_frame_args_; |
+ missed_args.type = cc::BeginFrameArgs::MISSED; |
+ return missed_args; |
+} |
+ |
} // namespace content |