OLD | NEW |
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::kManaged)), |
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 Loading... |
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 |
OLD | NEW |