Chromium Code Reviews| Index: gpu/command_buffer/service/texture_manager.cc |
| diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc |
| index d64ac251d68cd82ebb2a21bb69054f245280d569..b409a90d72c0cc20e30a8f2a38ad285758932b42 100644 |
| --- a/gpu/command_buffer/service/texture_manager.cc |
| +++ b/gpu/command_buffer/service/texture_manager.cc |
| @@ -163,6 +163,25 @@ bool Texture::CanRender(const FeatureInfo* feature_info) const { |
| if (target_ == 0) { |
| return false; |
| } |
| + |
| + if (target_ == GL_TEXTURE_EXTERNAL_OES) { |
| + if (!IsStreamTexture()) { |
| + return false; |
| + } |
| + } else { |
| + if (level_infos_.empty()) { |
| + return false; |
| + } |
| + |
| + const Texture::LevelInfo& first_face = level_infos_[0][0]; |
| + if (target_ != GL_TEXTURE_EXTERNAL_OES && |
|
no sievers
2013/05/17 00:25:13
nit: It can never be GL_TEXTURE_EXTERNAL_OES in th
|
| + (first_face.width == 0 || |
| + first_face.height == 0 || |
| + first_face.depth == 0)) { |
| + return false; |
| + } |
| + } |
| + |
| bool needs_mips = NeedsMips(); |
| if ((npot() && !feature_info->feature_flags().npot_ok) || |
| (target_ == GL_TEXTURE_RECTANGLE_ARB)) { |
| @@ -243,7 +262,8 @@ bool Texture::MarkMipmapsGenerated( |
| return true; |
| } |
| -void Texture::SetTarget(GLenum target, GLint max_levels) { |
| +void Texture::SetTarget( |
| + const FeatureInfo* feature_info, GLenum target, GLint max_levels) { |
| DCHECK_EQ(0u, target_); // you can only set this once. |
| target_ = target; |
| size_t num_faces = (target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; |
| @@ -260,6 +280,7 @@ void Texture::SetTarget(GLenum target, GLint max_levels) { |
| if (target == GL_TEXTURE_EXTERNAL_OES) { |
| immutable_ = true; |
| } |
| + Update(feature_info); |
| } |
| bool Texture::CanGenerateMipmaps( |
| @@ -517,7 +538,8 @@ GLenum Texture::SetParameter( |
| void Texture::Update(const FeatureInfo* feature_info) { |
| // Update npot status. |
| - npot_ = false; |
| + // Assume GL_TEXTURE_EXTERNAL_OES textures are npot, all others |
| + npot_ = target_ == GL_TEXTURE_EXTERNAL_OES; |
| if (level_infos_.empty()) { |
| texture_complete_ = false; |
| @@ -831,7 +853,19 @@ void TextureManager::SetTarget(Texture* texture, GLenum target) { |
| DCHECK_NE(0, num_unrenderable_textures_); |
| --num_unrenderable_textures_; |
| } |
| - texture->SetTarget(target, MaxLevelsForTarget(target)); |
| + texture->SetTarget(feature_info_, target, MaxLevelsForTarget(target)); |
| + if (!texture->CanRender(feature_info_)) { |
| + ++num_unrenderable_textures_; |
| + } |
| +} |
| + |
| +void TextureManager::SetStreamTexture(Texture* texture, bool stream_texture) { |
| + DCHECK(texture); |
| + if (!texture->CanRender(feature_info_)) { |
| + DCHECK_NE(0, num_unrenderable_textures_); |
| + --num_unrenderable_textures_; |
| + } |
| + texture->SetStreamTexture(stream_texture); |
| if (!texture->CanRender(feature_info_)) { |
| ++num_unrenderable_textures_; |
| } |