| Index: gpu/command_buffer/service/command_buffer_service.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/command_buffer_service.cc (revision 113511)
|
| +++ gpu/command_buffer/service/command_buffer_service.cc (working copy)
|
| @@ -14,8 +14,7 @@
|
| 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() {
|
| + 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 @@
|
| 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 @@
|
| 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 @@
|
| 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;
|
|
|