diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-26 22:24:19 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-26 22:24:19 +0000 |
commit | 59f3ca0c386a043411639123d38babf3b1028ada (patch) | |
tree | 1862dfa2f693c42966d3cb2292388a19436bd6e5 /gpu | |
parent | 87eb275ae8ae3cbd761e009503e6384f709f966a (diff) | |
download | chromium_src-59f3ca0c386a043411639123d38babf3b1028ada.zip chromium_src-59f3ca0c386a043411639123d38babf3b1028ada.tar.gz chromium_src-59f3ca0c386a043411639123d38babf3b1028ada.tar.bz2 |
Workground for glGenerateMipmap bug in some drivers.
TEST=unit tests
BUG=72601
R=zmo@chromium.org
Review URL: http://codereview.chromium.org/6749014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79499 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 5 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc | 14 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_manager.cc | 7 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_manager.h | 16 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_manager_unittest.cc | 27 |
5 files changed, 67 insertions, 2 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 5444b15..d50db61 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -2856,7 +2856,12 @@ void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { "glGenerateMipmaps: Can not generate mips for npot textures"); return; } + // Workaround for Mac driver bug. In the large scheme of things setting + // glTexParamter twice for glGenerateMipmap is probably not a lage performance + // hit so there's probably no need to make this conditional. + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); glGenerateMipmapEXT(target); + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, info->min_filter()); } bool GLES2DecoderImpl::GetHelper( diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc index 931a795..3e7b33a 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -34,11 +34,21 @@ class GLES2DecoderTest1 : public GLES2DecoderTestBase { template <> void GLES2DecoderTestBase::SpecializedSetup<GenerateMipmap, 0>( - bool /* valid */) { + bool valid) { DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); DoTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + if (valid) { + EXPECT_CALL(*gl_, TexParameteri( + GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, TexParameteri( + GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)) + .Times(1) + .RetiresOnSaturation(); + } }; template <> diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc index cf6f468..9e407fa 100644 --- a/gpu/command_buffer/service/texture_manager.cc +++ b/gpu/command_buffer/service/texture_manager.cc @@ -280,6 +280,13 @@ void TextureManager::TextureInfo::SetParameter( void TextureManager::TextureInfo::Update(const FeatureInfo* feature_info) { // Update npot status. npot_ = false; + + if (level_infos_.empty()) { + texture_complete_ = false; + cube_complete_ = false; + return; + } + for (size_t ii = 0; ii < level_infos_.size(); ++ii) { const TextureInfo::LevelInfo& info = level_infos_[ii][0]; if (GLES2Util::IsNPOT(info.width) || diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h index ee3367b..87ed1ce 100644 --- a/gpu/command_buffer/service/texture_manager.h +++ b/gpu/command_buffer/service/texture_manager.h @@ -44,6 +44,22 @@ class TextureManager { owned_(true) { } + GLenum min_filter() const { + return min_filter_; + } + + GLenum mag_filter() const { + return mag_filter_; + } + + GLenum wrap_s() const { + return wrap_s_; + } + + GLenum wrap_t() const { + return wrap_t_; + } + // True if this texture meets all the GLES2 criteria for rendering. // See section 3.8.2 of the GLES2 spec. bool CanRender(const FeatureInfo* feature_info) const; diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc index 0b59fc5..7fab5d3 100644 --- a/gpu/command_buffer/service/texture_manager_unittest.cc +++ b/gpu/command_buffer/service/texture_manager_unittest.cc @@ -93,6 +93,29 @@ TEST_F(TextureManagerTest, Basic) { EXPECT_TRUE(manager_.GetTextureInfo(kClient1Id) == NULL); } +TEST_F(TextureManagerTest, SetParameter) { + const GLuint kClient1Id = 1; + const GLuint kService1Id = 11; + EXPECT_FALSE(manager_.HaveUnrenderableTextures()); + // Check we can create texture. + manager_.CreateTextureInfo(&feature_info_, kClient1Id, kService1Id); + // Check texture got created. + TextureManager::TextureInfo* info = manager_.GetTextureInfo(kClient1Id); + ASSERT_TRUE(info != NULL); + manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), info->min_filter()); + manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), info->mag_filter()); + manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), info->wrap_s()); + manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), info->wrap_t()); +} + TEST_F(TextureManagerTest, Destroy) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; @@ -263,6 +286,10 @@ TEST_F(TextureInfoTest, Basic) { EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_)); EXPECT_FALSE(info_->npot()); EXPECT_FALSE(info_->CanRender(&feature_info_)); + EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR), info_->min_filter()); + EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), info_->mag_filter()); + EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), info_->wrap_s()); + EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), info_->wrap_t()); EXPECT_TRUE(manager_.HaveUnrenderableTextures()); } |