| Index: mojo/gles2/command_buffer_client_impl.cc
|
| diff --git a/mojo/gles2/command_buffer_client_impl.cc b/mojo/gles2/command_buffer_client_impl.cc
|
| index 3ffecf3d02ff959ad860c1c9dd171b0fde540035..a08f1b9cc29ffb3052ac540240bc09e0411ea444 100644
|
| --- a/mojo/gles2/command_buffer_client_impl.cc
|
| +++ b/mojo/gles2/command_buffer_client_impl.cc
|
| @@ -11,10 +11,37 @@
|
| #include "mojo/public/cpp/bindings/allocation_scope.h"
|
| #include "mojo/public/cpp/bindings/sync_dispatcher.h"
|
| #include "mojo/services/gles2/command_buffer_type_conversions.h"
|
| +#include "mojo/services/gles2/mojo_buffer_backing.h"
|
|
|
| namespace mojo {
|
| namespace gles2 {
|
|
|
| +namespace {
|
| +
|
| +bool CreateMapAndDupSharedBuffer(size_t size,
|
| + void** memory,
|
| + mojo::ScopedSharedBufferHandle* handle,
|
| + mojo::ScopedSharedBufferHandle* duped) {
|
| + MojoResult result = mojo::CreateSharedBuffer(NULL, size, handle);
|
| + if (result != MOJO_RESULT_OK)
|
| + return false;
|
| + DCHECK(handle->is_valid());
|
| +
|
| + result = mojo::DuplicateBuffer(handle->get(), NULL, duped);
|
| + if (result != MOJO_RESULT_OK)
|
| + return false;
|
| + DCHECK(duped->is_valid());
|
| +
|
| + result = mojo::MapBuffer(
|
| + handle->get(), 0, size, memory, MOJO_MAP_BUFFER_FLAG_NONE);
|
| + if (result != MOJO_RESULT_OK)
|
| + return false;
|
| + DCHECK(*memory);
|
| +
|
| + return true;
|
| +}
|
| +}
|
| +
|
| CommandBufferDelegate::~CommandBufferDelegate() {}
|
|
|
| void CommandBufferDelegate::ContextLost() {}
|
| @@ -26,6 +53,7 @@ CommandBufferClientImpl::CommandBufferClientImpl(
|
| ScopedCommandBufferHandle command_buffer_handle)
|
| : delegate_(delegate),
|
| command_buffer_(command_buffer_handle.Pass(), this, this, async_waiter),
|
| + shared_state_(NULL),
|
| last_put_offset_(-1),
|
| next_transfer_buffer_id_(0),
|
| initialize_result_(false) {}
|
| @@ -33,15 +61,15 @@ CommandBufferClientImpl::CommandBufferClientImpl(
|
| CommandBufferClientImpl::~CommandBufferClientImpl() {}
|
|
|
| bool CommandBufferClientImpl::Initialize() {
|
| - shared_state_shm_.reset(new base::SharedMemory);
|
| - if (!shared_state_shm_->CreateAndMapAnonymous(
|
| - sizeof(gpu::CommandBufferSharedState)))
|
| + const size_t kSharedStateSize = sizeof(gpu::CommandBufferSharedState);
|
| + void* memory = NULL;
|
| + mojo::ScopedSharedBufferHandle duped;
|
| + bool result = CreateMapAndDupSharedBuffer(
|
| + kSharedStateSize, &memory, &shared_state_handle_, &duped);
|
| + if (!result)
|
| return false;
|
|
|
| - base::SharedMemoryHandle handle;
|
| - shared_state_shm_->ShareToProcess(base::GetCurrentProcessHandle(), &handle);
|
| - if (!base::SharedMemory::IsHandleValid(handle))
|
| - return false;
|
| + shared_state_ = static_cast<gpu::CommandBufferSharedState*>(memory);
|
|
|
| shared_state()->Initialize();
|
|
|
| @@ -49,7 +77,7 @@ bool CommandBufferClientImpl::Initialize() {
|
| sync_dispatcher_.reset(new SyncDispatcher<CommandBufferSyncClient>(
|
| sync_pipe.handle_to_peer.Pass(), this));
|
| AllocationScope scope;
|
| - command_buffer_->Initialize(sync_pipe.handle_to_self.Pass(), handle);
|
| + command_buffer_->Initialize(sync_pipe.handle_to_self.Pass(), duped.Pass());
|
| // Wait for DidInitialize to come on the sync client pipe.
|
| if (!sync_dispatcher_->WaitAndDispatchOneMessage()) {
|
| VLOG(1) << "Channel encountered error while creating command buffer";
|
| @@ -109,23 +137,21 @@ scoped_refptr<gpu::Buffer> CommandBufferClientImpl::CreateTransferBuffer(
|
| if (size >= std::numeric_limits<uint32_t>::max())
|
| return NULL;
|
|
|
| - scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory);
|
| - if (!shared_memory->CreateAndMapAnonymous(size))
|
| - return NULL;
|
| -
|
| - base::SharedMemoryHandle handle;
|
| - shared_memory->ShareToProcess(base::GetCurrentProcessHandle(), &handle);
|
| - if (!base::SharedMemory::IsHandleValid(handle))
|
| + void* memory = NULL;
|
| + mojo::ScopedSharedBufferHandle handle;
|
| + mojo::ScopedSharedBufferHandle duped;
|
| + if (!CreateMapAndDupSharedBuffer(size, &memory, &handle, &duped))
|
| return NULL;
|
|
|
| *id = ++next_transfer_buffer_id_;
|
|
|
| AllocationScope scope;
|
| command_buffer_->RegisterTransferBuffer(
|
| - *id, handle, static_cast<uint32_t>(size));
|
| + *id, duped.Pass(), static_cast<uint32_t>(size));
|
|
|
| - scoped_refptr<gpu::Buffer> buffer =
|
| - gpu::MakeBufferFromSharedMemory(shared_memory.Pass(), size);
|
| + scoped_ptr<gpu::BufferBacking> backing(
|
| + new MojoBufferBacking(handle.Pass(), memory, size));
|
| + scoped_refptr<gpu::Buffer> buffer(new gpu::Buffer(backing.Pass()));
|
| return buffer;
|
| }
|
|
|
|
|