| 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..27e48920ce501c572c4435da597e7d3918821743 100644
|
| --- a/gpu/command_buffer/service/texture_manager.cc
|
| +++ b/gpu/command_buffer/service/texture_manager.cc
|
| @@ -163,6 +163,24 @@ 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 (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 +261,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 +279,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 +537,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 +852,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_;
|
| }
|
|
|