Index: components/mus/surfaces/direct_output_surface.cc |
diff --git a/components/mus/surfaces/direct_output_surface.cc b/components/mus/surfaces/direct_output_surface.cc |
index 87009008ad87bd5d87ddb64a81a123c812671620..da6b35e4605d76b3aaee7b83ce7d42e141ea6255 100644 |
--- a/components/mus/surfaces/direct_output_surface.cc |
+++ b/components/mus/surfaces/direct_output_surface.cc |
@@ -16,8 +16,15 @@ |
namespace mus { |
DirectOutputSurface::DirectOutputSurface( |
- const scoped_refptr<cc::ContextProvider>& context_provider) |
- : cc::OutputSurface(context_provider), weak_ptr_factory_(this) {} |
+ scoped_refptr<SurfacesContextProvider> context_provider, |
+ base::SingleThreadTaskRunner* task_runner) |
+ : cc::OutputSurface(context_provider), |
+ synthetic_begin_frame_source_(new cc::SyntheticBeginFrameSource( |
+ task_runner, |
+ cc::BeginFrameArgs::DefaultInterval())), |
+ weak_ptr_factory_(this) { |
+ context_provider->SetDelegate(this); |
+} |
DirectOutputSurface::~DirectOutputSurface() {} |
@@ -25,6 +32,8 @@ bool DirectOutputSurface::BindToClient(cc::OutputSurfaceClient* client) { |
if (!cc::OutputSurface::BindToClient(client)) |
return false; |
+ client->SetBeginFrameSource(synthetic_begin_frame_source_.get()); |
+ |
if (capabilities_.uses_default_gl_framebuffer) { |
capabilities_.flipped_output_surface = |
context_provider()->ContextCapabilities().gpu.flips_vertically; |
@@ -32,6 +41,20 @@ bool DirectOutputSurface::BindToClient(cc::OutputSurfaceClient* client) { |
return true; |
} |
+void DirectOutputSurface::OnVSyncParametersUpdated(int64_t timebase, |
+ int64_t interval) { |
+ auto timebase_time_ticks = base::TimeTicks::FromInternalValue(timebase); |
+ auto interval_time_delta = base::TimeDelta::FromInternalValue(interval); |
+ |
+ if (interval_time_delta.is_zero()) { |
+ // TODO(brianderson): We should not be receiving 0 intervals. |
+ interval_time_delta = cc::BeginFrameArgs::DefaultInterval(); |
+ } |
+ |
+ synthetic_begin_frame_source_->OnUpdateVSyncParameters(timebase_time_ticks, |
+ interval_time_delta); |
+} |
+ |
void DirectOutputSurface::SwapBuffers(cc::CompositorFrame* frame) { |
DCHECK(context_provider_); |
DCHECK(frame->gl_frame_data); |