| 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 4c0f9ee66edc593f0d353b984bf76a6e1bad82a4..31168f1dfb028e0ce710a6d749b51b951f4fb30f 100644
|
| --- a/content/browser/compositor/gpu_process_transport_factory.cc
|
| +++ b/content/browser/compositor/gpu_process_transport_factory.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/command_line.h"
|
| #include "base/location.h"
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/metrics/field_trial.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/profiler/scoped_tracker.h"
|
| #include "base/single_thread_task_runner.h"
|
| @@ -58,6 +59,7 @@
|
| #include "ui/display/types/display_snapshot.h"
|
| #include "ui/gfx/geometry/size.h"
|
| #include "ui/gfx/switches.h"
|
| +#include "ui/gl/gl_switches.h"
|
|
|
| #if defined(USE_AURA)
|
| #include "content/browser/compositor/mus_browser_compositor_output_surface.h"
|
| @@ -107,6 +109,20 @@ bool IsUsingMus() {
|
| return service_manager::ServiceManagerIsRemote();
|
| }
|
|
|
| +bool IsGpuVSyncSignalSupported() {
|
| +#if defined(OS_WIN)
|
| + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
| + if (command_line->HasSwitch(switches::kUseD3DVSync))
|
| + return true;
|
| +
|
| + const std::string group_name =
|
| + base::FieldTrialList::FindFullName("UseD3DVSync");
|
| + return group_name == "Enabled";
|
| +#else
|
| + return false;
|
| +#endif // defined(OS_WIN)
|
| +}
|
| +
|
| scoped_refptr<ui::ContextProviderCommandBuffer> CreateContextCommon(
|
| scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
|
| gpu::SurfaceHandle surface_handle,
|
| @@ -447,20 +463,9 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
|
| }
|
| }
|
|
|
| - std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source;
|
| - if (!compositor->GetRendererSettings().disable_display_vsync) {
|
| - synthetic_begin_frame_source.reset(new cc::DelayBasedBeginFrameSource(
|
| - base::MakeUnique<cc::DelayBasedTimeSource>(
|
| - compositor->task_runner().get())));
|
| - } else {
|
| - synthetic_begin_frame_source.reset(new cc::BackToBackBeginFrameSource(
|
| - base::MakeUnique<cc::DelayBasedTimeSource>(
|
| - compositor->task_runner().get())));
|
| - }
|
| - cc::BeginFrameSource* begin_frame_source = synthetic_begin_frame_source.get();
|
| -
|
| BrowserCompositorOutputSurface::UpdateVSyncParametersCallback vsync_callback =
|
| base::Bind(&ui::Compositor::SetDisplayVSyncParameters, compositor);
|
| + cc::BeginFrameSource* begin_frame_source = nullptr;
|
|
|
| std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface;
|
| #if defined(ENABLE_VULKAN)
|
| @@ -521,6 +526,7 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
|
| display_output_surface =
|
| base::MakeUnique<GpuBrowserCompositorOutputSurface>(
|
| context_provider, vsync_callback, std::move(validator));
|
| +
|
| } else {
|
| #if defined(USE_AURA)
|
| std::unique_ptr<MusBrowserCompositorOutputSurface> mus_output_surface;
|
| @@ -544,7 +550,6 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
|
| }
|
| // We use the ExternalBeginFrameSource provided by the output surface
|
| // instead of our own synthetic one.
|
| - synthetic_begin_frame_source.reset();
|
| begin_frame_source = mus_output_surface->GetBeginFrameSource();
|
| DCHECK(begin_frame_source);
|
| display_output_surface = std::move(mus_output_surface);
|
| @@ -556,7 +561,29 @@ void GpuProcessTransportFactory::EstablishedGpuChannel(
|
| }
|
| }
|
|
|
| - data->display_output_surface = display_output_surface.get();
|
| + std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source;
|
| +
|
| + if (!begin_frame_source) {
|
| + if (!compositor->GetRendererSettings().disable_display_vsync) {
|
| + GpuVSyncControl* vsync_control =
|
| + display_output_surface->GetVSyncControl();
|
| + if (vsync_control && IsGpuVSyncSignalSupported()) {
|
| + synthetic_begin_frame_source.reset(
|
| + new GpuVSyncBeginFrameSource(vsync_control));
|
| + } else {
|
| + synthetic_begin_frame_source.reset(new cc::DelayBasedBeginFrameSource(
|
| + base::MakeUnique<cc::DelayBasedTimeSource>(
|
| + compositor->task_runner().get())));
|
| + }
|
| + } else {
|
| + synthetic_begin_frame_source.reset(new cc::BackToBackBeginFrameSource(
|
| + base::MakeUnique<cc::DelayBasedTimeSource>(
|
| + compositor->task_runner().get())));
|
| + }
|
| +
|
| + begin_frame_source = synthetic_begin_frame_source.get();
|
| + }
|
| +
|
| if (data->reflector)
|
| data->reflector->OnSourceSurfaceReady(data->display_output_surface);
|
|
|
|
|