Index: gpu/command_buffer/service/command_buffer_service.cc |
=================================================================== |
--- gpu/command_buffer/service/command_buffer_service.cc (revision 76263) |
+++ gpu/command_buffer/service/command_buffer_service.cc (working copy) |
@@ -25,6 +25,8 @@ |
} |
CommandBufferService::~CommandBufferService() { |
+ delete ring_buffer_.shared_memory; |
+ |
for (size_t i = 0; i < registered_objects_.size(); ++i) { |
if (registered_objects_[i].shared_memory) |
delete registered_objects_[i].shared_memory; |
@@ -33,42 +35,59 @@ |
bool CommandBufferService::Initialize(int32 size) { |
// Fail if already initialized. |
- if (ring_buffer_.get()) { |
- LOG(ERROR) << "CommandBufferService::Initialize " |
- << "failed because already initialized."; |
+ if (ring_buffer_.shared_memory) { |
+ LOG(ERROR) << "Failed because already initialized."; |
return false; |
} |
if (size <= 0 || size > kMaxCommandBufferSize) { |
- LOG(ERROR) << "CommandBufferService::Initialize " |
- << "because command buffer size was invalid."; |
+ LOG(ERROR) << "Failed because command buffer size was invalid."; |
return false; |
} |
num_entries_ = size / sizeof(CommandBufferEntry); |
- ring_buffer_.reset(new SharedMemory); |
- if (ring_buffer_->CreateAndMapAnonymous(size)) { |
+ SharedMemory shared_memory; |
+ if (!shared_memory.CreateAnonymous(size)) { |
+ LOG(ERROR) << "Failed to create shared memory for command buffer."; |
return true; |
} |
- num_entries_ = 0; |
- ring_buffer_.reset(); |
+ return Initialize(&shared_memory, size); |
+} |
- LOG(ERROR) << "CommandBufferService::Initialize failed because ring buffer " |
- << "could not be created or mapped "; |
+bool CommandBufferService::Initialize(base::SharedMemory* buffer, int32 size) { |
+ // Fail if already initialized. |
+ if (ring_buffer_.shared_memory) { |
+ LOG(ERROR) << "Failed because already initialized."; |
+ return false; |
+ } |
- return false; |
+ base::SharedMemoryHandle shared_memory_handle; |
+ if (!buffer->ShareToProcess(base::GetCurrentProcessHandle(), |
+ &shared_memory_handle)) { |
+ LOG(ERROR) << "Failed to duplicate command buffer shared memory handle."; |
+ return false; |
+ } |
+ |
+ ring_buffer_.shared_memory = new base::SharedMemory(shared_memory_handle, |
+ false); |
+ if (!ring_buffer_.shared_memory->Map(size)) { |
+ LOG(ERROR) << "Failed because ring buffer could not be created or mapped "; |
+ delete ring_buffer_.shared_memory; |
+ ring_buffer_.shared_memory = NULL; |
+ return false; |
+ } |
+ |
+ ring_buffer_.ptr = ring_buffer_.shared_memory->memory(); |
+ ring_buffer_.size = size; |
+ num_entries_ = size / sizeof(CommandBufferEntry); |
+ |
+ return true; |
} |
Buffer CommandBufferService::GetRingBuffer() { |
- Buffer buffer; |
- if (ring_buffer_.get()) { |
- buffer.ptr = ring_buffer_->memory(); |
- buffer.size = ring_buffer_->created_size(); |
- buffer.shared_memory = ring_buffer_.get(); |
- } |
- return buffer; |
+ return ring_buffer_; |
} |
CommandBufferService::State CommandBufferService::GetState() { |