| 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 |