| 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..53dfca38abb111839cadf9bf3ef74929cbe17d92 100644
|
| --- a/content/common/gpu/gpu_channel_manager.cc
|
| +++ b/content/common/gpu/gpu_channel_manager.cc
|
| @@ -17,24 +17,69 @@
|
| #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 {
|
|
|
| -GpuChannelManager::GpuMemoryBufferOperation::GpuMemoryBufferOperation(
|
| - int32 sync_point,
|
| - base::Closure callback)
|
| - : sync_point(sync_point), callback(callback) {
|
| -}
|
| +namespace {
|
|
|
| -GpuChannelManager::GpuMemoryBufferOperation::~GpuMemoryBufferOperation() {
|
| -}
|
| +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_;
|
| +};
|
| +
|
| +} // namespace
|
|
|
| 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 +89,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() {
|
| @@ -56,7 +105,6 @@ GpuChannelManager::~GpuChannelManager() {
|
| default_offscreen_surface_->Destroy();
|
| default_offscreen_surface_ = NULL;
|
| }
|
| - DCHECK(gpu_memory_buffer_operations_.empty());
|
| }
|
|
|
| gpu::gles2::ProgramCache* GpuChannelManager::program_cache() {
|
| @@ -110,7 +158,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 +235,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 {
|
| - 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);
|
| }
|
| @@ -226,39 +252,14 @@ void GpuChannelManager::DestroyGpuMemoryBuffer(
|
| void GpuChannelManager::OnDestroyGpuMemoryBuffer(
|
| const gfx::GpuMemoryBufferHandle& handle,
|
| int32 sync_point) {
|
| - if (!sync_point && gpu_memory_buffer_operations_.empty()) {
|
| + if (!sync_point) {
|
| DestroyGpuMemoryBuffer(handle);
|
| } else {
|
| - gpu_memory_buffer_operations_.push_back(new GpuMemoryBufferOperation(
|
| + sync_point_manager()->AddSyncPointCallback(
|
| sync_point,
|
| base::Bind(&GpuChannelManager::DestroyGpuMemoryBuffer,
|
| base::Unretained(this),
|
| - handle)));
|
| - if (sync_point) {
|
| - sync_point_manager()->AddSyncPointCallback(
|
| - sync_point,
|
| - base::Bind(
|
| - &GpuChannelManager::OnDestroyGpuMemoryBufferSyncPointRetired,
|
| - base::Unretained(this),
|
| - gpu_memory_buffer_operations_.back()));
|
| - }
|
| - }
|
| -}
|
| -
|
| -void GpuChannelManager::OnDestroyGpuMemoryBufferSyncPointRetired(
|
| - GpuMemoryBufferOperation* gpu_memory_buffer_operation) {
|
| - // Mark operation as no longer having a pending sync point.
|
| - gpu_memory_buffer_operation->sync_point = 0;
|
| -
|
| - // De-queue operations until we reach a pending sync point.
|
| - while (!gpu_memory_buffer_operations_.empty()) {
|
| - // Check if operation has a pending sync point.
|
| - if (gpu_memory_buffer_operations_.front()->sync_point)
|
| - break;
|
| -
|
| - gpu_memory_buffer_operations_.front()->callback.Run();
|
| - delete gpu_memory_buffer_operations_.front();
|
| - gpu_memory_buffer_operations_.pop_front();
|
| + handle));
|
| }
|
| }
|
|
|
|
|