summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-26 22:24:19 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-26 22:24:19 +0000
commit59f3ca0c386a043411639123d38babf3b1028ada (patch)
tree1862dfa2f693c42966d3cb2292388a19436bd6e5 /gpu
parent87eb275ae8ae3cbd761e009503e6384f709f966a (diff)
downloadchromium_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.cc5
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc14
-rw-r--r--gpu/command_buffer/service/texture_manager.cc7
-rw-r--r--gpu/command_buffer/service/texture_manager.h16
-rw-r--r--gpu/command_buffer/service/texture_manager_unittest.cc27
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());
}