diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-26 08:05:03 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-26 08:05:03 +0000 |
commit | c87015f53fc61bea2b94f2dc80d0c699d9aebcd5 (patch) | |
tree | e34dd0f6151caef21cf51ea39c67af080127fccc /gpu/command_buffer/service/command_buffer_service.cc | |
parent | 12e54045b113f6aca10188b012b1ea529cec6bf2 (diff) | |
download | chromium_src-c87015f53fc61bea2b94f2dc80d0c699d9aebcd5.zip chromium_src-c87015f53fc61bea2b94f2dc80d0c699d9aebcd5.tar.gz chromium_src-c87015f53fc61bea2b94f2dc80d0c699d9aebcd5.tar.bz2 |
Separate management of shared memory from CmdBufService to separate class
This is a step on the way to making this per ContextGroup instead
of per context
TEST=unit tests
BUG=129803
R=apatrick@chromium.org
Review URL: https://chromiumcodereview.appspot.com/10448030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@139196 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 | 122 |
1 files changed, 10 insertions, 112 deletions
diff --git a/gpu/command_buffer/service/command_buffer_service.cc b/gpu/command_buffer/service/command_buffer_service.cc index 13d3098..402cb7c 100644 --- a/gpu/command_buffer/service/command_buffer_service.cc +++ b/gpu/command_buffer/service/command_buffer_service.cc @@ -10,6 +10,7 @@ #include "base/debug/trace_event.h" #include "gpu/command_buffer/common/cmd_buffer_common.h" #include "gpu/command_buffer/common/command_buffer_shared.h" +#include "gpu/command_buffer/service/transfer_buffer_manager.h" using ::base::SharedMemory; @@ -24,24 +25,16 @@ CommandBufferService::CommandBufferService() token_(0), generation_(0), error_(error::kNoError), - context_lost_reason_(error::kUnknown), - shared_memory_bytes_allocated_(0) { - // Element zero is always NULL. - registered_objects_.push_back(Buffer()); + context_lost_reason_(error::kUnknown) { } CommandBufferService::~CommandBufferService() { - for (size_t i = 0; i < registered_objects_.size(); ++i) { - if (registered_objects_[i].shared_memory) { - shared_memory_bytes_allocated_ -= registered_objects_[i].size; - delete registered_objects_[i].shared_memory; - } - } - // TODO(gman): Should we report 0 bytes to TRACE here? } bool CommandBufferService::Initialize() { - return true; + TransferBufferManager* manager = new TransferBufferManager(); + transfer_buffer_manager_.reset(manager); + return manager->Initialize(); } CommandBufferService::State CommandBufferService::GetState() { @@ -125,96 +118,17 @@ void CommandBufferService::SetGetOffset(int32 get_offset) { int32 CommandBufferService::CreateTransferBuffer(size_t size, int32 id_request) { - SharedMemory buffer; - if (!buffer.CreateAnonymous(size)) - return -1; - - shared_memory_bytes_allocated_ += size; - TRACE_COUNTER_ID1( - "CommandBuffer", "SharedMemory", this, shared_memory_bytes_allocated_); - - return RegisterTransferBuffer(&buffer, size, id_request); + return transfer_buffer_manager_->CreateTransferBuffer(size, id_request); } int32 CommandBufferService::RegisterTransferBuffer( base::SharedMemory* shared_memory, size_t size, int32 id_request) { - // Check we haven't exceeded the range that fits in a 32-bit integer. - if (unused_registered_object_elements_.empty()) { - if (registered_objects_.size() > std::numeric_limits<uint32>::max()) - return -1; - } - - // Check that the requested ID is sane (not too large, or less than -1) - if (id_request != -1 && (id_request > 100 || id_request < -1)) - return -1; - - // Duplicate the handle. - base::SharedMemoryHandle duped_shared_memory_handle; - if (!shared_memory->ShareToProcess(base::GetCurrentProcessHandle(), - &duped_shared_memory_handle)) { - return -1; - } - scoped_ptr<SharedMemory> duped_shared_memory( - new SharedMemory(duped_shared_memory_handle, false)); - - // Map the shared memory into this process. This validates the size. - if (!duped_shared_memory->Map(size)) - return -1; - - // If it could be mapped, allocate an ID and register the shared memory with - // that ID. - Buffer buffer; - buffer.ptr = duped_shared_memory->memory(); - buffer.size = size; - buffer.shared_memory = duped_shared_memory.release(); - - // If caller requested specific id, first try to use id_request. - if (id_request != -1) { - int32 cur_size = static_cast<int32>(registered_objects_.size()); - if (cur_size <= id_request) { - // Pad registered_objects_ to reach id_request. - registered_objects_.resize(static_cast<size_t>(id_request + 1)); - for (int32 id = cur_size; id < id_request; ++id) - unused_registered_object_elements_.insert(id); - registered_objects_[id_request] = buffer; - return id_request; - } else if (!registered_objects_[id_request].shared_memory) { - // id_request is already in free list. - registered_objects_[id_request] = buffer; - unused_registered_object_elements_.erase(id_request); - return id_request; - } - } - - if (unused_registered_object_elements_.empty()) { - int32 handle = static_cast<int32>(registered_objects_.size()); - registered_objects_.push_back(buffer); - return handle; - } else { - int32 handle = *unused_registered_object_elements_.begin(); - unused_registered_object_elements_.erase( - unused_registered_object_elements_.begin()); - DCHECK(!registered_objects_[handle].shared_memory); - registered_objects_[handle] = buffer; - return handle; - } + return transfer_buffer_manager_->RegisterTransferBuffer( + shared_memory, size, id_request); } void CommandBufferService::DestroyTransferBuffer(int32 handle) { - if (handle <= 0) - return; - - if (static_cast<size_t>(handle) >= registered_objects_.size()) - return; - - shared_memory_bytes_allocated_ -= registered_objects_[handle].size; - TRACE_COUNTER_ID1( - "CommandBuffer", "SharedMemory", this, shared_memory_bytes_allocated_); - - delete registered_objects_[handle].shared_memory; - registered_objects_[handle] = Buffer(); - unused_registered_object_elements_.insert(handle); - + transfer_buffer_manager_->DestroyTransferBuffer(handle); if (handle == ring_buffer_id_) { ring_buffer_id_ = -1; ring_buffer_ = Buffer(); @@ -222,26 +136,10 @@ void CommandBufferService::DestroyTransferBuffer(int32 handle) { 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. - while (registered_objects_.size() > 1 && - !registered_objects_.back().shared_memory) { - registered_objects_.pop_back(); - unused_registered_object_elements_.erase( - static_cast<int32>(registered_objects_.size())); - } } Buffer CommandBufferService::GetTransferBuffer(int32 handle) { - if (handle < 0) - return Buffer(); - - if (static_cast<size_t>(handle) >= registered_objects_.size()) - return Buffer(); - - return registered_objects_[handle]; + return transfer_buffer_manager_->GetTransferBuffer(handle); } void CommandBufferService::SetToken(int32 token) { |