summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/command_buffer_service.cc
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-26 08:05:03 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-26 08:05:03 +0000
commitc87015f53fc61bea2b94f2dc80d0c699d9aebcd5 (patch)
treee34dd0f6151caef21cf51ea39c67af080127fccc /gpu/command_buffer/service/command_buffer_service.cc
parent12e54045b113f6aca10188b012b1ea529cec6bf2 (diff)
downloadchromium_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.cc122
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) {