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/feature_info.h" | |
| 9 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 10 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
| 10 #include "gpu/command_buffer/service/texture_manager.h" | 11 #include "gpu/command_buffer/service/texture_manager.h" |
| 11 #include "ui/gl/gl_bindings.h" | 12 #include "ui/gl/gl_bindings.h" |
| 12 | 13 |
| 13 namespace gpu { | 14 namespace gpu { |
| 14 namespace gles2 { | 15 namespace gles2 { |
| 15 | 16 |
| 16 DecoderFramebufferState::DecoderFramebufferState() | 17 DecoderFramebufferState::DecoderFramebufferState() |
| 17 : clear_state_dirty(false), | 18 : clear_state_dirty(false), |
| 18 bound_read_framebuffer(NULL), | 19 bound_read_framebuffer(NULL), |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 | 96 |
| 96 virtual bool CanRenderTo() const OVERRIDE { | 97 virtual bool CanRenderTo() const OVERRIDE { |
| 97 return true; | 98 return true; |
| 98 } | 99 } |
| 99 | 100 |
| 100 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const OVERRIDE { | 101 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const OVERRIDE { |
| 101 // Nothing to do for renderbuffers. | 102 // Nothing to do for renderbuffers. |
| 102 } | 103 } |
| 103 | 104 |
| 104 virtual bool ValidForAttachmentType( | 105 virtual bool ValidForAttachmentType( |
| 105 GLenum attachment_type, uint32 max_color_attachments) OVERRIDE { | 106 GLenum attachment_type, uint32 max_color_attachments, |
| 107 const FeatureInfo*) OVERRIDE { | |
| 106 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 108 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
| 107 attachment_type, max_color_attachments); | 109 attachment_type, max_color_attachments); |
| 108 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); | 110 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); |
| 109 return (need & have) != 0; | 111 return (need & have) != 0; |
| 110 } | 112 } |
| 111 | 113 |
| 112 Renderbuffer* renderbuffer() const { | 114 Renderbuffer* renderbuffer() const { |
| 113 return renderbuffer_.get(); | 115 return renderbuffer_.get(); |
| 114 } | 116 } |
| 115 | 117 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 209 return texture_ref_->texture()->CanRenderTo(); | 211 return texture_ref_->texture()->CanRenderTo(); |
| 210 } | 212 } |
| 211 | 213 |
| 212 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) | 214 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) |
| 213 const OVERRIDE { | 215 const OVERRIDE { |
| 214 texture_ref_->texture()->DetachFromFramebuffer(); | 216 texture_ref_->texture()->DetachFromFramebuffer(); |
| 215 framebuffer->OnTextureRefDetached(texture_ref_.get()); | 217 framebuffer->OnTextureRefDetached(texture_ref_.get()); |
| 216 } | 218 } |
| 217 | 219 |
| 218 virtual bool ValidForAttachmentType( | 220 virtual bool ValidForAttachmentType( |
| 219 GLenum attachment_type, uint32 max_color_attachments) OVERRIDE { | 221 GLenum attachment_type, uint32 max_color_attachments, |
| 222 const FeatureInfo* feature_info) OVERRIDE { | |
| 220 GLenum type = 0; | 223 GLenum type = 0; |
| 221 GLenum internal_format = 0; | 224 GLenum internal_format = 0; |
| 222 if (!texture_ref_->texture()->GetLevelType( | 225 if (!texture_ref_->texture()->GetLevelType( |
| 223 target_, level_, &type, &internal_format)) { | 226 target_, level_, &type, &internal_format)) { |
| 224 return false; | 227 return false; |
| 225 } | 228 } |
| 226 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 229 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
| 227 attachment_type, max_color_attachments); | 230 attachment_type, max_color_attachments); |
| 228 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); | 231 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); |
| 229 | 232 |
| 230 // Workaround for NVIDIA drivers that incorrectly expose these formats as | 233 // Workaround for NVIDIA drivers that incorrectly expose these formats as |
| 231 // renderable: | 234 // renderable: |
| 232 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || | 235 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || |
| 233 internal_format == GL_LUMINANCE_ALPHA) { | 236 internal_format == GL_LUMINANCE_ALPHA) { |
| 234 return false; | 237 return false; |
| 235 } | 238 } |
| 239 // As a workaround for ANGLE implementing rendering to float textures in | |
| 240 // an unspecified way, accept all internalformats for float textures when | |
| 241 // using ANGLE. Otherwise only allow rendering to float textures as exposed | |
| 242 // by CHROMIUM_color_buffer_float_rgb(a). | |
|
piman
2014/02/11 21:28:38
I don't think this is right.
When using ANGLE, we'
Ken Russell (switch to Gerrit)
2014/02/12 00:11:01
When running on ANGLE, the command buffer won't ex
| |
| 243 if ((internal_format == GL_RGBA32F && | |
| 244 !feature_info->feature_flags().chromium_color_buffer_float_rgba) || | |
| 245 (internal_format == GL_RGB32F && | |
| 246 !feature_info->feature_flags().chromium_color_buffer_float_rgb) || | |
| 247 (type == GL_FLOAT && !feature_info->feature_flags().is_angle && | |
| 248 internal_format != GL_RGBA32F && internal_format != GL_RGB32F)) { | |
| 249 return false; | |
| 250 } | |
| 236 return (need & have) != 0; | 251 return (need & have) != 0; |
| 237 } | 252 } |
| 238 | 253 |
| 239 virtual void AddToSignature( | 254 virtual void AddToSignature( |
| 240 TextureManager* texture_manager, std::string* signature) const OVERRIDE { | 255 TextureManager* texture_manager, std::string* signature) const OVERRIDE { |
| 241 DCHECK(signature); | 256 DCHECK(signature); |
| 242 texture_manager->AddToSignature( | 257 texture_manager->AddToSignature( |
| 243 texture_ref_.get(), target_, level_, signature); | 258 texture_ref_.get(), target_, level_, signature); |
| 244 } | 259 } |
| 245 | 260 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 399 | 414 |
| 400 GLenum Framebuffer::GetColorAttachmentTextureType() const { | 415 GLenum Framebuffer::GetColorAttachmentTextureType() const { |
| 401 AttachmentMap::const_iterator it = attachments_.find(GL_COLOR_ATTACHMENT0); | 416 AttachmentMap::const_iterator it = attachments_.find(GL_COLOR_ATTACHMENT0); |
| 402 if (it == attachments_.end()) { | 417 if (it == attachments_.end()) { |
| 403 return 0; | 418 return 0; |
| 404 } | 419 } |
| 405 const Attachment* attachment = it->second.get(); | 420 const Attachment* attachment = it->second.get(); |
| 406 return attachment->texture_type(); | 421 return attachment->texture_type(); |
| 407 } | 422 } |
| 408 | 423 |
| 409 GLenum Framebuffer::IsPossiblyComplete() const { | 424 GLenum Framebuffer::IsPossiblyComplete(const FeatureInfo* feature_info) const { |
| 410 if (attachments_.empty()) { | 425 if (attachments_.empty()) { |
| 411 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; | 426 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; |
| 412 } | 427 } |
| 413 | 428 |
| 414 GLsizei width = -1; | 429 GLsizei width = -1; |
| 415 GLsizei height = -1; | 430 GLsizei height = -1; |
| 416 for (AttachmentMap::const_iterator it = attachments_.begin(); | 431 for (AttachmentMap::const_iterator it = attachments_.begin(); |
| 417 it != attachments_.end(); ++it) { | 432 it != attachments_.end(); ++it) { |
| 418 GLenum attachment_type = it->first; | 433 GLenum attachment_type = it->first; |
| 419 Attachment* attachment = it->second.get(); | 434 Attachment* attachment = it->second.get(); |
| 420 if (!attachment->ValidForAttachmentType(attachment_type, | 435 if (!attachment->ValidForAttachmentType(attachment_type, |
| 421 manager_->max_color_attachments_)) { | 436 manager_->max_color_attachments_, |
| 437 feature_info)) { | |
| 422 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; | 438 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| 423 } | 439 } |
| 424 if (width < 0) { | 440 if (width < 0) { |
| 425 width = attachment->width(); | 441 width = attachment->width(); |
| 426 height = attachment->height(); | 442 height = attachment->height(); |
| 427 if (width == 0 || height == 0) { | 443 if (width == 0 || height == 0) { |
| 428 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; | 444 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| 429 } | 445 } |
| 430 } else { | 446 } else { |
| 431 if (attachment->width() != width || attachment->height() != height) { | 447 if (attachment->width() != width || attachment->height() != height) { |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 659 ++it) { | 675 ++it) { |
| 660 TextureDetachObserver* observer = *it; | 676 TextureDetachObserver* observer = *it; |
| 661 observer->OnTextureRefDetachedFromFramebuffer(texture); | 677 observer->OnTextureRefDetachedFromFramebuffer(texture); |
| 662 } | 678 } |
| 663 } | 679 } |
| 664 | 680 |
| 665 } // namespace gles2 | 681 } // namespace gles2 |
| 666 } // namespace gpu | 682 } // namespace gpu |
| 667 | 683 |
| 668 | 684 |
| OLD | NEW |