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

Unified Diff: gpu/ipc/service/gpu_command_buffer_stub.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: gpu/ipc/service/gpu_command_buffer_stub.cc
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.cc b/gpu/ipc/service/gpu_command_buffer_stub.cc
index 3f41a30555095398eacb3ddab053551bfa5bfb3d..92b491e027b1c710fce2e7e3e335852daedb3380 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc
@@ -8,12 +8,14 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/command_line.h"
#include "base/hash.h"
#include "base/json/json_writer.h"
#include "base/macros.h"
#include "base/memory/memory_pressure_listener.h"
#include "base/memory/ptr_util.h"
#include "base/memory/shared_memory.h"
+#include "base/metrics/field_trial.h"
#include "base/metrics/histogram_macros.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
@@ -39,6 +41,7 @@
#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
#include "gpu/ipc/service/gpu_memory_manager.h"
#include "gpu/ipc/service/gpu_memory_tracking.h"
+#include "gpu/ipc/service/gpu_vsync_provider.h"
#include "gpu/ipc/service/gpu_watchdog_thread.h"
#include "gpu/ipc/service/image_transport_surface.h"
#include "ui/gl/gl_bindings.h"
@@ -218,6 +221,20 @@ CommandBufferId GetCommandBufferID(int channel_id, int32_t route_id) {
(static_cast<uint64_t>(channel_id) << 32) | route_id);
}
+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)
+}
+
} // namespace
std::unique_ptr<GpuCommandBufferStub> GpuCommandBufferStub::Create(
@@ -249,7 +266,8 @@ GpuCommandBufferStub::GpuCommandBufferStub(
waiting_for_sync_point_(false),
previous_processed_num_(0),
active_url_(init_params.active_url),
- active_url_hash_(base::Hash(active_url_.possibly_invalid_spec())) {}
+ active_url_hash_(base::Hash(active_url_.possibly_invalid_spec())),
+ gpu_vsync_signal_supported_(IsGpuVSyncSignalSupported()) {}
GpuCommandBufferStub::~GpuCommandBufferStub() {
Destroy();
@@ -310,6 +328,7 @@ bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyImage, OnDestroyImage);
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateStreamTexture,
OnCreateStreamTexture)
+ IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_EnableVSync, OnEnableVSync);
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
@@ -370,6 +389,35 @@ void GpuCommandBufferStub::SetLatencyInfoCallback(
void GpuCommandBufferStub::UpdateVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) {
+#if defined(OS_WIN)
+ if (gpu_vsync_signal_supported_) {
+ base::AutoLock lock(vsync_lock_);
+ vsync_interval_ = interval;
+ return;
+ }
+#endif // defined(OS_WIN)
+
+ SendUpdatedVSyncParameters(timebase, interval);
+}
+
+void GpuCommandBufferStub::UpdateGpuVSync(base::TimeTicks timestamp) {
+ DCHECK(gpu_vsync_signal_supported_);
+
+#if defined(OS_WIN)
+
+ base::TimeDelta interval;
+ {
+ base::AutoLock lock(vsync_lock_);
+ interval = vsync_interval_;
+ }
+
+ SendUpdatedVSyncParameters(timestamp, interval);
+#endif // defined(OS_WIN)
+}
+
+void GpuCommandBufferStub::SendUpdatedVSyncParameters(
+ base::TimeTicks timebase,
+ base::TimeDelta interval) {
Send(new GpuCommandBufferMsg_UpdateVSyncParameters(route_id_, timebase,
interval));
}
@@ -521,6 +569,8 @@ void GpuCommandBufferStub::Destroy() {
sync_point_client_.reset();
+ vsync_provider_.reset();
+
bool have_context = false;
if (decoder_ && decoder_->GetGLContext()) {
// Try to make the context current regardless of whether it was lost, so we
@@ -634,6 +684,13 @@ bool GpuCommandBufferStub::Initialize(
}
}
+ if (IsGpuVSyncSignalSupported()) {
+ vsync_provider_ = GpuVSyncProvider::Create(
+ base::Bind(&GpuCommandBufferStub::UpdateGpuVSync,
+ base::Unretained(this)),
+ surface_handle_);
+ }
+
scoped_refptr<gl::GLContext> context;
gl::GLShareGroup* gl_share_group = channel_->share_group();
if (use_virtualized_gl_context_ && gl_share_group) {
@@ -770,6 +827,11 @@ void GpuCommandBufferStub::OnSetGetBuffer(int32_t shm_id,
Send(reply_message);
}
+void GpuCommandBufferStub::OnEnableVSync(bool enabled) {
+ DCHECK(vsync_provider_);
+ vsync_provider_->EnableVSync(enabled);
+}
+
void GpuCommandBufferStub::OnTakeFrontBuffer(const Mailbox& mailbox) {
TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnTakeFrontBuffer");
if (!decoder_) {

Powered by Google App Engine
This is Rietveld 408576698