Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: gpu/command_buffer/service/buffer_manager.cc

Issue 11516014: Track managed memory usage in the command buffer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Resolve against HEAD Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/buffer_manager.h" 5 #include "gpu/command_buffer/service/buffer_manager.h"
6 #include <limits> 6 #include <limits>
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 9 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
11 #include "gpu/command_buffer/service/memory_tracking.h" 11 #include "gpu/command_buffer/service/memory_tracking.h"
12 12
13 namespace gpu { 13 namespace gpu {
14 namespace gles2 { 14 namespace gles2 {
15 15
16 BufferManager::BufferManager(MemoryTracker* memory_tracker) 16 BufferManager::BufferManager(MemoryTracker* memory_tracker)
17 : buffer_memory_tracker_(new MemoryTypeTracker(memory_tracker)), 17 : memory_tracker_(
18 new MemoryTypeTracker(memory_tracker, MemoryTracker::Managed)),
18 allow_buffers_on_multiple_targets_(false), 19 allow_buffers_on_multiple_targets_(false),
19 mem_represented_(0),
20 buffer_info_count_(0), 20 buffer_info_count_(0),
21 have_context_(true) { 21 have_context_(true) {
22 UpdateMemRepresented(); 22 memory_tracker_->UpdateMemRepresented();
23 } 23 }
24 24
25 BufferManager::~BufferManager() { 25 BufferManager::~BufferManager() {
26 DCHECK(buffer_infos_.empty()); 26 DCHECK(buffer_infos_.empty());
27 CHECK_EQ(buffer_info_count_, 0u); 27 CHECK_EQ(buffer_info_count_, 0u);
28 } 28 }
29 29
30 void BufferManager::Destroy(bool have_context) { 30 void BufferManager::Destroy(bool have_context) {
31 have_context_ = have_context; 31 have_context_ = have_context;
32 buffer_infos_.clear(); 32 buffer_infos_.clear();
33 DCHECK_EQ(0u, mem_represented_); 33 DCHECK_EQ(0u, memory_tracker_->GetMemRepresented());
34 UpdateMemRepresented(); 34 memory_tracker_->UpdateMemRepresented();
35 }
36
37 void BufferManager::UpdateMemRepresented() {
38 buffer_memory_tracker_->UpdateMemRepresented(mem_represented_);
39 } 35 }
40 36
41 void BufferManager::CreateBufferInfo(GLuint client_id, GLuint service_id) { 37 void BufferManager::CreateBufferInfo(GLuint client_id, GLuint service_id) {
42 BufferInfo::Ref buffer(new BufferInfo(this, service_id)); 38 BufferInfo::Ref buffer(new BufferInfo(this, service_id));
43 std::pair<BufferInfoMap::iterator, bool> result = 39 std::pair<BufferInfoMap::iterator, bool> result =
44 buffer_infos_.insert(std::make_pair(client_id, buffer)); 40 buffer_infos_.insert(std::make_pair(client_id, buffer));
45 DCHECK(result.second); 41 DCHECK(result.second);
46 } 42 }
47 43
48 BufferManager::BufferInfo* BufferManager::GetBufferInfo( 44 BufferManager::BufferInfo* BufferManager::GetBufferInfo(
49 GLuint client_id) { 45 GLuint client_id) {
50 BufferInfoMap::iterator it = buffer_infos_.find(client_id); 46 BufferInfoMap::iterator it = buffer_infos_.find(client_id);
51 return it != buffer_infos_.end() ? it->second : NULL; 47 return it != buffer_infos_.end() ? it->second : NULL;
52 } 48 }
53 49
54 void BufferManager::RemoveBufferInfo(GLuint client_id) { 50 void BufferManager::RemoveBufferInfo(GLuint client_id) {
55 BufferInfoMap::iterator it = buffer_infos_.find(client_id); 51 BufferInfoMap::iterator it = buffer_infos_.find(client_id);
56 if (it != buffer_infos_.end()) { 52 if (it != buffer_infos_.end()) {
57 BufferInfo* buffer = it->second; 53 BufferInfo* buffer = it->second;
58 buffer->MarkAsDeleted(); 54 buffer->MarkAsDeleted();
59 buffer_infos_.erase(it); 55 buffer_infos_.erase(it);
60 } 56 }
61 } 57 }
62 58
63 void BufferManager::StartTracking(BufferManager::BufferInfo* /* buffer */) { 59 void BufferManager::StartTracking(BufferManager::BufferInfo* /* buffer */) {
64 ++buffer_info_count_; 60 ++buffer_info_count_;
65 } 61 }
66 62
67 void BufferManager::StopTracking(BufferManager::BufferInfo* buffer) { 63 void BufferManager::StopTracking(BufferManager::BufferInfo* buffer) {
68 mem_represented_ -= buffer->size(); 64 memory_tracker_->TrackMemFree(buffer->size());
69 --buffer_info_count_; 65 --buffer_info_count_;
70 UpdateMemRepresented(); 66 memory_tracker_->UpdateMemRepresented();
71 } 67 }
72 68
73 BufferManager::BufferInfo::BufferInfo(BufferManager* manager, GLuint service_id) 69 BufferManager::BufferInfo::BufferInfo(BufferManager* manager, GLuint service_id)
74 : manager_(manager), 70 : manager_(manager),
75 deleted_(false), 71 deleted_(false),
76 service_id_(service_id), 72 service_id_(service_id),
77 target_(0), 73 target_(0),
78 size_(0), 74 size_(0),
79 usage_(GL_STATIC_DRAW), 75 usage_(GL_STATIC_DRAW),
80 shadowed_(false) { 76 shadowed_(false) {
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 *client_id = it->first; 216 *client_id = it->first;
221 return true; 217 return true;
222 } 218 }
223 } 219 }
224 return false; 220 return false;
225 } 221 }
226 222
227 void BufferManager::SetInfo( 223 void BufferManager::SetInfo(
228 BufferManager::BufferInfo* info, GLsizeiptr size, GLenum usage) { 224 BufferManager::BufferInfo* info, GLsizeiptr size, GLenum usage) {
229 DCHECK(info); 225 DCHECK(info);
230 mem_represented_ -= info->size(); 226 memory_tracker_->TrackMemFree(info->size());
231 info->SetInfo(size, 227 info->SetInfo(size,
232 usage, 228 usage,
233 info->target() == GL_ELEMENT_ARRAY_BUFFER || 229 info->target() == GL_ELEMENT_ARRAY_BUFFER ||
234 allow_buffers_on_multiple_targets_); 230 allow_buffers_on_multiple_targets_);
235 mem_represented_ += info->size(); 231 memory_tracker_->TrackMemAlloc(info->size());
232 memory_tracker_->UpdateMemRepresented();
236 } 233 }
237 234
238 bool BufferManager::SetTarget(BufferManager::BufferInfo* info, GLenum target) { 235 bool BufferManager::SetTarget(BufferManager::BufferInfo* info, GLenum target) {
239 // Check that we are not trying to bind it to a different target. 236 // Check that we are not trying to bind it to a different target.
240 if (info->target() != 0 && info->target() != target && 237 if (info->target() != 0 && info->target() != target &&
241 !allow_buffers_on_multiple_targets_) { 238 !allow_buffers_on_multiple_targets_) {
242 return false; 239 return false;
243 } 240 }
244 if (info->target() == 0) { 241 if (info->target() == 0) {
245 info->set_target(target); 242 info->set_target(target);
246 } 243 }
247 return true; 244 return true;
248 } 245 }
249 246
250 } // namespace gles2 247 } // namespace gles2
251 } // namespace gpu 248 } // namespace gpu
252 249
253 250
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698