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.cc87
1 files changed, 57 insertions, 30 deletions
diff --git a/gpu/command_buffer/service/command_buffer_service.cc b/gpu/command_buffer/service/command_buffer_service.cc
index 4047d1c..d126883 100644
--- a/gpu/command_buffer/service/command_buffer_service.cc
+++ b/gpu/command_buffer/service/command_buffer_service.cc
@@ -14,8 +14,7 @@ using ::base::SharedMemory;
namespace gpu {
CommandBufferService::CommandBufferService()
- : ring_buffer_id_(-1),
- num_entries_(0),
+ : num_entries_(0),
get_offset_(0),
put_offset_(0),
token_(0),
@@ -26,16 +25,71 @@ 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;
}
}
-bool CommandBufferService::Initialize() {
+bool CommandBufferService::Initialize(int32 size) {
+ // Fail if already initialized.
+ if (ring_buffer_.shared_memory) {
+ LOG(ERROR) << "Failed because already initialized.";
+ return false;
+ }
+
+ if (size <= 0 || size > kMaxCommandBufferSize) {
+ LOG(ERROR) << "Failed because command buffer size was invalid.";
+ return false;
+ }
+
+ num_entries_ = size / sizeof(CommandBufferEntry);
+
+ SharedMemory shared_memory;
+ if (!shared_memory.CreateAnonymous(size)) {
+ LOG(ERROR) << "Failed to create shared memory for command buffer.";
+ return true;
+ }
+
+ return Initialize(&shared_memory, size);
+}
+
+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;
+ }
+
+ 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() {
+ return ring_buffer_;
+}
+
CommandBufferService::State CommandBufferService::GetState() {
State state;
state.num_entries = num_entries_;
@@ -80,20 +134,6 @@ void CommandBufferService::Flush(int32 put_offset) {
put_offset_change_callback_.Run();
}
-void CommandBufferService::SetGetBuffer(int32 transfer_buffer_id) {
- DCHECK_EQ(-1, ring_buffer_id_);
- DCHECK_EQ(put_offset_, get_offset_); // Only if it's empty.
- ring_buffer_ = GetTransferBuffer(transfer_buffer_id);
- DCHECK(ring_buffer_.ptr);
- ring_buffer_id_ = transfer_buffer_id;
- num_entries_ = ring_buffer_.size / sizeof(CommandBufferEntry);
- put_offset_ = 0;
- SetGetOffset(0);
- if (!get_buffer_change_callback_.is_null()) {
- get_buffer_change_callback_.Run(ring_buffer_id_);
- }
-}
-
void CommandBufferService::SetGetOffset(int32 get_offset) {
DCHECK(get_offset >= 0 && get_offset < num_entries_);
get_offset_ = get_offset;
@@ -183,14 +223,6 @@ void CommandBufferService::DestroyTransferBuffer(int32 handle) {
registered_objects_[handle] = Buffer();
unused_registered_object_elements_.insert(handle);
- if (handle == ring_buffer_id_) {
- ring_buffer_id_ = -1;
- ring_buffer_ = Buffer();
- num_entries_ = 0;
- get_offset_ = 0;
- put_offset_ = 0;
- }
-
// Remove all null objects from the end of the vector. This allows the vector
// to shrink when, for example, all objects are unregistered. Note that this
// loop never removes element zero, which is always NULL.
@@ -234,11 +266,6 @@ void CommandBufferService::SetPutOffsetChangeCallback(
put_offset_change_callback_ = callback;
}
-void CommandBufferService::SetGetBufferChangeCallback(
- const GetBufferChangedCallback& callback) {
- get_buffer_change_callback_ = callback;
-}
-
void CommandBufferService::SetParseErrorCallback(
const base::Closure& callback) {
parse_error_callback_ = callback;