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 7c378d405ee0b4473d91b8beb3bc49eb8a7eaf9c..320628179908c16ae28cd538c059e65644573ef5 100644 |
--- a/gpu/command_buffer/service/texture_manager.cc |
+++ b/gpu/command_buffer/service/texture_manager.cc |
@@ -150,9 +150,13 @@ TextureManager::TextureInfo::LevelInfo::LevelInfo(const LevelInfo& rhs) |
border(rhs.border), |
format(rhs.format), |
type(rhs.type), |
+ image(rhs.image), |
estimated_size(rhs.estimated_size) { |
} |
+TextureManager::TextureInfo::LevelInfo::~LevelInfo() { |
+} |
+ |
bool TextureManager::TextureInfo::CanRender( |
const FeatureInfo* feature_info) const { |
if (target_ == 0) { |
@@ -252,7 +256,8 @@ bool TextureManager::TextureInfo::CanGenerateMipmaps( |
(info.internal_format != first.internal_format) || |
(info.type != first.type) || |
feature_info->validators()->compressed_texture_format.IsValid( |
- info.internal_format)) { |
+ info.internal_format) || |
+ info.image) { |
return false; |
} |
} |
@@ -327,6 +332,7 @@ void TextureManager::TextureInfo::SetLevelInfo( |
info.border = border; |
info.format = format; |
info.type = type; |
+ info.image = 0; |
estimated_size_ -= info.estimated_size; |
GLES2Util::ComputeImageDataSizes( |
@@ -616,6 +622,36 @@ bool TextureManager::TextureInfo::ClearLevel( |
return info.cleared; |
} |
+void TextureManager::TextureInfo::SetLevelImage( |
+ const FeatureInfo* feature_info, |
+ GLenum target, |
+ GLint level, |
+ gfx::GLImage* image) { |
+ DCHECK_GE(level, 0); |
+ DCHECK_LT(static_cast<size_t>(GLTargetToFaceIndex(target)), |
+ level_infos_.size()); |
+ DCHECK_LT(static_cast<size_t>(level), |
+ level_infos_[GLTargetToFaceIndex(target)].size()); |
+ TextureInfo::LevelInfo& info = |
+ level_infos_[GLTargetToFaceIndex(target)][level]; |
+ DCHECK_EQ(info.target, target); |
+ DCHECK_EQ(info.level, level); |
+ info.image = image; |
+} |
+ |
+gfx::GLImage* TextureManager::TextureInfo::GetLevelImage( |
+ GLint face, GLint level) const { |
+ size_t face_index = GLTargetToFaceIndex(face); |
+ if (level >= 0 && face_index < level_infos_.size() && |
+ static_cast<size_t>(level) < level_infos_[face_index].size()) { |
+ const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; |
+ if (info.target != 0) { |
+ return info.image; |
+ } |
+ } |
+ return 0; |
+} |
+ |
TextureManager::TextureManager( |
MemoryTracker* memory_tracker, |
FeatureInfo* feature_info, |
@@ -1070,5 +1106,28 @@ GLsizei TextureManager::ComputeMipMapCount( |
return 1 + base::bits::Log2Floor(std::max(std::max(width, height), depth)); |
} |
+void TextureManager::SetLevelImage( |
+ TextureManager::TextureInfo* info, |
+ GLenum target, |
+ GLint level, |
+ gfx::GLImage* image) { |
+ DCHECK(info); |
+ if (!info->CanRender(feature_info_)) { |
+ DCHECK_NE(0, num_unrenderable_textures_); |
+ --num_unrenderable_textures_; |
+ } |
+ if (!info->SafeToRenderFrom()) { |
+ DCHECK_NE(0, num_unsafe_textures_); |
+ --num_unsafe_textures_; |
+ } |
+ info->SetLevelImage(feature_info_, target, level, image); |
+ if (!info->CanRender(feature_info_)) { |
+ ++num_unrenderable_textures_; |
+ } |
+ if (!info->SafeToRenderFrom()) { |
+ ++num_unsafe_textures_; |
+ } |
+} |
+ |
} // namespace gles2 |
} // namespace gpu |