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_; | 
| } |