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 |