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 5b29e2ca28ca161e22bece542ffb544293f6908e..999a6cf81738f59e1af8d01ee9d3daa153fb682c 100644 |
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc |
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc |
@@ -20,6 +20,7 @@ |
#include "gpu/command_buffer/common/gpu_memory_buffer_support.h" |
#include "gpu/command_buffer/common/mailbox.h" |
#include "gpu/command_buffer/common/sync_token.h" |
+#include "gpu/command_buffer/service/fence_manager.h" |
#include "gpu/command_buffer/service/gl_context_virtual.h" |
#include "gpu/command_buffer/service/gl_state_restorer_impl.h" |
#include "gpu/command_buffer/service/image_manager.h" |
@@ -41,6 +42,7 @@ |
#include "gpu/ipc/service/image_transport_surface.h" |
#include "ui/gl/gl_bindings.h" |
#include "ui/gl/gl_context.h" |
+#include "ui/gl/gl_fence.h" |
#include "ui/gl/gl_image.h" |
#include "ui/gl/gl_implementation.h" |
#include "ui/gl/gl_switches.h" |
@@ -256,6 +258,8 @@ bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) { |
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyImage, OnDestroyImage); |
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateStreamTexture, |
OnCreateStreamTexture) |
+ IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateFence, OnCreateFence); |
+ IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyFence, OnDestroyFence); |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
@@ -1079,6 +1083,47 @@ void GpuCommandBufferStub::OnDestroyImage(int32_t id) { |
image_manager->RemoveImage(id); |
} |
+void GpuCommandBufferStub::OnCreateFence( |
+ const GpuCommandBufferMsg_CreateFence_Params& params) { |
+ TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateFence"); |
+ const int32_t id = params.id; |
+ const gfx::GpuFenceHandle& handle = params.gpu_fence; |
+ |
+ if (!decoder_) |
+ return; |
+ |
+ gles2::FenceManager* fence_manager = decoder_->GetFenceManager(); |
+ DCHECK(fence_manager); |
+ if (fence_manager->LookupFence(id)) { |
+ LOG(ERROR) << "Fence already exists with same ID."; |
+ return; |
+ } |
+ |
+ std::unique_ptr<gl::GLFence> fence = |
+ channel()->CreateFenceForGpuFence(handle); |
+ if (!fence) { |
+ DLOG(ERROR) << "Failed to create GLFence from GpuFence handle."; |
+ return; |
+ } |
+ |
+ fence_manager->AddFence(std::move(fence), id); |
+} |
+ |
+void GpuCommandBufferStub::OnDestroyFence(int32_t id) { |
+ TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnDestroyFence"); |
+ |
+ if (!decoder_) |
+ return; |
+ |
+ gles2::FenceManager* fence_manager = decoder_->GetFenceManager(); |
+ DCHECK(fence_manager); |
+ if (!fence_manager->LookupFence(id)) { |
+ LOG(ERROR) << "Fence with ID doesn't exist."; |
+ return; |
+ } |
+ fence_manager->RemoveFence(id); |
+} |
+ |
void GpuCommandBufferStub::SendConsoleMessage(int32_t id, |
const std::string& message) { |
GPUCommandBufferConsoleMessage console_message; |