Index: content/browser/compositor/gpu_process_transport_factory.cc |
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc |
index 7d1cf0c2d283a6620d1de210bc8fc8348d66ee4d..82cc8a8fcf3a7d0dc0c5c85dd9412fcfe21e4134 100644 |
--- a/content/browser/compositor/gpu_process_transport_factory.cc |
+++ b/content/browser/compositor/gpu_process_transport_factory.cc |
@@ -52,6 +52,7 @@ |
#include "ui/compositor/compositor.h" |
#include "ui/compositor/compositor_constants.h" |
#include "ui/compositor/compositor_switches.h" |
+#include "ui/compositor/compositor_vsync_manager.h" |
#include "ui/compositor/layer.h" |
#include "ui/display/types/display_snapshot.h" |
#include "ui/gfx/geometry/size.h" |
@@ -447,13 +448,16 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
compositor->task_runner().get()))); |
} |
+ BrowserCompositorOutputSurface::UpdateVSyncParametersCallback vsync_callback = |
+ base::Bind(&GpuProcessTransportFactory::UpdateVSyncParametersFromGpu, |
+ base::Unretained(this), compositor); |
+ |
std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface; |
#if defined(ENABLE_VULKAN) |
std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface; |
if (vulkan_context_provider) { |
vulkan_surface.reset(new VulkanBrowserCompositorOutputSurface( |
- vulkan_context_provider, compositor->vsync_manager(), |
- begin_frame_source.get())); |
+ vulkan_context_provider, vsync_callback)); |
if (!vulkan_surface->Initialize(compositor.get()->widget())) { |
vulkan_surface->Destroy(); |
vulkan_surface.reset(); |
@@ -467,8 +471,7 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
if (!create_gpu_output_surface) { |
display_output_surface = |
base::MakeUnique<SoftwareBrowserCompositorOutputSurface>( |
- CreateSoftwareOutputDevice(compositor.get()), |
- compositor->vsync_manager(), begin_frame_source.get(), |
+ CreateSoftwareOutputDevice(compositor.get()), vsync_callback, |
compositor->task_runner()); |
} else { |
DCHECK(context_provider); |
@@ -476,22 +479,20 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
if (data->surface_handle == gpu::kNullSurfaceHandle) { |
display_output_surface = |
base::MakeUnique<OffscreenBrowserCompositorOutputSurface>( |
- context_provider, compositor->vsync_manager(), |
- begin_frame_source.get(), |
+ context_provider, vsync_callback, |
std::unique_ptr< |
display_compositor::CompositorOverlayCandidateValidator>()); |
} else if (capabilities.surfaceless) { |
#if defined(OS_MACOSX) |
display_output_surface = base::MakeUnique<GpuOutputSurfaceMac>( |
compositor->widget(), context_provider, data->surface_handle, |
- compositor->vsync_manager(), begin_frame_source.get(), |
+ vsync_callback, |
CreateOverlayCandidateValidator(compositor->widget()), |
GetGpuMemoryBufferManager()); |
#else |
display_output_surface = |
base::MakeUnique<GpuSurfacelessBrowserCompositorOutputSurface>( |
- context_provider, data->surface_handle, |
- compositor->vsync_manager(), begin_frame_source.get(), |
+ context_provider, data->surface_handle, vsync_callback, |
CreateOverlayCandidateValidator(compositor->widget()), |
GL_TEXTURE_2D, GL_RGB, ui::DisplaySnapshot::PrimaryFormat(), |
GetGpuMemoryBufferManager()); |
@@ -508,8 +509,7 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
if (!use_mus) { |
display_output_surface = |
base::MakeUnique<GpuBrowserCompositorOutputSurface>( |
- context_provider, compositor->vsync_manager(), |
- begin_frame_source.get(), std::move(validator)); |
+ context_provider, vsync_callback, std::move(validator)); |
} else { |
#if defined(USE_AURA) |
if (compositor->window()) { |
@@ -518,8 +518,8 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
display_output_surface = |
base::MakeUnique<MusBrowserCompositorOutputSurface>( |
compositor->window(), context_provider, |
- GetGpuMemoryBufferManager(), compositor->vsync_manager(), |
- begin_frame_source.get(), std::move(validator)); |
+ GetGpuMemoryBufferManager(), vsync_callback, |
+ std::move(validator)); |
} else { |
aura::WindowTreeHost* host = |
aura::WindowTreeHost::GetForAcceleratedWidget( |
@@ -527,8 +527,8 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
display_output_surface = |
base::MakeUnique<MusBrowserCompositorOutputSurface>( |
host->window(), context_provider, |
- GetGpuMemoryBufferManager(), compositor->vsync_manager(), |
- begin_frame_source.get(), std::move(validator)); |
+ GetGpuMemoryBufferManager(), vsync_callback, |
+ std::move(validator)); |
} |
#else |
NOTREACHED(); |
@@ -614,6 +614,7 @@ void GpuProcessTransportFactory::RemoveCompositor(ui::Compositor* compositor) { |
if (data->surface_handle) |
gpu::GpuSurfaceTracker::Get()->RemoveSurface(data->surface_handle); |
#endif |
+ |
per_compositor_data_.erase(it); |
if (per_compositor_data_.empty()) { |
// Destroying the GLHelper may cause some async actions to be cancelled, |
@@ -727,6 +728,17 @@ void GpuProcessTransportFactory::SetDisplayVSyncParameters( |
data->begin_frame_source->OnUpdateVSyncParameters(timebase, interval); |
} |
+void GpuProcessTransportFactory::UpdateVSyncParametersFromGpu( |
+ base::WeakPtr<ui::Compositor> compositor, |
+ base::TimeTicks timebase, |
+ base::TimeDelta interval) { |
+ if (!compositor) |
+ return; |
+ |
+ SetDisplayVSyncParameters(compositor.get(), timebase, interval); |
enne (OOO)
2016/11/29 21:25:03
I think UpdateVSyncParametersFromGPU and SetDispla
stanisc
2016/11/29 21:38:44
I tried binding SetDisplayVSyncParameters directly
|
+ compositor->vsync_manager()->UpdateVSyncParameters(timebase, interval); |
+} |
+ |
void GpuProcessTransportFactory::SetOutputIsSecure(ui::Compositor* compositor, |
bool secure) { |
PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); |