summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-27 17:42:50 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-27 17:42:50 +0000
commit6c36f5e4b14f45fd54d60fa9abe7fc99c749eb49 (patch)
treea29f3e1a76eab8efab08a6fe38e8a6ed4e4fd9be /gpu
parent40f809e59fa0429f7ec788ef6b71be291bc5ad21 (diff)
downloadchromium_src-6c36f5e4b14f45fd54d60fa9abe7fc99c749eb49.zip
chromium_src-6c36f5e4b14f45fd54d60fa9abe7fc99c749eb49.tar.gz
chromium_src-6c36f5e4b14f45fd54d60fa9abe7fc99c749eb49.tar.bz2
Fix issue with unused mips.
The bug was 1) Create a texture with N mips (4x4, 2x2, 1x1) 2) Then update the texture to use less than N mips (2x2, 1x1) etc. The code would incorrectly look at the unused mips in determining whether or not the texture was renderable. TEST=unit test BUG=97207 R=zmo@chromium.org Review URL: http://codereview.chromium.org/8041048 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102967 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/service/texture_manager.cc9
-rw-r--r--gpu/command_buffer/service/texture_manager_unittest.cc36
2 files changed, 36 insertions, 9 deletions
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index 02f5ab9..134308d 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -343,11 +343,10 @@ void TextureManager::TextureInfo::Update(const FeatureInfo* feature_info) {
// Update texture_complete and cube_complete status.
const TextureInfo::LevelInfo& first_face = level_infos_[0][0];
+ int levels_needed = ComputeMipMapCount(
+ first_face.width, first_face.height, first_face.depth);
texture_complete_ =
- (max_level_set_ == ComputeMipMapCount(first_face.width,
- first_face.height,
- first_face.depth) - 1) &&
- max_level_set_ >= 0;
+ max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0;
cube_complete_ = (level_infos_.size() == 6) &&
(first_face.width == first_face.height);
if (first_face.width == 0 || first_face.height == 0) {
@@ -381,7 +380,7 @@ void TextureManager::TextureInfo::Update(const FeatureInfo* feature_info) {
GLsizei width = level0.width;
GLsizei height = level0.height;
GLsizei depth = level0.depth;
- for (GLint jj = 1; jj <= max_level_set_; ++jj) {
+ for (GLint jj = 1; jj < levels_needed; ++jj) {
// compute required size for mip.
width = std::max(1, width >> 1);
height = std::max(1, height >> 1);
diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc
index 6800481..cf33e72 100644
--- a/gpu/command_buffer/service/texture_manager_unittest.cc
+++ b/gpu/command_buffer/service/texture_manager_unittest.cc
@@ -377,9 +377,37 @@ TEST_F(TextureInfoTest, POT2D) {
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
// Make mips.
EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
- EXPECT_FALSE(info_->CanRender(&feature_info_));
- EXPECT_FALSE(info_->texture_complete());
- EXPECT_TRUE(manager_.HaveUnrenderableTextures());
+ EXPECT_TRUE(info_->CanRender(&feature_info_));
+ EXPECT_TRUE(info_->texture_complete());
+ EXPECT_FALSE(manager_.HaveUnrenderableTextures());
+}
+
+TEST_F(TextureInfoTest, UnusedMips) {
+ manager_.SetInfoTarget(info_, GL_TEXTURE_2D);
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info_->target());
+ // Set level zero to large size.
+ manager_.SetLevelInfo(&feature_info_, info_,
+ GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
+ EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
+ EXPECT_FALSE(info_->npot());
+ EXPECT_TRUE(info_->texture_complete());
+ EXPECT_TRUE(info_->CanRender(&feature_info_));
+ EXPECT_FALSE(manager_.HaveUnrenderableTextures());
+ // Set level zero to large smaller (levels unused mips)
+ manager_.SetLevelInfo(&feature_info_, info_,
+ GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
+ EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
+ EXPECT_FALSE(info_->npot());
+ EXPECT_TRUE(info_->texture_complete());
+ EXPECT_TRUE(info_->CanRender(&feature_info_));
+ EXPECT_FALSE(manager_.HaveUnrenderableTextures());
+ // Set an unused level to some size
+ manager_.SetLevelInfo(&feature_info_, info_,
+ GL_TEXTURE_2D, 4, GL_RGBA, 16, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
+ EXPECT_FALSE(info_->npot());
+ EXPECT_TRUE(info_->texture_complete());
+ EXPECT_TRUE(info_->CanRender(&feature_info_));
+ EXPECT_FALSE(manager_.HaveUnrenderableTextures());
}
TEST_F(TextureInfoTest, NPOT2D) {
@@ -522,7 +550,7 @@ TEST_F(TextureInfoTest, POTCubeMap) {
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
// Make mips.
EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
- EXPECT_FALSE(info_->texture_complete());
+ EXPECT_TRUE(info_->texture_complete());
EXPECT_TRUE(info_->cube_complete());
}