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

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

Issue 12326146: Refactor/Rename a bunch of GPU stuff (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months 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/framebuffer_manager.h" 5 #include "gpu/command_buffer/service/framebuffer_manager.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 #include "base/stringprintf.h" 7 #include "base/stringprintf.h"
8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
9 #include "ui/gl/gl_bindings.h" 9 #include "ui/gl/gl_bindings.h"
10 10
11 namespace gpu { 11 namespace gpu {
12 namespace gles2 { 12 namespace gles2 {
13 13
14 FramebufferManager::FramebufferInfo::FramebufferComboCompleteMap* 14 Framebuffer::FramebufferComboCompleteMap*
15 FramebufferManager::FramebufferInfo::framebuffer_combo_complete_map_; 15 Framebuffer::framebuffer_combo_complete_map_;
16 16
17 void FramebufferManager::FramebufferInfo::ClearFramebufferCompleteComboMap() { 17 void Framebuffer::ClearFramebufferCompleteComboMap() {
18 if (framebuffer_combo_complete_map_) { 18 if (framebuffer_combo_complete_map_) {
19 framebuffer_combo_complete_map_->clear(); 19 framebuffer_combo_complete_map_->clear();
20 } 20 }
21 } 21 }
22 22
23 class RenderbufferAttachment 23 class RenderbufferAttachment
24 : public FramebufferManager::FramebufferInfo::Attachment { 24 : public Framebuffer::Attachment {
25 public: 25 public:
26 explicit RenderbufferAttachment( 26 explicit RenderbufferAttachment(
27 RenderbufferManager::RenderbufferInfo* renderbuffer) 27 Renderbuffer* renderbuffer)
28 : renderbuffer_(renderbuffer) { 28 : renderbuffer_(renderbuffer) {
29 } 29 }
30 30
31 virtual GLsizei width() const OVERRIDE { 31 virtual GLsizei width() const OVERRIDE {
32 return renderbuffer_->width(); 32 return renderbuffer_->width();
33 } 33 }
34 34
35 virtual GLsizei height() const OVERRIDE { 35 virtual GLsizei height() const OVERRIDE {
36 return renderbuffer_->height(); 36 return renderbuffer_->height();
37 } 37 }
(...skipping 11 matching lines...) Expand all
49 } 49 }
50 50
51 virtual void SetCleared( 51 virtual void SetCleared(
52 RenderbufferManager* renderbuffer_manager, 52 RenderbufferManager* renderbuffer_manager,
53 TextureManager* /* texture_manager */, 53 TextureManager* /* texture_manager */,
54 bool cleared) OVERRIDE { 54 bool cleared) OVERRIDE {
55 renderbuffer_manager->SetCleared(renderbuffer_, cleared); 55 renderbuffer_manager->SetCleared(renderbuffer_, cleared);
56 } 56 }
57 57
58 virtual bool IsTexture( 58 virtual bool IsTexture(
59 TextureManager::TextureInfo* /* texture */) const OVERRIDE { 59 Texture* /* texture */) const OVERRIDE {
60 return false; 60 return false;
61 } 61 }
62 62
63 virtual bool IsRenderbuffer( 63 virtual bool IsRenderbuffer(
64 RenderbufferManager::RenderbufferInfo* renderbuffer) const OVERRIDE { 64 Renderbuffer* renderbuffer) const OVERRIDE {
65 return renderbuffer_ == renderbuffer; 65 return renderbuffer_ == renderbuffer;
66 } 66 }
67 67
68 virtual bool CanRenderTo() const OVERRIDE { 68 virtual bool CanRenderTo() const OVERRIDE {
69 return true; 69 return true;
70 } 70 }
71 71
72 virtual void DetachFromFramebuffer() const OVERRIDE { 72 virtual void DetachFromFramebuffer() const OVERRIDE {
73 // Nothing to do for renderbuffers. 73 // Nothing to do for renderbuffers.
74 } 74 }
75 75
76 virtual bool ValidForAttachmentType(GLenum attachment_type) OVERRIDE { 76 virtual bool ValidForAttachmentType(GLenum attachment_type) OVERRIDE {
77 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( 77 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType(
78 attachment_type); 78 attachment_type);
79 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); 79 uint32 have = GLES2Util::GetChannelsForFormat(internal_format());
80 return (need & have) != 0; 80 return (need & have) != 0;
81 } 81 }
82 82
83 RenderbufferManager::RenderbufferInfo* renderbuffer() const { 83 Renderbuffer* renderbuffer() const {
84 return renderbuffer_.get(); 84 return renderbuffer_.get();
85 } 85 }
86 86
87 virtual void AddToSignature( 87 virtual void AddToSignature(
88 TextureManager* texture_manager, std::string* signature) const OVERRIDE { 88 TextureManager* texture_manager, std::string* signature) const OVERRIDE {
89 DCHECK(signature); 89 DCHECK(signature);
90 renderbuffer_->AddToSignature(signature); 90 renderbuffer_->AddToSignature(signature);
91 } 91 }
92 92
93 protected: 93 protected:
94 virtual ~RenderbufferAttachment() { } 94 virtual ~RenderbufferAttachment() { }
95 95
96 private: 96 private:
97 RenderbufferManager::RenderbufferInfo::Ref renderbuffer_; 97 scoped_refptr<Renderbuffer> renderbuffer_;
98 98
99 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); 99 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment);
100 }; 100 };
101 101
102 class TextureAttachment 102 class TextureAttachment
103 : public FramebufferManager::FramebufferInfo::Attachment { 103 : public Framebuffer::Attachment {
104 public: 104 public:
105 TextureAttachment( 105 TextureAttachment(
106 TextureManager::TextureInfo* texture, GLenum target, GLint level) 106 Texture* texture, GLenum target, GLint level)
107 : texture_(texture), 107 : texture_(texture),
108 target_(target), 108 target_(target),
109 level_(level) { 109 level_(level) {
110 } 110 }
111 111
112 virtual GLsizei width() const OVERRIDE { 112 virtual GLsizei width() const OVERRIDE {
113 GLsizei temp_width = 0; 113 GLsizei temp_width = 0;
114 GLsizei temp_height = 0; 114 GLsizei temp_height = 0;
115 texture_->GetLevelSize(target_, level_, &temp_width, &temp_height); 115 texture_->GetLevelSize(target_, level_, &temp_width, &temp_height);
116 return temp_width; 116 return temp_width;
(...skipping 21 matching lines...) Expand all
138 return texture_->IsLevelCleared(target_, level_); 138 return texture_->IsLevelCleared(target_, level_);
139 } 139 }
140 140
141 virtual void SetCleared( 141 virtual void SetCleared(
142 RenderbufferManager* /* renderbuffer_manager */, 142 RenderbufferManager* /* renderbuffer_manager */,
143 TextureManager* texture_manager, 143 TextureManager* texture_manager,
144 bool cleared) OVERRIDE { 144 bool cleared) OVERRIDE {
145 texture_manager->SetLevelCleared(texture_, target_, level_, cleared); 145 texture_manager->SetLevelCleared(texture_, target_, level_, cleared);
146 } 146 }
147 147
148 virtual bool IsTexture(TextureManager::TextureInfo* texture) const OVERRIDE { 148 virtual bool IsTexture(Texture* texture) const OVERRIDE {
149 return texture == texture_.get(); 149 return texture == texture_.get();
150 } 150 }
151 151
152 virtual bool IsRenderbuffer( 152 virtual bool IsRenderbuffer(
153 RenderbufferManager::RenderbufferInfo* /* renderbuffer */) 153 Renderbuffer* /* renderbuffer */)
154 const OVERRIDE { 154 const OVERRIDE {
155 return false; 155 return false;
156 } 156 }
157 157
158 TextureManager::TextureInfo* texture() const { 158 Texture* texture() const {
159 return texture_.get(); 159 return texture_.get();
160 } 160 }
161 161
162 virtual bool CanRenderTo() const OVERRIDE { 162 virtual bool CanRenderTo() const OVERRIDE {
163 return texture_->CanRenderTo(); 163 return texture_->CanRenderTo();
164 } 164 }
165 165
166 virtual void DetachFromFramebuffer() const OVERRIDE { 166 virtual void DetachFromFramebuffer() const OVERRIDE {
167 texture_->DetachFromFramebuffer(); 167 texture_->DetachFromFramebuffer();
168 } 168 }
(...skipping 13 matching lines...) Expand all
182 virtual void AddToSignature( 182 virtual void AddToSignature(
183 TextureManager* texture_manager, std::string* signature) const OVERRIDE { 183 TextureManager* texture_manager, std::string* signature) const OVERRIDE {
184 DCHECK(signature); 184 DCHECK(signature);
185 texture_manager->AddToSignature(texture_, target_, level_, signature); 185 texture_manager->AddToSignature(texture_, target_, level_, signature);
186 } 186 }
187 187
188 protected: 188 protected:
189 virtual ~TextureAttachment() {} 189 virtual ~TextureAttachment() {}
190 190
191 private: 191 private:
192 TextureManager::TextureInfo::Ref texture_; 192 scoped_refptr<Texture> texture_;
193 GLenum target_; 193 GLenum target_;
194 GLint level_; 194 GLint level_;
195 195
196 DISALLOW_COPY_AND_ASSIGN(TextureAttachment); 196 DISALLOW_COPY_AND_ASSIGN(TextureAttachment);
197 }; 197 };
198 198
199 FramebufferManager::FramebufferManager() 199 FramebufferManager::FramebufferManager()
200 : framebuffer_state_change_count_(1), 200 : framebuffer_state_change_count_(1),
201 framebuffer_info_count_(0), 201 framebuffer_info_count_(0),
202 have_context_(true) { 202 have_context_(true) {
203 } 203 }
204 204
205 FramebufferManager::~FramebufferManager() { 205 FramebufferManager::~FramebufferManager() {
206 DCHECK(framebuffer_infos_.empty()); 206 DCHECK(framebuffer_infos_.empty());
207 // If this triggers, that means something is keeping a reference to a 207 // If this triggers, that means something is keeping a reference to a
208 // FramebufferInfo belonging to this. 208 // Framebuffer belonging to this.
209 CHECK_EQ(framebuffer_info_count_, 0u); 209 CHECK_EQ(framebuffer_info_count_, 0u);
210 } 210 }
211 211
212 void FramebufferManager::FramebufferInfo::MarkAsDeleted() { 212 void Framebuffer::MarkAsDeleted() {
213 deleted_ = true; 213 deleted_ = true;
214 while (!attachments_.empty()) { 214 while (!attachments_.empty()) {
215 Attachment* attachment = attachments_.begin()->second.get(); 215 Attachment* attachment = attachments_.begin()->second.get();
216 attachment->DetachFromFramebuffer(); 216 attachment->DetachFromFramebuffer();
217 attachments_.erase(attachments_.begin()); 217 attachments_.erase(attachments_.begin());
218 } 218 }
219 } 219 }
220 220
221 void FramebufferManager::Destroy(bool have_context) { 221 void FramebufferManager::Destroy(bool have_context) {
222 have_context_ = have_context; 222 have_context_ = have_context;
223 framebuffer_infos_.clear(); 223 framebuffer_infos_.clear();
224 } 224 }
225 225
226 void FramebufferManager::StartTracking( 226 void FramebufferManager::StartTracking(
227 FramebufferManager::FramebufferInfo* /* framebuffer */) { 227 Framebuffer* /* framebuffer */) {
228 ++framebuffer_info_count_; 228 ++framebuffer_info_count_;
229 } 229 }
230 230
231 void FramebufferManager::StopTracking( 231 void FramebufferManager::StopTracking(
232 FramebufferManager::FramebufferInfo* /* framebuffer */) { 232 Framebuffer* /* framebuffer */) {
233 --framebuffer_info_count_; 233 --framebuffer_info_count_;
234 } 234 }
235 235
236 void FramebufferManager::CreateFramebufferInfo( 236 void FramebufferManager::CreateFramebuffer(
237 GLuint client_id, GLuint service_id) { 237 GLuint client_id, GLuint service_id) {
238 std::pair<FramebufferInfoMap::iterator, bool> result = 238 std::pair<FramebufferInfoMap::iterator, bool> result =
239 framebuffer_infos_.insert( 239 framebuffer_infos_.insert(
240 std::make_pair( 240 std::make_pair(
241 client_id, 241 client_id,
242 FramebufferInfo::Ref(new FramebufferInfo(this, service_id)))); 242 scoped_refptr<Framebuffer>(
243 new Framebuffer(this, service_id))));
243 DCHECK(result.second); 244 DCHECK(result.second);
244 } 245 }
245 246
246 FramebufferManager::FramebufferInfo::FramebufferInfo( 247 Framebuffer::Framebuffer(
247 FramebufferManager* manager, GLuint service_id) 248 FramebufferManager* manager, GLuint service_id)
248 : manager_(manager), 249 : manager_(manager),
249 deleted_(false), 250 deleted_(false),
250 service_id_(service_id), 251 service_id_(service_id),
251 has_been_bound_(false), 252 has_been_bound_(false),
252 framebuffer_complete_state_count_id_(0) { 253 framebuffer_complete_state_count_id_(0) {
253 manager->StartTracking(this); 254 manager->StartTracking(this);
254 } 255 }
255 256
256 FramebufferManager::FramebufferInfo::~FramebufferInfo() { 257 Framebuffer::~Framebuffer() {
257 if (manager_) { 258 if (manager_) {
258 if (manager_->have_context_) { 259 if (manager_->have_context_) {
259 GLuint id = service_id(); 260 GLuint id = service_id();
260 glDeleteFramebuffersEXT(1, &id); 261 glDeleteFramebuffersEXT(1, &id);
261 } 262 }
262 manager_->StopTracking(this); 263 manager_->StopTracking(this);
263 manager_ = NULL; 264 manager_ = NULL;
264 } 265 }
265 } 266 }
266 267
267 bool FramebufferManager::FramebufferInfo::HasUnclearedAttachment( 268 bool Framebuffer::HasUnclearedAttachment(
268 GLenum attachment) const { 269 GLenum attachment) const {
269 AttachmentMap::const_iterator it = 270 AttachmentMap::const_iterator it =
270 attachments_.find(attachment); 271 attachments_.find(attachment);
271 if (it != attachments_.end()) { 272 if (it != attachments_.end()) {
272 const Attachment* attachment = it->second; 273 const Attachment* attachment = it->second;
273 return !attachment->cleared(); 274 return !attachment->cleared();
274 } 275 }
275 return false; 276 return false;
276 } 277 }
277 278
278 void FramebufferManager::FramebufferInfo::MarkAttachmentAsCleared( 279 void Framebuffer::MarkAttachmentAsCleared(
279 RenderbufferManager* renderbuffer_manager, 280 RenderbufferManager* renderbuffer_manager,
280 TextureManager* texture_manager, 281 TextureManager* texture_manager,
281 GLenum attachment, 282 GLenum attachment,
282 bool cleared) { 283 bool cleared) {
283 AttachmentMap::iterator it = attachments_.find(attachment); 284 AttachmentMap::iterator it = attachments_.find(attachment);
284 if (it != attachments_.end()) { 285 if (it != attachments_.end()) {
285 Attachment* a = it->second; 286 Attachment* a = it->second;
286 if (a->cleared() != cleared) { 287 if (a->cleared() != cleared) {
287 a->SetCleared(renderbuffer_manager, 288 a->SetCleared(renderbuffer_manager,
288 texture_manager, 289 texture_manager,
289 cleared); 290 cleared);
290 } 291 }
291 } 292 }
292 } 293 }
293 294
294 void FramebufferManager::FramebufferInfo::MarkAttachmentsAsCleared( 295 void Framebuffer::MarkAttachmentsAsCleared(
295 RenderbufferManager* renderbuffer_manager, 296 RenderbufferManager* renderbuffer_manager,
296 TextureManager* texture_manager, 297 TextureManager* texture_manager,
297 bool cleared) { 298 bool cleared) {
298 for (AttachmentMap::iterator it = attachments_.begin(); 299 for (AttachmentMap::iterator it = attachments_.begin();
299 it != attachments_.end(); ++it) { 300 it != attachments_.end(); ++it) {
300 Attachment* attachment = it->second; 301 Attachment* attachment = it->second;
301 if (attachment->cleared() != cleared) { 302 if (attachment->cleared() != cleared) {
302 attachment->SetCleared(renderbuffer_manager, texture_manager, cleared); 303 attachment->SetCleared(renderbuffer_manager, texture_manager, cleared);
303 } 304 }
304 } 305 }
305 } 306 }
306 307
307 bool FramebufferManager::FramebufferInfo::HasDepthAttachment() const { 308 bool Framebuffer::HasDepthAttachment() const {
308 return attachments_.find(GL_DEPTH_STENCIL_ATTACHMENT) != attachments_.end() || 309 return attachments_.find(GL_DEPTH_STENCIL_ATTACHMENT) != attachments_.end() ||
309 attachments_.find(GL_DEPTH_ATTACHMENT) != attachments_.end(); 310 attachments_.find(GL_DEPTH_ATTACHMENT) != attachments_.end();
310 } 311 }
311 312
312 bool FramebufferManager::FramebufferInfo::HasStencilAttachment() const { 313 bool Framebuffer::HasStencilAttachment() const {
313 return attachments_.find(GL_DEPTH_STENCIL_ATTACHMENT) != attachments_.end() || 314 return attachments_.find(GL_DEPTH_STENCIL_ATTACHMENT) != attachments_.end() ||
314 attachments_.find(GL_STENCIL_ATTACHMENT) != attachments_.end(); 315 attachments_.find(GL_STENCIL_ATTACHMENT) != attachments_.end();
315 } 316 }
316 317
317 GLenum FramebufferManager::FramebufferInfo::GetColorAttachmentFormat() const { 318 GLenum Framebuffer::GetColorAttachmentFormat() const {
318 AttachmentMap::const_iterator it = attachments_.find(GL_COLOR_ATTACHMENT0); 319 AttachmentMap::const_iterator it = attachments_.find(GL_COLOR_ATTACHMENT0);
319 if (it == attachments_.end()) { 320 if (it == attachments_.end()) {
320 return 0; 321 return 0;
321 } 322 }
322 const Attachment* attachment = it->second; 323 const Attachment* attachment = it->second;
323 return attachment->internal_format(); 324 return attachment->internal_format();
324 } 325 }
325 326
326 GLenum FramebufferManager::FramebufferInfo::IsPossiblyComplete() const { 327 GLenum Framebuffer::IsPossiblyComplete() const {
327 if (attachments_.empty()) { 328 if (attachments_.empty()) {
328 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; 329 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
329 } 330 }
330 331
331 GLsizei width = -1; 332 GLsizei width = -1;
332 GLsizei height = -1; 333 GLsizei height = -1;
333 for (AttachmentMap::const_iterator it = attachments_.begin(); 334 for (AttachmentMap::const_iterator it = attachments_.begin();
334 it != attachments_.end(); ++it) { 335 it != attachments_.end(); ++it) {
335 GLenum attachment_type = it->first; 336 GLenum attachment_type = it->first;
336 Attachment* attachment = it->second; 337 Attachment* attachment = it->second;
(...skipping 15 matching lines...) Expand all
352 if (!attachment->CanRenderTo()) { 353 if (!attachment->CanRenderTo()) {
353 return GL_FRAMEBUFFER_UNSUPPORTED; 354 return GL_FRAMEBUFFER_UNSUPPORTED;
354 } 355 }
355 } 356 }
356 357
357 // This does not mean the framebuffer is actually complete. It just means our 358 // This does not mean the framebuffer is actually complete. It just means our
358 // checks passed. 359 // checks passed.
359 return GL_FRAMEBUFFER_COMPLETE; 360 return GL_FRAMEBUFFER_COMPLETE;
360 } 361 }
361 362
362 GLenum FramebufferManager::FramebufferInfo::GetStatus( 363 GLenum Framebuffer::GetStatus(
363 TextureManager* texture_manager, GLenum target) const { 364 TextureManager* texture_manager, GLenum target) const {
364 // Check if we have this combo already. 365 // Check if we have this combo already.
365 std::string signature(base::StringPrintf("|FBO|target=%04x", target)); 366 std::string signature(base::StringPrintf("|FBO|target=%04x", target));
366 for (AttachmentMap::const_iterator it = attachments_.begin(); 367 for (AttachmentMap::const_iterator it = attachments_.begin();
367 it != attachments_.end(); ++it) { 368 it != attachments_.end(); ++it) {
368 Attachment* attachment = it->second; 369 Attachment* attachment = it->second;
369 signature += base::StringPrintf( 370 signature += base::StringPrintf(
370 "|Attachment|attachmentpoint=%04x", it->first); 371 "|Attachment|attachmentpoint=%04x", it->first);
371 attachment->AddToSignature(texture_manager, &signature); 372 attachment->AddToSignature(texture_manager, &signature);
372 } 373 }
373 374
374 if (!framebuffer_combo_complete_map_) { 375 if (!framebuffer_combo_complete_map_) {
375 framebuffer_combo_complete_map_ = new FramebufferComboCompleteMap(); 376 framebuffer_combo_complete_map_ = new FramebufferComboCompleteMap();
376 } 377 }
377 378
378 FramebufferComboCompleteMap::const_iterator it = 379 FramebufferComboCompleteMap::const_iterator it =
379 framebuffer_combo_complete_map_->find(signature); 380 framebuffer_combo_complete_map_->find(signature);
380 if (it != framebuffer_combo_complete_map_->end()) { 381 if (it != framebuffer_combo_complete_map_->end()) {
381 return GL_FRAMEBUFFER_COMPLETE; 382 return GL_FRAMEBUFFER_COMPLETE;
382 } 383 }
383 GLenum result = glCheckFramebufferStatusEXT(target); 384 GLenum result = glCheckFramebufferStatusEXT(target);
384 if (result == GL_FRAMEBUFFER_COMPLETE) { 385 if (result == GL_FRAMEBUFFER_COMPLETE) {
385 framebuffer_combo_complete_map_->insert(std::make_pair(signature, true)); 386 framebuffer_combo_complete_map_->insert(std::make_pair(signature, true));
386 } 387 }
387 return result; 388 return result;
388 } 389 }
389 390
390 bool FramebufferManager::FramebufferInfo::IsCleared() const { 391 bool Framebuffer::IsCleared() const {
391 // are all the attachments cleaared? 392 // are all the attachments cleaared?
392 for (AttachmentMap::const_iterator it = attachments_.begin(); 393 for (AttachmentMap::const_iterator it = attachments_.begin();
393 it != attachments_.end(); ++it) { 394 it != attachments_.end(); ++it) {
394 Attachment* attachment = it->second; 395 Attachment* attachment = it->second;
395 if (!attachment->cleared()) { 396 if (!attachment->cleared()) {
396 return false; 397 return false;
397 } 398 }
398 } 399 }
399 return true; 400 return true;
400 } 401 }
401 402
402 void FramebufferManager::FramebufferInfo::UnbindRenderbuffer( 403 void Framebuffer::UnbindRenderbuffer(
403 GLenum target, RenderbufferManager::RenderbufferInfo* renderbuffer) { 404 GLenum target, Renderbuffer* renderbuffer) {
404 bool done; 405 bool done;
405 do { 406 do {
406 done = true; 407 done = true;
407 for (AttachmentMap::const_iterator it = attachments_.begin(); 408 for (AttachmentMap::const_iterator it = attachments_.begin();
408 it != attachments_.end(); ++it) { 409 it != attachments_.end(); ++it) {
409 Attachment* attachment = it->second; 410 Attachment* attachment = it->second;
410 if (attachment->IsRenderbuffer(renderbuffer)) { 411 if (attachment->IsRenderbuffer(renderbuffer)) {
411 // TODO(gman): manually detach renderbuffer. 412 // TODO(gman): manually detach renderbuffer.
412 // glFramebufferRenderbufferEXT(target, it->first, GL_RENDERBUFFER, 0); 413 // glFramebufferRenderbufferEXT(target, it->first, GL_RENDERBUFFER, 0);
413 AttachRenderbuffer(it->first, NULL); 414 AttachRenderbuffer(it->first, NULL);
414 done = false; 415 done = false;
415 break; 416 break;
416 } 417 }
417 } 418 }
418 } while (!done); 419 } while (!done);
419 } 420 }
420 421
421 void FramebufferManager::FramebufferInfo::UnbindTexture( 422 void Framebuffer::UnbindTexture(
422 GLenum target, TextureManager::TextureInfo* texture) { 423 GLenum target, Texture* texture) {
423 bool done; 424 bool done;
424 do { 425 do {
425 done = true; 426 done = true;
426 for (AttachmentMap::const_iterator it = attachments_.begin(); 427 for (AttachmentMap::const_iterator it = attachments_.begin();
427 it != attachments_.end(); ++it) { 428 it != attachments_.end(); ++it) {
428 Attachment* attachment = it->second; 429 Attachment* attachment = it->second;
429 if (attachment->IsTexture(texture)) { 430 if (attachment->IsTexture(texture)) {
430 // TODO(gman): manually detach texture. 431 // TODO(gman): manually detach texture.
431 // glFramebufferTexture2DEXT(target, it->first, GL_TEXTURE_2D, 0, 0); 432 // glFramebufferTexture2DEXT(target, it->first, GL_TEXTURE_2D, 0, 0);
432 AttachTexture(it->first, NULL, GL_TEXTURE_2D, 0); 433 AttachTexture(it->first, NULL, GL_TEXTURE_2D, 0);
433 done = false; 434 done = false;
434 break; 435 break;
435 } 436 }
436 } 437 }
437 } while (!done); 438 } while (!done);
438 } 439 }
439 440
440 FramebufferManager::FramebufferInfo* FramebufferManager::GetFramebufferInfo( 441 Framebuffer* FramebufferManager::GetFramebuffer(
441 GLuint client_id) { 442 GLuint client_id) {
442 FramebufferInfoMap::iterator it = framebuffer_infos_.find(client_id); 443 FramebufferInfoMap::iterator it = framebuffer_infos_.find(client_id);
443 return it != framebuffer_infos_.end() ? it->second : NULL; 444 return it != framebuffer_infos_.end() ? it->second : NULL;
444 } 445 }
445 446
446 void FramebufferManager::RemoveFramebufferInfo(GLuint client_id) { 447 void FramebufferManager::RemoveFramebuffer(GLuint client_id) {
447 FramebufferInfoMap::iterator it = framebuffer_infos_.find(client_id); 448 FramebufferInfoMap::iterator it = framebuffer_infos_.find(client_id);
448 if (it != framebuffer_infos_.end()) { 449 if (it != framebuffer_infos_.end()) {
449 it->second->MarkAsDeleted(); 450 it->second->MarkAsDeleted();
450 framebuffer_infos_.erase(it); 451 framebuffer_infos_.erase(it);
451 } 452 }
452 } 453 }
453 454
454 void FramebufferManager::FramebufferInfo::AttachRenderbuffer( 455 void Framebuffer::AttachRenderbuffer(
455 GLenum attachment, RenderbufferManager::RenderbufferInfo* renderbuffer) { 456 GLenum attachment, Renderbuffer* renderbuffer) {
456 DCHECK(attachment == GL_COLOR_ATTACHMENT0 || 457 DCHECK(attachment == GL_COLOR_ATTACHMENT0 ||
457 attachment == GL_DEPTH_ATTACHMENT || 458 attachment == GL_DEPTH_ATTACHMENT ||
458 attachment == GL_STENCIL_ATTACHMENT || 459 attachment == GL_STENCIL_ATTACHMENT ||
459 attachment == GL_DEPTH_STENCIL_ATTACHMENT); 460 attachment == GL_DEPTH_STENCIL_ATTACHMENT);
460 const Attachment* a = GetAttachment(attachment); 461 const Attachment* a = GetAttachment(attachment);
461 if (a) 462 if (a)
462 a->DetachFromFramebuffer(); 463 a->DetachFromFramebuffer();
463 if (renderbuffer) { 464 if (renderbuffer) {
464 attachments_[attachment] = Attachment::Ref( 465 attachments_[attachment] = scoped_refptr<Attachment>(
465 new RenderbufferAttachment(renderbuffer)); 466 new RenderbufferAttachment(renderbuffer));
466 } else { 467 } else {
467 attachments_.erase(attachment); 468 attachments_.erase(attachment);
468 } 469 }
469 framebuffer_complete_state_count_id_ = 0; 470 framebuffer_complete_state_count_id_ = 0;
470 } 471 }
471 472
472 void FramebufferManager::FramebufferInfo::AttachTexture( 473 void Framebuffer::AttachTexture(
473 GLenum attachment, TextureManager::TextureInfo* texture, GLenum target, 474 GLenum attachment, Texture* texture, GLenum target,
474 GLint level) { 475 GLint level) {
475 DCHECK(attachment == GL_COLOR_ATTACHMENT0 || 476 DCHECK(attachment == GL_COLOR_ATTACHMENT0 ||
476 attachment == GL_DEPTH_ATTACHMENT || 477 attachment == GL_DEPTH_ATTACHMENT ||
477 attachment == GL_STENCIL_ATTACHMENT || 478 attachment == GL_STENCIL_ATTACHMENT ||
478 attachment == GL_DEPTH_STENCIL_ATTACHMENT); 479 attachment == GL_DEPTH_STENCIL_ATTACHMENT);
479 const Attachment* a = GetAttachment(attachment); 480 const Attachment* a = GetAttachment(attachment);
480 if (a) 481 if (a)
481 a->DetachFromFramebuffer(); 482 a->DetachFromFramebuffer();
482 if (texture) { 483 if (texture) {
483 attachments_[attachment] = Attachment::Ref( 484 attachments_[attachment] = scoped_refptr<Attachment>(
484 new TextureAttachment(texture, target, level)); 485 new TextureAttachment(texture, target, level));
485 texture->AttachToFramebuffer(); 486 texture->AttachToFramebuffer();
486 } else { 487 } else {
487 attachments_.erase(attachment); 488 attachments_.erase(attachment);
488 } 489 }
489 framebuffer_complete_state_count_id_ = 0; 490 framebuffer_complete_state_count_id_ = 0;
490 } 491 }
491 492
492 const FramebufferManager::FramebufferInfo::Attachment* 493 const Framebuffer::Attachment*
493 FramebufferManager::FramebufferInfo::GetAttachment( 494 Framebuffer::GetAttachment(
494 GLenum attachment) const { 495 GLenum attachment) const {
495 AttachmentMap::const_iterator it = attachments_.find(attachment); 496 AttachmentMap::const_iterator it = attachments_.find(attachment);
496 if (it != attachments_.end()) { 497 if (it != attachments_.end()) {
497 return it->second; 498 return it->second;
498 } 499 }
499 return NULL; 500 return NULL;
500 } 501 }
501 502
502 bool FramebufferManager::GetClientId( 503 bool FramebufferManager::GetClientId(
503 GLuint service_id, GLuint* client_id) const { 504 GLuint service_id, GLuint* client_id) const {
504 // This doesn't need to be fast. It's only used during slow queries. 505 // This doesn't need to be fast. It's only used during slow queries.
505 for (FramebufferInfoMap::const_iterator it = framebuffer_infos_.begin(); 506 for (FramebufferInfoMap::const_iterator it = framebuffer_infos_.begin();
506 it != framebuffer_infos_.end(); ++it) { 507 it != framebuffer_infos_.end(); ++it) {
507 if (it->second->service_id() == service_id) { 508 if (it->second->service_id() == service_id) {
508 *client_id = it->first; 509 *client_id = it->first;
509 return true; 510 return true;
510 } 511 }
511 } 512 }
512 return false; 513 return false;
513 } 514 }
514 515
515 void FramebufferManager::MarkAttachmentsAsCleared( 516 void FramebufferManager::MarkAttachmentsAsCleared(
516 FramebufferManager::FramebufferInfo* framebuffer, 517 Framebuffer* framebuffer,
517 RenderbufferManager* renderbuffer_manager, 518 RenderbufferManager* renderbuffer_manager,
518 TextureManager* texture_manager) { 519 TextureManager* texture_manager) {
519 DCHECK(framebuffer); 520 DCHECK(framebuffer);
520 framebuffer->MarkAttachmentsAsCleared(renderbuffer_manager, 521 framebuffer->MarkAttachmentsAsCleared(renderbuffer_manager,
521 texture_manager, 522 texture_manager,
522 true); 523 true);
523 MarkAsComplete(framebuffer); 524 MarkAsComplete(framebuffer);
524 } 525 }
525 526
526 void FramebufferManager::MarkAsComplete( 527 void FramebufferManager::MarkAsComplete(
527 FramebufferManager::FramebufferInfo* framebuffer) { 528 Framebuffer* framebuffer) {
528 DCHECK(framebuffer); 529 DCHECK(framebuffer);
529 framebuffer->MarkAsComplete(framebuffer_state_change_count_); 530 framebuffer->MarkAsComplete(framebuffer_state_change_count_);
530 } 531 }
531 532
532 bool FramebufferManager::IsComplete( 533 bool FramebufferManager::IsComplete(
533 FramebufferManager::FramebufferInfo* framebuffer) { 534 Framebuffer* framebuffer) {
534 DCHECK(framebuffer); 535 DCHECK(framebuffer);
535 return framebuffer->framebuffer_complete_state_count_id() == 536 return framebuffer->framebuffer_complete_state_count_id() ==
536 framebuffer_state_change_count_; 537 framebuffer_state_change_count_;
537 } 538 }
538 539
539 } // namespace gles2 540 } // namespace gles2
540 } // namespace gpu 541 } // namespace gpu
541 542
542 543
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager.h ('k') | gpu/command_buffer/service/framebuffer_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698