Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8960)

Unified Diff: content/browser/compositor/gpu_process_transport_factory.cc

Issue 2555173003: [Do not submit] D3DKMTWaitForVerticalBlankEvent VSync prototype (Closed)
Patch Set: Added command line switch and experiment support Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698