| 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
|
|
|