diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-23 12:26:49 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-23 12:26:49 +0000 |
commit | b0458150b48ad8d96fdbc178f9668a5387878f97 (patch) | |
tree | 51d72e09825e470c2f3c8bee55e3e2b133d66c45 /gpu | |
parent | c99c7661bf30730d33d62d93c39d593f98d5f1b6 (diff) | |
download | chromium_src-b0458150b48ad8d96fdbc178f9668a5387878f97.zip chromium_src-b0458150b48ad8d96fdbc178f9668a5387878f97.tar.gz chromium_src-b0458150b48ad8d96fdbc178f9668a5387878f97.tar.bz2 |
Track buffer memory in command buffer
TEST=none, DCHECK
BUG=79762
R=apatrick@chromium.org
Review URL: http://codereview.chromium.org/9032002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@115710 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/buffer_manager.cc | 26 | ||||
-rw-r--r-- | gpu/command_buffer/service/buffer_manager.h | 5 |
2 files changed, 28 insertions, 3 deletions
diff --git a/gpu/command_buffer/service/buffer_manager.cc b/gpu/command_buffer/service/buffer_manager.cc index fb9f215..9670766 100644 --- a/gpu/command_buffer/service/buffer_manager.cc +++ b/gpu/command_buffer/service/buffer_manager.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "gpu/command_buffer/service/buffer_manager.h" +#include "base/debug/trace_event.h" #include "base/logging.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" @@ -11,7 +12,10 @@ namespace gpu { namespace gles2 { BufferManager::BufferManager() - : allow_buffers_on_multiple_targets_(false) { + : allow_buffers_on_multiple_targets_(false), + mem_represented_(0), + last_reported_mem_represented_(1) { + UpdateMemRepresented(); } BufferManager::~BufferManager() { @@ -20,8 +24,9 @@ BufferManager::~BufferManager() { void BufferManager::Destroy(bool have_context) { while (!buffer_infos_.empty()) { + BufferInfo* info = buffer_infos_.begin()->second; + mem_represented_ -= info->size(); if (have_context) { - BufferInfo* info = buffer_infos_.begin()->second; if (!info->IsDeleted()) { GLuint service_id = info->service_id(); glDeleteBuffersARB(1, &service_id); @@ -30,6 +35,16 @@ void BufferManager::Destroy(bool have_context) { } buffer_infos_.erase(buffer_infos_.begin()); } + DCHECK_EQ(0u, mem_represented_); + UpdateMemRepresented(); +} + +void BufferManager::UpdateMemRepresented() { + if (mem_represented_ != last_reported_mem_represented_) { + last_reported_mem_represented_ = mem_represented_; + TRACE_COUNTER_ID1( + "BufferManager", "BufferMemory", this, mem_represented_); + } } void BufferManager::CreateBufferInfo(GLuint client_id, GLuint service_id) { @@ -49,7 +64,10 @@ BufferManager::BufferInfo* BufferManager::GetBufferInfo( void BufferManager::RemoveBufferInfo(GLuint client_id) { BufferInfoMap::iterator it = buffer_infos_.find(client_id); if (it != buffer_infos_.end()) { - it->second->MarkAsDeleted(); + BufferInfo* buffer = it->second; + buffer->MarkAsDeleted(); + mem_represented_ -= buffer->size(); + UpdateMemRepresented(); buffer_infos_.erase(it); } } @@ -190,10 +208,12 @@ bool BufferManager::GetClientId(GLuint service_id, GLuint* client_id) const { void BufferManager::SetInfo( BufferManager::BufferInfo* info, GLsizeiptr size, GLenum usage) { DCHECK(info); + mem_represented_ -= info->size(); info->SetInfo(size, usage, info->target() == GL_ELEMENT_ARRAY_BUFFER || allow_buffers_on_multiple_targets_); + mem_represented_ += info->size(); } bool BufferManager::SetTarget(BufferManager::BufferInfo* info, GLenum target) { diff --git a/gpu/command_buffer/service/buffer_manager.h b/gpu/command_buffer/service/buffer_manager.h index dedf5d1..d59f755 100644 --- a/gpu/command_buffer/service/buffer_manager.h +++ b/gpu/command_buffer/service/buffer_manager.h @@ -177,6 +177,8 @@ class BufferManager { } private: + void UpdateMemRepresented(); + // Info for each buffer in the system. typedef base::hash_map<GLuint, BufferInfo::Ref> BufferInfoMap; BufferInfoMap buffer_infos_; @@ -184,6 +186,9 @@ class BufferManager { // Whether or not buffers can be bound to multiple targets. bool allow_buffers_on_multiple_targets_; + size_t mem_represented_; + size_t last_reported_mem_represented_; + DISALLOW_COPY_AND_ASSIGN(BufferManager); }; |