summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/command_buffer_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer/service/command_buffer_service.cc')
-rw-r--r--gpu/command_buffer/service/command_buffer_service.cc57
1 files changed, 38 insertions, 19 deletions
diff --git a/gpu/command_buffer/service/command_buffer_service.cc b/gpu/command_buffer/service/command_buffer_service.cc
index d806de1..adc5623 100644
--- a/gpu/command_buffer/service/command_buffer_service.cc
+++ b/gpu/command_buffer/service/command_buffer_service.cc
@@ -25,6 +25,8 @@ CommandBufferService::CommandBufferService()
}
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 @@ CommandBufferService::~CommandBufferService() {
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;
+ }
+
+ 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;
+ }
- 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() {