| Index: chrome/renderer/command_buffer_proxy.cc
|
| ===================================================================
|
| --- chrome/renderer/command_buffer_proxy.cc (revision 76263)
|
| +++ chrome/renderer/command_buffer_proxy.cc (working copy)
|
| @@ -68,22 +68,62 @@
|
| bool CommandBufferProxy::Initialize(int32 size) {
|
| DCHECK(!ring_buffer_.get());
|
|
|
| - // Initialize the service. Assuming we are sandboxed, the GPU
|
| - // process is responsible for duplicating the handle. This might not be true
|
| - // for NaCl.
|
| + RenderThread* render_thread = RenderThread::current();
|
| + if (!render_thread)
|
| + return false;
|
| +
|
| base::SharedMemoryHandle handle;
|
| - if (Send(new GpuCommandBufferMsg_Initialize(route_id_, size, &handle)) &&
|
| - base::SharedMemory::IsHandleValid(handle)) {
|
| - ring_buffer_.reset(new base::SharedMemory(handle, false));
|
| - if (ring_buffer_->Map(size)) {
|
| - num_entries_ = size / sizeof(gpu::CommandBufferEntry);
|
| - return true;
|
| - }
|
| + if (!render_thread->Send(new ViewHostMsg_AllocateSharedMemoryBuffer(
|
| + size,
|
| + &handle))) {
|
| + return false;
|
| + }
|
|
|
| + if (!base::SharedMemory::IsHandleValid(handle))
|
| + return false;
|
| +
|
| +#if defined(OS_POSIX)
|
| + handle.auto_close = false;
|
| +#endif
|
| +
|
| + // Take ownership of shared memory. This will close the handle if Send below
|
| + // fails. Otherwise, callee takes ownership before this variable
|
| + // goes out of scope.
|
| + base::SharedMemory shared_memory(handle, false);
|
| +
|
| + return Initialize(&shared_memory, size);
|
| +}
|
| +
|
| +bool CommandBufferProxy::Initialize(base::SharedMemory* buffer, int32 size) {
|
| + bool result;
|
| + if (!Send(new GpuCommandBufferMsg_Initialize(route_id_,
|
| + buffer->handle(),
|
| + size,
|
| + &result))) {
|
| + LOG(ERROR) << "Could not send GpuCommandBufferMsg_Initialize.";
|
| + return false;
|
| + }
|
| +
|
| + if (!result) {
|
| + LOG(ERROR) << "Failed to initialize command buffer service.";
|
| + return false;
|
| + }
|
| +
|
| + base::SharedMemoryHandle handle;
|
| + if (!buffer->GiveToProcess(base::GetCurrentProcessHandle(), &handle)) {
|
| + LOG(ERROR) << "Failed to duplicate command buffer handle.";
|
| + return false;
|
| + }
|
| +
|
| + ring_buffer_.reset(new base::SharedMemory(handle, false));
|
| + if (!ring_buffer_->Map(size)) {
|
| + LOG(ERROR) << "Failed to map shared memory for command buffer.";
|
| ring_buffer_.reset();
|
| + return false;
|
| }
|
|
|
| - return false;
|
| + num_entries_ = size / sizeof(gpu::CommandBufferEntry);
|
| + return true;
|
| }
|
|
|
| Buffer CommandBufferProxy::GetRingBuffer() {
|
|
|