diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-27 17:42:50 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-27 17:42:50 +0000 |
commit | 6c36f5e4b14f45fd54d60fa9abe7fc99c749eb49 (patch) | |
tree | a29f3e1a76eab8efab08a6fe38e8a6ed4e4fd9be /gpu | |
parent | 40f809e59fa0429f7ec788ef6b71be291bc5ad21 (diff) | |
download | chromium_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.cc | 9 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_manager_unittest.cc | 36 |
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()); } |