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 |