| 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/renderbuffer_manager.h" | 5 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
| 6 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.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" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 max_renderbuffer_size_(max_renderbuffer_size), | 23 max_renderbuffer_size_(max_renderbuffer_size), |
| 24 max_samples_(max_samples), | 24 max_samples_(max_samples), |
| 25 num_uncleared_renderbuffers_(0), | 25 num_uncleared_renderbuffers_(0), |
| 26 renderbuffer_info_count_(0), | 26 renderbuffer_info_count_(0), |
| 27 have_context_(true) { | 27 have_context_(true) { |
| 28 } | 28 } |
| 29 | 29 |
| 30 RenderbufferManager::~RenderbufferManager() { | 30 RenderbufferManager::~RenderbufferManager() { |
| 31 DCHECK(renderbuffer_infos_.empty()); | 31 DCHECK(renderbuffer_infos_.empty()); |
| 32 // If this triggers, that means something is keeping a reference to | 32 // If this triggers, that means something is keeping a reference to |
| 33 // a RenderbufferInfo belonging to this. | 33 // a Renderbuffer belonging to this. |
| 34 CHECK_EQ(renderbuffer_info_count_, 0u); | 34 CHECK_EQ(renderbuffer_info_count_, 0u); |
| 35 | 35 |
| 36 DCHECK_EQ(0, num_uncleared_renderbuffers_); | 36 DCHECK_EQ(0, num_uncleared_renderbuffers_); |
| 37 } | 37 } |
| 38 | 38 |
| 39 size_t RenderbufferManager::RenderbufferInfo::EstimatedSize() { | 39 size_t Renderbuffer::EstimatedSize() { |
| 40 uint32 size = 0; | 40 uint32 size = 0; |
| 41 RenderbufferManager::ComputeEstimatedRenderbufferSize( | 41 RenderbufferManager::ComputeEstimatedRenderbufferSize( |
| 42 width_, height_, samples_, internal_format_, &size); | 42 width_, height_, samples_, internal_format_, &size); |
| 43 return size; | 43 return size; |
| 44 } | 44 } |
| 45 | 45 |
| 46 void RenderbufferManager::RenderbufferInfo::AddToSignature( | 46 void Renderbuffer::AddToSignature( |
| 47 std::string* signature) const { | 47 std::string* signature) const { |
| 48 DCHECK(signature); | 48 DCHECK(signature); |
| 49 *signature += base::StringPrintf( | 49 *signature += base::StringPrintf( |
| 50 "|Renderbuffer|internal_format=%04x|samples=%d|width=%d|height=%d", | 50 "|Renderbuffer|internal_format=%04x|samples=%d|width=%d|height=%d", |
| 51 internal_format_, samples_, width_, height_); | 51 internal_format_, samples_, width_, height_); |
| 52 } | 52 } |
| 53 | 53 |
| 54 RenderbufferManager::RenderbufferInfo::~RenderbufferInfo() { | 54 Renderbuffer::Renderbuffer(RenderbufferManager* manager, GLuint service_id) |
| 55 : manager_(manager), |
| 56 deleted_(false), |
| 57 service_id_(service_id), |
| 58 cleared_(true), |
| 59 has_been_bound_(false), |
| 60 samples_(0), |
| 61 internal_format_(GL_RGBA4), |
| 62 width_(0), |
| 63 height_(0) { |
| 64 manager_->StartTracking(this); |
| 65 } |
| 66 |
| 67 Renderbuffer::~Renderbuffer() { |
| 55 if (manager_) { | 68 if (manager_) { |
| 56 if (manager_->have_context_) { | 69 if (manager_->have_context_) { |
| 57 GLuint id = service_id(); | 70 GLuint id = service_id(); |
| 58 glDeleteRenderbuffersEXT(1, &id); | 71 glDeleteRenderbuffersEXT(1, &id); |
| 59 } | 72 } |
| 60 manager_->StopTracking(this); | 73 manager_->StopTracking(this); |
| 61 manager_ = NULL; | 74 manager_ = NULL; |
| 62 } | 75 } |
| 63 } | 76 } |
| 64 | 77 |
| 65 void RenderbufferManager::Destroy(bool have_context) { | 78 void RenderbufferManager::Destroy(bool have_context) { |
| 66 have_context_ = have_context; | 79 have_context_ = have_context; |
| 67 renderbuffer_infos_.clear(); | 80 renderbuffer_infos_.clear(); |
| 68 DCHECK_EQ(0u, memory_tracker_->GetMemRepresented()); | 81 DCHECK_EQ(0u, memory_tracker_->GetMemRepresented()); |
| 69 } | 82 } |
| 70 | 83 |
| 71 void RenderbufferManager::StartTracking(RenderbufferInfo* /* renderbuffer */) { | 84 void RenderbufferManager::StartTracking(Renderbuffer* /* renderbuffer */) { |
| 72 ++renderbuffer_info_count_; | 85 ++renderbuffer_info_count_; |
| 73 } | 86 } |
| 74 | 87 |
| 75 void RenderbufferManager::StopTracking(RenderbufferInfo* renderbuffer) { | 88 void RenderbufferManager::StopTracking(Renderbuffer* renderbuffer) { |
| 76 --renderbuffer_info_count_; | 89 --renderbuffer_info_count_; |
| 77 if (!renderbuffer->cleared()) { | 90 if (!renderbuffer->cleared()) { |
| 78 --num_uncleared_renderbuffers_; | 91 --num_uncleared_renderbuffers_; |
| 79 } | 92 } |
| 80 memory_tracker_->TrackMemFree(renderbuffer->EstimatedSize()); | 93 memory_tracker_->TrackMemFree(renderbuffer->EstimatedSize()); |
| 81 } | 94 } |
| 82 | 95 |
| 83 void RenderbufferManager::SetInfo( | 96 void RenderbufferManager::SetInfo( |
| 84 RenderbufferInfo* renderbuffer, | 97 Renderbuffer* renderbuffer, |
| 85 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { | 98 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { |
| 86 DCHECK(renderbuffer); | 99 DCHECK(renderbuffer); |
| 87 if (!renderbuffer->cleared()) { | 100 if (!renderbuffer->cleared()) { |
| 88 --num_uncleared_renderbuffers_; | 101 --num_uncleared_renderbuffers_; |
| 89 } | 102 } |
| 90 memory_tracker_->TrackMemFree(renderbuffer->EstimatedSize()); | 103 memory_tracker_->TrackMemFree(renderbuffer->EstimatedSize()); |
| 91 renderbuffer->SetInfo(samples, internalformat, width, height); | 104 renderbuffer->SetInfo(samples, internalformat, width, height); |
| 92 memory_tracker_->TrackMemAlloc(renderbuffer->EstimatedSize()); | 105 memory_tracker_->TrackMemAlloc(renderbuffer->EstimatedSize()); |
| 93 if (!renderbuffer->cleared()) { | 106 if (!renderbuffer->cleared()) { |
| 94 ++num_uncleared_renderbuffers_; | 107 ++num_uncleared_renderbuffers_; |
| 95 } | 108 } |
| 96 } | 109 } |
| 97 | 110 |
| 98 void RenderbufferManager::SetCleared(RenderbufferInfo* renderbuffer, | 111 void RenderbufferManager::SetCleared(Renderbuffer* renderbuffer, |
| 99 bool cleared) { | 112 bool cleared) { |
| 100 DCHECK(renderbuffer); | 113 DCHECK(renderbuffer); |
| 101 if (!renderbuffer->cleared()) { | 114 if (!renderbuffer->cleared()) { |
| 102 --num_uncleared_renderbuffers_; | 115 --num_uncleared_renderbuffers_; |
| 103 } | 116 } |
| 104 renderbuffer->set_cleared(cleared); | 117 renderbuffer->set_cleared(cleared); |
| 105 if (!renderbuffer->cleared()) { | 118 if (!renderbuffer->cleared()) { |
| 106 ++num_uncleared_renderbuffers_; | 119 ++num_uncleared_renderbuffers_; |
| 107 } | 120 } |
| 108 } | 121 } |
| 109 | 122 |
| 110 void RenderbufferManager::CreateRenderbufferInfo( | 123 void RenderbufferManager::CreateRenderbuffer( |
| 111 GLuint client_id, GLuint service_id) { | 124 GLuint client_id, GLuint service_id) { |
| 112 RenderbufferInfo::Ref info(new RenderbufferInfo(this, service_id)); | 125 scoped_refptr<Renderbuffer> info(new Renderbuffer(this, service_id)); |
| 113 std::pair<RenderbufferInfoMap::iterator, bool> result = | 126 std::pair<RenderbufferInfoMap::iterator, bool> result = |
| 114 renderbuffer_infos_.insert(std::make_pair(client_id, info)); | 127 renderbuffer_infos_.insert(std::make_pair(client_id, info)); |
| 115 DCHECK(result.second); | 128 DCHECK(result.second); |
| 116 if (!info->cleared()) { | 129 if (!info->cleared()) { |
| 117 ++num_uncleared_renderbuffers_; | 130 ++num_uncleared_renderbuffers_; |
| 118 } | 131 } |
| 119 } | 132 } |
| 120 | 133 |
| 121 RenderbufferManager::RenderbufferInfo* RenderbufferManager::GetRenderbufferInfo( | 134 Renderbuffer* RenderbufferManager::GetRenderbuffer( |
| 122 GLuint client_id) { | 135 GLuint client_id) { |
| 123 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id); | 136 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id); |
| 124 return it != renderbuffer_infos_.end() ? it->second : NULL; | 137 return it != renderbuffer_infos_.end() ? it->second : NULL; |
| 125 } | 138 } |
| 126 | 139 |
| 127 void RenderbufferManager::RemoveRenderbufferInfo(GLuint client_id) { | 140 void RenderbufferManager::RemoveRenderbuffer(GLuint client_id) { |
| 128 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id); | 141 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id); |
| 129 if (it != renderbuffer_infos_.end()) { | 142 if (it != renderbuffer_infos_.end()) { |
| 130 RenderbufferInfo* info = it->second; | 143 Renderbuffer* info = it->second; |
| 131 info->MarkAsDeleted(); | 144 info->MarkAsDeleted(); |
| 132 renderbuffer_infos_.erase(it); | 145 renderbuffer_infos_.erase(it); |
| 133 } | 146 } |
| 134 } | 147 } |
| 135 | 148 |
| 136 bool RenderbufferManager::GetClientId( | 149 bool RenderbufferManager::GetClientId( |
| 137 GLuint service_id, GLuint* client_id) const { | 150 GLuint service_id, GLuint* client_id) const { |
| 138 // This doesn't need to be fast. It's only used during slow queries. | 151 // This doesn't need to be fast. It's only used during slow queries. |
| 139 for (RenderbufferInfoMap::const_iterator it = renderbuffer_infos_.begin(); | 152 for (RenderbufferInfoMap::const_iterator it = renderbuffer_infos_.begin(); |
| 140 it != renderbuffer_infos_.end(); ++it) { | 153 it != renderbuffer_infos_.end(); ++it) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 return GL_RGB; | 192 return GL_RGB; |
| 180 } | 193 } |
| 181 } | 194 } |
| 182 return impl_format; | 195 return impl_format; |
| 183 } | 196 } |
| 184 | 197 |
| 185 } // namespace gles2 | 198 } // namespace gles2 |
| 186 } // namespace gpu | 199 } // namespace gpu |
| 187 | 200 |
| 188 | 201 |
| OLD | NEW |