| 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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 95 |
| 96 virtual bool CanRenderTo() const OVERRIDE { | 96 virtual bool CanRenderTo() const OVERRIDE { |
| 97 return true; | 97 return true; |
| 98 } | 98 } |
| 99 | 99 |
| 100 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const OVERRIDE { | 100 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const OVERRIDE { |
| 101 // Nothing to do for renderbuffers. | 101 // Nothing to do for renderbuffers. |
| 102 } | 102 } |
| 103 | 103 |
| 104 virtual bool ValidForAttachmentType( | 104 virtual bool ValidForAttachmentType( |
| 105 GLenum attachment_type, uint32 max_color_attachments) OVERRIDE { | 105 GLenum attachment_type, uint32 max_color_attachments, |
| 106 bool) OVERRIDE { |
| 106 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 107 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
| 107 attachment_type, max_color_attachments); | 108 attachment_type, max_color_attachments); |
| 108 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); | 109 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); |
| 109 return (need & have) != 0; | 110 return (need & have) != 0; |
| 110 } | 111 } |
| 111 | 112 |
| 112 Renderbuffer* renderbuffer() const { | 113 Renderbuffer* renderbuffer() const { |
| 113 return renderbuffer_.get(); | 114 return renderbuffer_.get(); |
| 114 } | 115 } |
| 115 | 116 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 return texture_ref_->texture()->CanRenderTo(); | 210 return texture_ref_->texture()->CanRenderTo(); |
| 210 } | 211 } |
| 211 | 212 |
| 212 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) | 213 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) |
| 213 const OVERRIDE { | 214 const OVERRIDE { |
| 214 texture_ref_->texture()->DetachFromFramebuffer(); | 215 texture_ref_->texture()->DetachFromFramebuffer(); |
| 215 framebuffer->OnTextureRefDetached(texture_ref_.get()); | 216 framebuffer->OnTextureRefDetached(texture_ref_.get()); |
| 216 } | 217 } |
| 217 | 218 |
| 218 virtual bool ValidForAttachmentType( | 219 virtual bool ValidForAttachmentType( |
| 219 GLenum attachment_type, uint32 max_color_attachments) OVERRIDE { | 220 GLenum attachment_type, uint32 max_color_attachments, |
| 221 bool allow_float_color_attachment) OVERRIDE { |
| 220 GLenum type = 0; | 222 GLenum type = 0; |
| 221 GLenum internal_format = 0; | 223 GLenum internal_format = 0; |
| 222 if (!texture_ref_->texture()->GetLevelType( | 224 if (!texture_ref_->texture()->GetLevelType( |
| 223 target_, level_, &type, &internal_format)) { | 225 target_, level_, &type, &internal_format)) { |
| 224 return false; | 226 return false; |
| 225 } | 227 } |
| 226 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 228 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
| 227 attachment_type, max_color_attachments); | 229 attachment_type, max_color_attachments); |
| 228 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); | 230 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); |
| 229 | 231 |
| 230 // Workaround for NVIDIA drivers that incorrectly expose these formats as | 232 // Workaround for NVIDIA drivers that incorrectly expose these formats as |
| 231 // renderable: | 233 // renderable: |
| 232 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || | 234 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || |
| 233 internal_format == GL_LUMINANCE_ALPHA) { | 235 internal_format == GL_LUMINANCE_ALPHA) { |
| 234 return false; | 236 return false; |
| 235 } | 237 } |
| 238 if (type == GL_FLOAT && |
| 239 (!allow_float_color_attachment || |
| 240 (internal_format != GL_RGBA32F && internal_format != GL_RGB32F))) { |
| 241 return false; |
| 242 } |
| 236 return (need & have) != 0; | 243 return (need & have) != 0; |
| 237 } | 244 } |
| 238 | 245 |
| 239 virtual void AddToSignature( | 246 virtual void AddToSignature( |
| 240 TextureManager* texture_manager, std::string* signature) const OVERRIDE { | 247 TextureManager* texture_manager, std::string* signature) const OVERRIDE { |
| 241 DCHECK(signature); | 248 DCHECK(signature); |
| 242 texture_manager->AddToSignature( | 249 texture_manager->AddToSignature( |
| 243 texture_ref_.get(), target_, level_, signature); | 250 texture_ref_.get(), target_, level_, signature); |
| 244 } | 251 } |
| 245 | 252 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 | 406 |
| 400 GLenum Framebuffer::GetColorAttachmentTextureType() const { | 407 GLenum Framebuffer::GetColorAttachmentTextureType() const { |
| 401 AttachmentMap::const_iterator it = attachments_.find(GL_COLOR_ATTACHMENT0); | 408 AttachmentMap::const_iterator it = attachments_.find(GL_COLOR_ATTACHMENT0); |
| 402 if (it == attachments_.end()) { | 409 if (it == attachments_.end()) { |
| 403 return 0; | 410 return 0; |
| 404 } | 411 } |
| 405 const Attachment* attachment = it->second.get(); | 412 const Attachment* attachment = it->second.get(); |
| 406 return attachment->texture_type(); | 413 return attachment->texture_type(); |
| 407 } | 414 } |
| 408 | 415 |
| 409 GLenum Framebuffer::IsPossiblyComplete() const { | 416 GLenum Framebuffer::IsPossiblyComplete( |
| 417 bool allow_float_color_attachment) const { |
| 410 if (attachments_.empty()) { | 418 if (attachments_.empty()) { |
| 411 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; | 419 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; |
| 412 } | 420 } |
| 413 | 421 |
| 414 GLsizei width = -1; | 422 GLsizei width = -1; |
| 415 GLsizei height = -1; | 423 GLsizei height = -1; |
| 416 for (AttachmentMap::const_iterator it = attachments_.begin(); | 424 for (AttachmentMap::const_iterator it = attachments_.begin(); |
| 417 it != attachments_.end(); ++it) { | 425 it != attachments_.end(); ++it) { |
| 418 GLenum attachment_type = it->first; | 426 GLenum attachment_type = it->first; |
| 419 Attachment* attachment = it->second.get(); | 427 Attachment* attachment = it->second.get(); |
| 420 if (!attachment->ValidForAttachmentType(attachment_type, | 428 if (!attachment->ValidForAttachmentType(attachment_type, |
| 421 manager_->max_color_attachments_)) { | 429 manager_->max_color_attachments_, |
| 430 allow_float_color_attachment)) { |
| 422 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; | 431 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| 423 } | 432 } |
| 424 if (width < 0) { | 433 if (width < 0) { |
| 425 width = attachment->width(); | 434 width = attachment->width(); |
| 426 height = attachment->height(); | 435 height = attachment->height(); |
| 427 if (width == 0 || height == 0) { | 436 if (width == 0 || height == 0) { |
| 428 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; | 437 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| 429 } | 438 } |
| 430 } else { | 439 } else { |
| 431 if (attachment->width() != width || attachment->height() != height) { | 440 if (attachment->width() != width || attachment->height() != height) { |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 ++it) { | 668 ++it) { |
| 660 TextureDetachObserver* observer = *it; | 669 TextureDetachObserver* observer = *it; |
| 661 observer->OnTextureRefDetachedFromFramebuffer(texture); | 670 observer->OnTextureRefDetachedFromFramebuffer(texture); |
| 662 } | 671 } |
| 663 } | 672 } |
| 664 | 673 |
| 665 } // namespace gles2 | 674 } // namespace gles2 |
| 666 } // namespace gpu | 675 } // namespace gpu |
| 667 | 676 |
| 668 | 677 |
| OLD | NEW |