Chromium Code Reviews| 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); |
| } |