Chromium Code Reviews| 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/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/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
| 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 9 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 9 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
| 10 #include "gpu/command_buffer/service/texture_manager.h" | 10 #include "gpu/command_buffer/service/texture_manager.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 106 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 106 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
| 107 attachment_type, max_color_attachments); | 107 attachment_type, max_color_attachments); |
| 108 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); | 108 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); |
| 109 return (need & have) != 0; | 109 return (need & have) != 0; |
| 110 } | 110 } |
| 111 | 111 |
| 112 Renderbuffer* renderbuffer() const { | 112 Renderbuffer* renderbuffer() const { |
| 113 return renderbuffer_.get(); | 113 return renderbuffer_.get(); |
| 114 } | 114 } |
| 115 | 115 |
| 116 virtual size_t GetSignatureSize( | |
| 117 TextureManager* texture_manager) const OVERRIDE { | |
| 118 return renderbuffer_->GetSignatureSize(); | |
| 119 } | |
| 120 | |
| 116 virtual void AddToSignature( | 121 virtual void AddToSignature( |
| 117 TextureManager* texture_manager, std::string* signature) const OVERRIDE { | 122 TextureManager* texture_manager, std::string* signature) const OVERRIDE { |
| 118 DCHECK(signature); | 123 DCHECK(signature); |
| 119 renderbuffer_->AddToSignature(signature); | 124 renderbuffer_->AddToSignature(signature); |
| 120 } | 125 } |
| 121 | 126 |
| 122 virtual void OnWillRenderTo() const OVERRIDE {} | 127 virtual void OnWillRenderTo() const OVERRIDE {} |
| 123 virtual void OnDidRenderTo() const OVERRIDE {} | 128 virtual void OnDidRenderTo() const OVERRIDE {} |
| 124 | 129 |
| 125 protected: | 130 protected: |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 232 | 237 |
| 233 // Workaround for NVIDIA drivers that incorrectly expose these formats as | 238 // Workaround for NVIDIA drivers that incorrectly expose these formats as |
| 234 // renderable: | 239 // renderable: |
| 235 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || | 240 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || |
| 236 internal_format == GL_LUMINANCE_ALPHA) { | 241 internal_format == GL_LUMINANCE_ALPHA) { |
| 237 return false; | 242 return false; |
| 238 } | 243 } |
| 239 return (need & have) != 0; | 244 return (need & have) != 0; |
| 240 } | 245 } |
| 241 | 246 |
| 247 virtual size_t GetSignatureSize( | |
| 248 TextureManager* texture_manager) const OVERRIDE { | |
| 249 return texture_manager->GetSignatureSize(); | |
| 250 } | |
| 251 | |
| 242 virtual void AddToSignature( | 252 virtual void AddToSignature( |
| 243 TextureManager* texture_manager, std::string* signature) const OVERRIDE { | 253 TextureManager* texture_manager, std::string* signature) const OVERRIDE { |
| 244 DCHECK(signature); | 254 DCHECK(signature); |
| 245 texture_manager->AddToSignature( | 255 texture_manager->AddToSignature( |
| 246 texture_ref_.get(), target_, level_, signature); | 256 texture_ref_.get(), target_, level_, signature); |
| 247 } | 257 } |
| 248 | 258 |
| 249 virtual void OnWillRenderTo() const OVERRIDE { | 259 virtual void OnWillRenderTo() const OVERRIDE { |
| 250 texture_ref_->texture()->OnWillModifyPixels(); | 260 texture_ref_->texture()->OnWillModifyPixels(); |
| 251 } | 261 } |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 // This does not mean the framebuffer is actually complete. It just means our | 511 // This does not mean the framebuffer is actually complete. It just means our |
| 502 // checks passed. | 512 // checks passed. |
| 503 return GL_FRAMEBUFFER_COMPLETE; | 513 return GL_FRAMEBUFFER_COMPLETE; |
| 504 } | 514 } |
| 505 | 515 |
| 506 GLenum Framebuffer::GetStatus( | 516 GLenum Framebuffer::GetStatus( |
| 507 TextureManager* texture_manager, GLenum target) const { | 517 TextureManager* texture_manager, GLenum target) const { |
| 508 // Check if we have this combo already. | 518 // Check if we have this combo already. |
| 509 std::string signature; | 519 std::string signature; |
| 510 if (allow_framebuffer_combo_complete_map_) { | 520 if (allow_framebuffer_combo_complete_map_) { |
| 511 signature = base::StringPrintf("|FBO|target=%04x", target); | 521 size_t signature_size = sizeof(target); |
| 512 for (AttachmentMap::const_iterator it = attachments_.begin(); | 522 for (AttachmentMap::const_iterator it = attachments_.begin(); |
| 513 it != attachments_.end(); ++it) { | 523 it != attachments_.end(); ++it) { |
| 514 Attachment* attachment = it->second.get(); | 524 Attachment* attachment = it->second.get(); |
| 515 signature += | 525 signature_size += sizeof(it->first) + |
| 516 base::StringPrintf("|Attachment|attachmentpoint=%04x", it->first); | 526 attachment->GetSignatureSize(texture_manager); |
| 527 } | |
| 528 | |
| 529 signature.reserve(signature_size); | |
| 530 signature.append(reinterpret_cast<const char*>(&target), sizeof(target)); | |
| 531 | |
| 532 for (AttachmentMap::const_iterator it = attachments_.begin(); | |
| 533 it != attachments_.end(); ++it) { | |
| 534 Attachment* attachment = it->second.get(); | |
| 535 signature.append(reinterpret_cast<const char*>(&it->first), | |
| 536 sizeof(it->first)); | |
| 517 attachment->AddToSignature(texture_manager, &signature); | 537 attachment->AddToSignature(texture_manager, &signature); |
| 518 } | 538 } |
|
vmiura
2014/09/26 23:36:36
nit: DCHECK(signature.size() == signature_size) wi
David Yen
2014/09/29 16:42:58
Good idea. Done.
| |
| 519 | 539 |
| 520 if (!framebuffer_combo_complete_map_) { | 540 if (!framebuffer_combo_complete_map_) { |
| 521 framebuffer_combo_complete_map_ = new FramebufferComboCompleteMap(); | 541 framebuffer_combo_complete_map_ = new FramebufferComboCompleteMap(); |
| 522 } | 542 } |
| 523 | 543 |
| 524 FramebufferComboCompleteMap::const_iterator it = | 544 FramebufferComboCompleteMap::const_iterator it = |
| 525 framebuffer_combo_complete_map_->find(signature); | 545 framebuffer_combo_complete_map_->find(signature); |
| 526 if (it != framebuffer_combo_complete_map_->end()) { | 546 if (it != framebuffer_combo_complete_map_->end()) { |
| 527 return GL_FRAMEBUFFER_COMPLETE; | 547 return GL_FRAMEBUFFER_COMPLETE; |
| 528 } | 548 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 558 index < static_cast<GLsizei>(manager_->max_draw_buffers_)); | 578 index < static_cast<GLsizei>(manager_->max_draw_buffers_)); |
| 559 return draw_buffers_[index]; | 579 return draw_buffers_[index]; |
| 560 } | 580 } |
| 561 | 581 |
| 562 void Framebuffer::SetDrawBuffers(GLsizei n, const GLenum* bufs) { | 582 void Framebuffer::SetDrawBuffers(GLsizei n, const GLenum* bufs) { |
| 563 DCHECK(n <= static_cast<GLsizei>(manager_->max_draw_buffers_)); | 583 DCHECK(n <= static_cast<GLsizei>(manager_->max_draw_buffers_)); |
| 564 for (GLsizei i = 0; i < n; ++i) | 584 for (GLsizei i = 0; i < n; ++i) |
| 565 draw_buffers_[i] = bufs[i]; | 585 draw_buffers_[i] = bufs[i]; |
| 566 } | 586 } |
| 567 | 587 |
| 568 | |
| 569 | |
| 570 bool Framebuffer::HasAlphaMRT() const { | 588 bool Framebuffer::HasAlphaMRT() const { |
| 571 for (uint32 i = 0; i < manager_->max_draw_buffers_; ++i) { | 589 for (uint32 i = 0; i < manager_->max_draw_buffers_; ++i) { |
| 572 if (draw_buffers_[i] != GL_NONE) { | 590 if (draw_buffers_[i] != GL_NONE) { |
| 573 const Attachment* attachment = GetAttachment(draw_buffers_[i]); | 591 const Attachment* attachment = GetAttachment(draw_buffers_[i]); |
| 574 if (!attachment) | 592 if (!attachment) |
| 575 continue; | 593 continue; |
| 576 if ((GLES2Util::GetChannelsForFormat( | 594 if ((GLES2Util::GetChannelsForFormat( |
| 577 attachment->internal_format()) & 0x0008) != 0) | 595 attachment->internal_format()) & 0x0008) != 0) |
| 578 return true; | 596 return true; |
| 579 } | 597 } |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 735 ++it) { | 753 ++it) { |
| 736 TextureDetachObserver* observer = *it; | 754 TextureDetachObserver* observer = *it; |
| 737 observer->OnTextureRefDetachedFromFramebuffer(texture); | 755 observer->OnTextureRefDetachedFromFramebuffer(texture); |
| 738 } | 756 } |
| 739 } | 757 } |
| 740 | 758 |
| 741 } // namespace gles2 | 759 } // namespace gles2 |
| 742 } // namespace gpu | 760 } // namespace gpu |
| 743 | 761 |
| 744 | 762 |
| OLD | NEW |