diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-07 22:06:18 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-07 22:06:18 +0000 |
commit | bb62ce3d7922d0bd07b066f6460c7cd00f946011 (patch) | |
tree | 22657f3db7f64c7b8ace37bb2a3d4d1e2426cba0 /gpu/command_buffer/service/command_buffer_service.cc | |
parent | 481a6d899f7c9a4d3e029fa6553f6bec589b5564 (diff) | |
download | chromium_src-bb62ce3d7922d0bd07b066f6460c7cd00f946011.zip chromium_src-bb62ce3d7922d0bd07b066f6460c7cd00f946011.tar.gz chromium_src-bb62ce3d7922d0bd07b066f6460c7cd00f946011.tar.bz2 |
Revert "Revert 113250 - Add CommandBuffer::SetGetBuffer"
This reverts commit bd45bd252aeb8babac62547a5c605fbf64287cd3.
TEST=ran webkit tests in DRT and webgl tests in chrome
BUG=103989
Review URL: http://codereview.chromium.org/8758026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113479 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service/command_buffer_service.cc')
-rw-r--r-- | gpu/command_buffer/service/command_buffer_service.cc | 87 |
1 files changed, 30 insertions, 57 deletions
diff --git a/gpu/command_buffer/service/command_buffer_service.cc b/gpu/command_buffer/service/command_buffer_service.cc index d126883..4047d1c 100644 --- a/gpu/command_buffer/service/command_buffer_service.cc +++ b/gpu/command_buffer/service/command_buffer_service.cc @@ -14,7 +14,8 @@ using ::base::SharedMemory; namespace gpu { CommandBufferService::CommandBufferService() - : num_entries_(0), + : ring_buffer_id_(-1), + num_entries_(0), get_offset_(0), put_offset_(0), token_(0), @@ -25,71 +26,16 @@ 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(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); - +bool CommandBufferService::Initialize() { return true; } -Buffer CommandBufferService::GetRingBuffer() { - return ring_buffer_; -} - CommandBufferService::State CommandBufferService::GetState() { State state; state.num_entries = num_entries_; @@ -134,6 +80,20 @@ 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; @@ -223,6 +183,14 @@ 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. @@ -266,6 +234,11 @@ 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; |