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 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 82 | 82 |
| 83 bool IsTextureAttachment() const override { return false; } | 83 bool IsTextureAttachment() const override { return false; } |
| 84 bool IsRenderbufferAttachment() const override { return true; } | 84 bool IsRenderbufferAttachment() const override { return true; } |
| 85 | 85 |
| 86 bool IsTexture(TextureRef* /* texture */) const override { return false; } | 86 bool IsTexture(TextureRef* /* texture */) const override { return false; } |
| 87 | 87 |
| 88 bool IsRenderbuffer(Renderbuffer* renderbuffer) const override { | 88 bool IsRenderbuffer(Renderbuffer* renderbuffer) const override { |
| 89 return renderbuffer_.get() == renderbuffer; | 89 return renderbuffer_.get() == renderbuffer; |
| 90 } | 90 } |
| 91 | 91 |
| 92 bool IsSameAttachment(const Attachment* attachment) const override { | |
| 93 if (attachment->IsRenderbufferAttachment()) { | |
| 94 const RenderbufferAttachment* other = | |
| 95 reinterpret_cast<const RenderbufferAttachment*>(attachment); | |
| 96 return IsRenderbuffer(other->renderbuffer()); | |
| 97 } | |
| 98 return false; | |
| 99 } | |
| 100 | |
| 92 bool Is3D() const override { return false; } | 101 bool Is3D() const override { return false; } |
| 93 | 102 |
| 94 bool CanRenderTo(const FeatureInfo*) const override { return true; } | 103 bool CanRenderTo(const FeatureInfo*) const override { return true; } |
| 95 | 104 |
| 96 void DetachFromFramebuffer(Framebuffer* framebuffer) const override { | 105 void DetachFromFramebuffer(Framebuffer* framebuffer) const override { |
| 97 // Nothing to do for renderbuffers. | 106 // Nothing to do for renderbuffers. |
| 98 } | 107 } |
| 99 | 108 |
| 100 bool IsLayerValid() const override { return true; } | 109 bool IsLayerValid() const override { return true; } |
| 101 | 110 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 return texture_ref_->texture()->IsLevelPartiallyCleared(target_, level_); | 222 return texture_ref_->texture()->IsLevelPartiallyCleared(target_, level_); |
| 214 } | 223 } |
| 215 | 224 |
| 216 bool IsTextureAttachment() const override { return true; } | 225 bool IsTextureAttachment() const override { return true; } |
| 217 bool IsRenderbufferAttachment() const override { return false; } | 226 bool IsRenderbufferAttachment() const override { return false; } |
| 218 | 227 |
| 219 bool IsTexture(TextureRef* texture) const override { | 228 bool IsTexture(TextureRef* texture) const override { |
| 220 return texture == texture_ref_.get(); | 229 return texture == texture_ref_.get(); |
| 221 } | 230 } |
| 222 | 231 |
| 232 bool IsSameAttachment(const Attachment* attachment) const override { | |
| 233 if (attachment->IsTextureAttachment()) { | |
| 234 const TextureAttachment* other = | |
| 235 reinterpret_cast<const TextureAttachment*>(attachment); | |
| 236 return IsTexture(other->texture()) && | |
| 237 layer_ == other->layer() && | |
| 238 target_ == other->target() && | |
| 239 level_ == other->level(); | |
| 240 } | |
| 241 return false; | |
| 242 } | |
| 243 | |
| 223 bool IsRenderbuffer(Renderbuffer* /* renderbuffer */) const override { | 244 bool IsRenderbuffer(Renderbuffer* /* renderbuffer */) const override { |
| 224 return false; | 245 return false; |
| 225 } | 246 } |
| 226 | 247 |
| 227 bool Is3D() const override { | 248 bool Is3D() const override { |
| 228 return (target_ == GL_TEXTURE_3D || target_ == GL_TEXTURE_2D_ARRAY); | 249 return (target_ == GL_TEXTURE_3D || target_ == GL_TEXTURE_2D_ARRAY); |
| 229 } | 250 } |
| 230 | 251 |
| 231 TextureRef* texture() const { | 252 TextureRef* texture() const { |
| 232 return texture_ref_.get(); | 253 return texture_ref_.get(); |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 } else if (attachment->samples() != samples) { | 725 } else if (attachment->samples() != samples) { |
| 705 // It's possible that the specified samples isn't the actual samples a | 726 // It's possible that the specified samples isn't the actual samples a |
| 706 // GL implementation uses, but we always return INCOMPLETE_MULTISAMPLE | 727 // GL implementation uses, but we always return INCOMPLETE_MULTISAMPLE |
| 707 // here to ensure consistent behaviors across platforms. | 728 // here to ensure consistent behaviors across platforms. |
| 708 return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE; | 729 return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE; |
| 709 } | 730 } |
| 710 } | 731 } |
| 711 if (!attachment->CanRenderTo(feature_info)) { | 732 if (!attachment->CanRenderTo(feature_info)) { |
| 712 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; | 733 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| 713 } | 734 } |
| 735 | |
| 736 // In WebGL 2.0, attaching an image to more than one color attachment point | |
| 737 // should return FRAMEBUFFER_UNSUPPORTED. | |
| 738 if (feature_info->context_type() == CONTEXT_TYPE_WEBGL2) { | |
|
qiankun
2016/07/20 08:53:33
Is it right only for webgl 2 context? I think gles
Zhenyao Mo
2016/07/20 13:55:44
We need to apply it to ES3 contexts as well. If t
qiankun
2016/07/20 15:03:26
I see. You told me to update extension case before
Zhenyao Mo
2016/07/20 16:12:48
On the command buffer side, we don't need to check
| |
| 739 if (it->first >= GL_COLOR_ATTACHMENT0 && | |
| 740 it->first < GL_COLOR_ATTACHMENT0 + manager_->max_color_attachments_) { | |
| 741 for (GLenum i = it->first + 1; | |
| 742 i < GL_COLOR_ATTACHMENT0 + manager_->max_color_attachments_; i++) { | |
| 743 const Attachment* other = GetAttachment(i); | |
| 744 if (other && attachment->IsSameAttachment(other)) { | |
| 745 return GL_FRAMEBUFFER_UNSUPPORTED; | |
| 746 } | |
| 747 } | |
| 748 } | |
| 749 } | |
| 714 } | 750 } |
| 715 | 751 |
| 716 // This does not mean the framebuffer is actually complete. It just means our | 752 // This does not mean the framebuffer is actually complete. It just means our |
| 717 // checks passed. | 753 // checks passed. |
| 718 return GL_FRAMEBUFFER_COMPLETE; | 754 return GL_FRAMEBUFFER_COMPLETE; |
| 719 } | 755 } |
| 720 | 756 |
| 721 GLenum Framebuffer::GetStatus( | 757 GLenum Framebuffer::GetStatus( |
| 722 TextureManager* texture_manager, GLenum target) const { | 758 TextureManager* texture_manager, GLenum target) const { |
| 723 if (!manager_->GetFramebufferComboCompleteCache()) { | 759 if (!manager_->GetFramebufferComboCompleteCache()) { |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1004 | 1040 |
| 1005 bool FramebufferManager::IsComplete( | 1041 bool FramebufferManager::IsComplete( |
| 1006 Framebuffer* framebuffer) { | 1042 Framebuffer* framebuffer) { |
| 1007 DCHECK(framebuffer); | 1043 DCHECK(framebuffer); |
| 1008 return framebuffer->framebuffer_complete_state_count_id() == | 1044 return framebuffer->framebuffer_complete_state_count_id() == |
| 1009 framebuffer_state_change_count_; | 1045 framebuffer_state_change_count_; |
| 1010 } | 1046 } |
| 1011 | 1047 |
| 1012 } // namespace gles2 | 1048 } // namespace gles2 |
| 1013 } // namespace gpu | 1049 } // namespace gpu |
| OLD | NEW |