Chromium Code Reviews| Index: content/common/child_process_host_impl.cc |
| diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc |
| index c4d209e08773d5b103922d3809f43556e85210dc..4e5102dfea7d81c6a0284eebf0c09b8fef00f73a 100644 |
| --- a/content/common/child_process_host_impl.cc |
| +++ b/content/common/child_process_host_impl.cc |
| @@ -11,13 +11,14 @@ |
| #include "base/files/file_path.h" |
| #include "base/logging.h" |
| #include "base/metrics/histogram.h" |
| +#include "base/numerics/safe_math.h" |
| #include "base/path_service.h" |
| #include "base/process/process_metrics.h" |
| #include "base/rand_util.h" |
| #include "base/strings/stringprintf.h" |
| #include "base/third_party/dynamic_annotations/dynamic_annotations.h" |
| #include "content/common/child_process_messages.h" |
| -#include "content/common/gpu/client/gpu_memory_buffer_impl.h" |
| +#include "content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h" |
| #include "content/public/common/child_process_host_delegate.h" |
| #include "content/public/common/content_paths.h" |
| #include "content/public/common/content_switches.h" |
| @@ -253,8 +254,11 @@ bool ChildProcessHostImpl::OnMessageReceived(const IPC::Message& msg) { |
| OnShutdownRequest) |
| IPC_MESSAGE_HANDLER(ChildProcessHostMsg_SyncAllocateSharedMemory, |
| OnAllocateSharedMemory) |
| - IPC_MESSAGE_HANDLER(ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer, |
| - OnAllocateGpuMemoryBuffer) |
| + IPC_MESSAGE_HANDLER_DELAY_REPLY( |
| + ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer, |
| + OnAllocateGpuMemoryBuffer) |
| + IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DeletedGpuMemoryBuffer, |
| + OnDeletedGpuMemoryBuffer) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| @@ -310,14 +314,45 @@ void ChildProcessHostImpl::OnShutdownRequest() { |
| void ChildProcessHostImpl::OnAllocateGpuMemoryBuffer( |
| uint32 width, |
| uint32 height, |
| - uint32 internalformat, |
| - uint32 usage, |
| - gfx::GpuMemoryBufferHandle* handle) { |
| - handle->type = gfx::SHARED_MEMORY_BUFFER; |
| - AllocateSharedMemory( |
| - width * height * GpuMemoryBufferImpl::BytesPerPixel(internalformat), |
| + gfx::GpuMemoryBuffer::Format format, |
| + gfx::GpuMemoryBuffer::Usage usage, |
| + IPC::Message* reply) { |
| + base::CheckedNumeric<int> size = width; |
| + size *= height; |
| + if (!size.IsValid()) { |
| + GpuMemoryBufferAllocated(reply, gfx::GpuMemoryBufferHandle()); |
| + return; |
| + } |
| + |
| + // TODO(reveman): Add support for other types of GpuMemoryBuffers. |
| + if (!GpuMemoryBufferImplSharedMemory::IsConfigurationSupported( |
| + gfx::Size(width, height), format, usage)) { |
| + GpuMemoryBufferAllocated(reply, gfx::GpuMemoryBufferHandle()); |
| + return; |
| + } |
| + |
| + GpuMemoryBufferImplSharedMemory::AllocateForChildProcess( |
| + gfx::Size(width, height), |
| + format, |
| peer_handle_, |
| - &handle->handle); |
| + base::Bind(&ChildProcessHostImpl::GpuMemoryBufferAllocated, |
| + base::Unretained(this), |
|
piman
2014/10/10 02:58:42
nit: can you add a comment that unretained is safe
reveman
2014/10/10 12:47:44
Done.
|
| + reply)); |
| +} |
| + |
| +void ChildProcessHostImpl::OnDeletedGpuMemoryBuffer( |
| + gfx::GpuMemoryBufferType type, |
| + const gfx::GpuMemoryBufferId& id) { |
| + // Note: Nothing to do here as ownership of shared memory backed |
| + // GpuMemoryBuffers is passed with IPC. |
| +} |
| + |
| +void ChildProcessHostImpl::GpuMemoryBufferAllocated( |
| + IPC::Message* reply, |
| + const gfx::GpuMemoryBufferHandle& handle) { |
| + ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer::WriteReplyParams(reply, |
| + handle); |
| + Send(reply); |
| } |
| } // namespace content |