summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-23 12:26:49 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-23 12:26:49 +0000
commitb0458150b48ad8d96fdbc178f9668a5387878f97 (patch)
tree51d72e09825e470c2f3c8bee55e3e2b133d66c45 /gpu
parentc99c7661bf30730d33d62d93c39d593f98d5f1b6 (diff)
downloadchromium_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.cc26
-rw-r--r--gpu/command_buffer/service/buffer_manager.h5
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);
};