Index: content/common/gpu/gpu_channel_manager.cc |
diff --git a/content/common/gpu/gpu_channel_manager.cc b/content/common/gpu/gpu_channel_manager.cc |
index 85a42a608bdf48ab3837cd07cf6fc4d013b285de..eb14add5718d606ccb05f98cda915d077f6c947b 100644 |
--- a/content/common/gpu/gpu_channel_manager.cc |
+++ b/content/common/gpu/gpu_channel_manager.cc |
@@ -17,11 +17,63 @@ |
#include "gpu/command_buffer/service/mailbox_manager.h" |
#include "gpu/command_buffer/service/memory_program_cache.h" |
#include "gpu/command_buffer/service/shader_translator_cache.h" |
+#include "ipc/message_filter.h" |
#include "ui/gl/gl_bindings.h" |
#include "ui/gl/gl_share_group.h" |
namespace content { |
+namespace { |
+ |
+class GpuChannelManagerMessageFilter : public IPC::MessageFilter { |
+ public: |
+ GpuChannelManagerMessageFilter( |
+ GpuMemoryBufferFactory* gpu_memory_buffer_factory) |
+ : sender_(NULL), gpu_memory_buffer_factory_(gpu_memory_buffer_factory) {} |
+ |
+ virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE { |
+ DCHECK(!sender_); |
+ sender_ = sender; |
+ } |
+ |
+ virtual void OnFilterRemoved() OVERRIDE { |
+ DCHECK(sender_); |
+ sender_ = NULL; |
+ } |
+ |
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { |
+ DCHECK(sender_); |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(GpuChannelManagerMessageFilter, message) |
+ IPC_MESSAGE_HANDLER(GpuMsg_CreateGpuMemoryBuffer, OnCreateGpuMemoryBuffer) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+ } |
+ |
+ protected: |
+ virtual ~GpuChannelManagerMessageFilter() {} |
+ |
+ void OnCreateGpuMemoryBuffer(const gfx::GpuMemoryBufferHandle& handle, |
+ const gfx::Size& size, |
+ unsigned internalformat, |
+ unsigned usage) { |
+ TRACE_EVENT2("gpu", |
+ "GpuChannelManagerMessageFilter::OnCreateGpuMemoryBuffer", |
+ "primary_id", |
+ handle.global_id.primary_id, |
+ "secondary_id", |
+ handle.global_id.secondary_id); |
+ sender_->Send(new GpuHostMsg_GpuMemoryBufferCreated( |
+ gpu_memory_buffer_factory_->CreateGpuMemoryBuffer( |
+ handle, size, internalformat, usage))); |
+ } |
+ |
+ IPC::Sender* sender_; |
+ GpuMemoryBufferFactory* gpu_memory_buffer_factory_; |
+}; |
+} |
+ |
GpuChannelManager::GpuMemoryBufferOperation::GpuMemoryBufferOperation( |
int32 sync_point, |
base::Closure callback) |
@@ -34,7 +86,8 @@ GpuChannelManager::GpuMemoryBufferOperation::~GpuMemoryBufferOperation() { |
GpuChannelManager::GpuChannelManager(MessageRouter* router, |
GpuWatchdog* watchdog, |
base::MessageLoopProxy* io_message_loop, |
- base::WaitableEvent* shutdown_event) |
+ base::WaitableEvent* shutdown_event, |
+ IPC::SyncChannel* channel) |
: weak_factory_(this), |
io_message_loop_(io_message_loop), |
shutdown_event_(shutdown_event), |
@@ -44,10 +97,14 @@ GpuChannelManager::GpuChannelManager(MessageRouter* router, |
GpuMemoryManager::kDefaultMaxSurfacesWithFrontbufferSoftLimit), |
watchdog_(watchdog), |
sync_point_manager_(new SyncPointManager), |
- gpu_memory_buffer_factory_(GpuMemoryBufferFactory::Create()) { |
+ gpu_memory_buffer_factory_(GpuMemoryBufferFactory::Create()), |
+ channel_(channel), |
+ filter_(new GpuChannelManagerMessageFilter( |
+ gpu_memory_buffer_factory_.get())) { |
DCHECK(router_); |
DCHECK(io_message_loop); |
DCHECK(shutdown_event); |
+ channel_->AddFilter(filter_.get()); |
} |
GpuChannelManager::~GpuChannelManager() { |
@@ -110,7 +167,6 @@ bool GpuChannelManager::OnMessageReceived(const IPC::Message& msg) { |
IPC_MESSAGE_HANDLER(GpuMsg_CloseChannel, OnCloseChannel) |
IPC_MESSAGE_HANDLER(GpuMsg_CreateViewCommandBuffer, |
OnCreateViewCommandBuffer) |
- IPC_MESSAGE_HANDLER(GpuMsg_CreateGpuMemoryBuffer, OnCreateGpuMemoryBuffer) |
IPC_MESSAGE_HANDLER(GpuMsg_DestroyGpuMemoryBuffer, OnDestroyGpuMemoryBuffer) |
IPC_MESSAGE_HANDLER(GpuMsg_LoadedShader, OnLoadedShader) |
IPC_MESSAGE_UNHANDLED(handled = false) |
@@ -188,37 +244,16 @@ void GpuChannelManager::OnCreateViewCommandBuffer( |
Send(new GpuHostMsg_CommandBufferCreated(result)); |
} |
- |
-void GpuChannelManager::CreateGpuMemoryBuffer( |
- const gfx::GpuMemoryBufferHandle& handle, |
- const gfx::Size& size, |
- unsigned internalformat, |
- unsigned usage) { |
- Send(new GpuHostMsg_GpuMemoryBufferCreated( |
- gpu_memory_buffer_factory_->CreateGpuMemoryBuffer( |
- handle, size, internalformat, usage))); |
-} |
- |
-void GpuChannelManager::OnCreateGpuMemoryBuffer( |
- const gfx::GpuMemoryBufferHandle& handle, |
- const gfx::Size& size, |
- unsigned internalformat, |
- unsigned usage) { |
- if (gpu_memory_buffer_operations_.empty()) { |
- CreateGpuMemoryBuffer(handle, size, internalformat, usage); |
- } else { |
piman
2014/09/04 17:21:33
Is this logic not needed any more? It used to be t
alexst (slow to review)
2014/09/04 17:46:02
These are identified by an int pair, one of which
|
- gpu_memory_buffer_operations_.push_back(new GpuMemoryBufferOperation( |
- 0, |
- base::Bind(&GpuChannelManager::CreateGpuMemoryBuffer, |
- base::Unretained(this), |
- handle, |
- size, |
- internalformat, |
- usage))); |
- } |
+void GpuChannelManager::DestroyGpuMemoryBuffer( |
+ const gfx::GpuMemoryBufferHandle& handle) { |
+ io_message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&GpuChannelManager::DestroyGpuMemoryBufferOnIO, |
+ base::Unretained(this), |
+ handle)); |
} |
-void GpuChannelManager::DestroyGpuMemoryBuffer( |
+void GpuChannelManager::DestroyGpuMemoryBufferOnIO( |
const gfx::GpuMemoryBufferHandle& handle) { |
gpu_memory_buffer_factory_->DestroyGpuMemoryBuffer(handle); |
} |