diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-15 18:21:22 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-15 18:21:22 +0000 |
commit | 5c67c703cfe5ebfc385715b1ad0f36d851fc7d15 (patch) | |
tree | 826ef8a2aac12bbf8a4048881dedec3d5ff91199 /gpu/command_buffer | |
parent | 0e46c2782de8924ca473e96dcba2e800f31e47a2 (diff) | |
download | chromium_src-5c67c703cfe5ebfc385715b1ad0f36d851fc7d15.zip chromium_src-5c67c703cfe5ebfc385715b1ad0f36d851fc7d15.tar.gz chromium_src-5c67c703cfe5ebfc385715b1ad0f36d851fc7d15.tar.bz2 |
Don't enable occlusion query on Linux with Intel drivers.
TEST=none
BUG=128083
Review URL: https://chromiumcodereview.appspot.com/10381137
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@137179 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer')
-rw-r--r-- | gpu/command_buffer/service/context_group.cc | 12 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info.cc | 21 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info.h | 8 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info_unittest.cc | 43 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 6 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc | 6 | ||||
-rw-r--r-- | gpu/command_buffer/service/test_helper.cc | 15 | ||||
-rw-r--r-- | gpu/command_buffer/service/test_helper.h | 2 |
8 files changed, 84 insertions, 29 deletions
diff --git a/gpu/command_buffer/service/context_group.cc b/gpu/command_buffer/service/context_group.cc index 2a47fd4..d873ace 100644 --- a/gpu/command_buffer/service/context_group.cc +++ b/gpu/command_buffer/service/context_group.cc @@ -163,17 +163,11 @@ bool ContextGroup::Initialize(const DisallowedFeatures& disallowed_features, // TODO(gman): Update this code to check for a specific version of // the drivers above which we no longer need this fix. #if defined(OS_MACOSX) - const char* vendor_str = reinterpret_cast<const char*>( - glGetString(GL_VENDOR)); - if (vendor_str) { - std::string lc_str(::StringToLowerASCII(std::string(vendor_str))); - bool intel_on_mac = strstr(lc_str.c_str(), "intel"); - if (intel_on_mac) { - max_texture_size = std::min( + if (feature_info_->feature_flags().is_intel) { + max_texture_size = std::min( static_cast<GLint>(4096), max_texture_size); - max_cube_map_texture_size = std::min( + max_cube_map_texture_size = std::min( static_cast<GLint>(512), max_cube_map_texture_size); - } } #endif texture_manager_.reset(new TextureManager(feature_info_.get(), diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index 011fecc..899c381 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -7,6 +7,7 @@ #include <set> #include "base/string_number_conversions.h" +#include "base/string_util.h" #include "gpu/command_buffer/service/gl_utils.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_implementation.h" @@ -108,6 +109,16 @@ void FeatureInfo::AddFeatures(const char* desired_features) { gfx::GLContext::GetCurrent()->GetExtensions().c_str() : reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)), desired_features); + const char* vendor_str = reinterpret_cast<const char*>( + glGetString(GL_VENDOR)); + if (vendor_str) { + std::string str(StringToLowerASCII(std::string(vendor_str))); + feature_flags_.is_intel = str.find("intel") != std::string::npos; + feature_flags_.is_nvidia = str.find("nvidia") != std::string::npos; + feature_flags_.is_amd = + str.find("amd") != std::string::npos || + str.find("ati") != std::string::npos; + } bool npot_ok = false; @@ -446,7 +457,15 @@ void FeatureInfo::AddFeatures(const char* desired_features) { ext.Have("GL_EXT_occlusion_query_boolean"); bool have_arb_occlusion_query2 = ext.Have("GL_ARB_occlusion_query2"); bool have_arb_occlusion_query = ext.Have("GL_ARB_occlusion_query"); - if (ext.Desire("GL_EXT_occlusion_query_boolean") && + bool ext_occlusion_query_disallowed = false; + +#if defined(OS_LINUX) + // Intel drivers on Linux appear to be buggy. + ext_occlusion_query_disallowed = feature_flags_.is_intel; +#endif + + if (!ext_occlusion_query_disallowed && + ext.Desire("GL_EXT_occlusion_query_boolean") && (have_ext_occlusion_query_boolean || have_arb_occlusion_query2 || have_arb_occlusion_query)) { diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h index 53b48f6..da98c86 100644 --- a/gpu/command_buffer/service/feature_info.h +++ b/gpu/command_buffer/service/feature_info.h @@ -35,7 +35,10 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { angle_instanced_arrays(false), occlusion_query_boolean(false), use_arb_occlusion_query2_for_occlusion_query_boolean(false), - use_arb_occlusion_query_for_occlusion_query_boolean(false) { + use_arb_occlusion_query_for_occlusion_query_boolean(false), + is_intel(false), + is_nvidia(false), + is_amd(false) { } bool chromium_framebuffer_multisample; @@ -53,6 +56,9 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { bool occlusion_query_boolean; bool use_arb_occlusion_query2_for_occlusion_query_boolean; bool use_arb_occlusion_query_for_occlusion_query_boolean; + bool is_intel; + bool is_nvidia; + bool is_amd; }; FeatureInfo(); diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc index 609ca48..283f6d4 100644 --- a/gpu/command_buffer/service/feature_info_unittest.cc +++ b/gpu/command_buffer/service/feature_info_unittest.cc @@ -33,7 +33,13 @@ class FeatureInfoTest : public testing::Test { } void SetupInitExpectations(const char* extensions) { - TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), extensions); + SetupInitExpectationsWithVendor(extensions, ""); + } + + void SetupInitExpectationsWithVendor( + const char* extensions, const char* vendor) { + TestHelper::SetupFeatureInfoInitExpectationsWithVendor( + gl_.get(), extensions, vendor); } protected: @@ -72,6 +78,9 @@ TEST_F(FeatureInfoTest, Basic) { ).use_arb_occlusion_query2_for_occlusion_query_boolean); EXPECT_FALSE(info_->feature_flags( ).use_arb_occlusion_query_for_occlusion_query_boolean); + EXPECT_FALSE(info_->feature_flags().is_intel); + EXPECT_FALSE(info_->feature_flags().is_nvidia); + EXPECT_FALSE(info_->feature_flags().is_amd); } TEST_F(FeatureInfoTest, InitializeNoExtensions) { @@ -491,6 +500,38 @@ TEST_F(FeatureInfoTest, InitializeARB_occlusion_query2) { ).use_arb_occlusion_query_for_occlusion_query_boolean); } +TEST_F(FeatureInfoTest, IsIntel) { + SetupInitExpectationsWithVendor("", "iNTel"); + info_->Initialize(NULL); + EXPECT_TRUE(info_->feature_flags().is_intel); + EXPECT_FALSE(info_->feature_flags().is_nvidia); + EXPECT_FALSE(info_->feature_flags().is_amd); +} + +TEST_F(FeatureInfoTest, IsNvidia) { + SetupInitExpectationsWithVendor("", "nvIdIa"); + info_->Initialize(NULL); + EXPECT_FALSE(info_->feature_flags().is_intel); + EXPECT_TRUE(info_->feature_flags().is_nvidia); + EXPECT_FALSE(info_->feature_flags().is_amd); +} + +TEST_F(FeatureInfoTest, IsAMD) { + SetupInitExpectationsWithVendor("", "aMd"); + info_->Initialize(NULL); + EXPECT_FALSE(info_->feature_flags().is_intel); + EXPECT_FALSE(info_->feature_flags().is_nvidia); + EXPECT_TRUE(info_->feature_flags().is_amd); +} + +TEST_F(FeatureInfoTest, IsAMDATI) { + SetupInitExpectationsWithVendor("", "aTI"); + info_->Initialize(NULL); + EXPECT_FALSE(info_->feature_flags().is_intel); + EXPECT_FALSE(info_->feature_flags().is_nvidia); + EXPECT_TRUE(info_->feature_flags().is_amd); +} + } // namespace gles2 } // namespace gpu diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 33d35d7..8a52486 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -2236,12 +2236,10 @@ bool GLES2DecoderImpl::Initialize( if (!disable_workarounds_) { #if defined(OS_MACOSX) - const char* vendor_str = reinterpret_cast<const char*>( - glGetString(GL_VENDOR)); needs_mac_nvidia_driver_workaround_ = - vendor_str && strstr(vendor_str, "NVIDIA"); + feature_info_->feature_flags().is_nvidia; needs_glsl_built_in_function_emulation_ = - vendor_str && (strstr(vendor_str, "ATI") || strstr(vendor_str, "AMD")); + feature_info_->feature_flags().is_amd; #endif } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 3ef8466..a34cbb9 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc @@ -296,12 +296,6 @@ void GLES2DecoderTestBase::InitDecoder( .Times(1) .RetiresOnSaturation(); -#if defined(OS_MACOSX) - EXPECT_CALL(*gl_, GetString(GL_VENDOR)) - .Times(1) - .RetiresOnSaturation(); -#endif - EXPECT_CALL(*gl_, Viewport( kViewportX, kViewportY, kViewportWidth, kViewportHeight)) .Times(1) diff --git a/gpu/command_buffer/service/test_helper.cc b/gpu/command_buffer/service/test_helper.cc index cc14a59..151c034 100644 --- a/gpu/command_buffer/service/test_helper.cc +++ b/gpu/command_buffer/service/test_helper.cc @@ -190,13 +190,6 @@ void TestHelper::SetupContextGroupInitExpectations( EXPECT_CALL(*gl, GetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, _)) .WillOnce(SetArgumentPointee<1>(kMaxCubeMapTextureSize)) .RetiresOnSaturation(); - -#if defined(OS_MACOSX) - EXPECT_CALL(*gl, GetString(GL_VENDOR)) - .WillOnce(Return(reinterpret_cast<const uint8*>(""))) - .RetiresOnSaturation(); -#endif - EXPECT_CALL(*gl, GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, _)) .WillOnce(SetArgumentPointee<1>(kMaxTextureImageUnits)) .RetiresOnSaturation(); @@ -218,11 +211,19 @@ void TestHelper::SetupContextGroupInitExpectations( void TestHelper::SetupFeatureInfoInitExpectations( ::gfx::MockGLInterface* gl, const char* extensions) { + SetupFeatureInfoInitExpectationsWithVendor(gl, extensions, ""); +} + +void TestHelper::SetupFeatureInfoInitExpectationsWithVendor( + ::gfx::MockGLInterface* gl, const char* extensions, const char* vendor) { InSequence sequence; EXPECT_CALL(*gl, GetString(GL_EXTENSIONS)) .WillOnce(Return(reinterpret_cast<const uint8*>(extensions))) .RetiresOnSaturation(); + EXPECT_CALL(*gl, GetString(GL_VENDOR)) + .WillOnce(Return(reinterpret_cast<const uint8*>(vendor))) + .RetiresOnSaturation(); } void TestHelper::SetupExpectationsForClearingUniforms( diff --git a/gpu/command_buffer/service/test_helper.h b/gpu/command_buffer/service/test_helper.h index 961cae2..1fb0edf 100644 --- a/gpu/command_buffer/service/test_helper.h +++ b/gpu/command_buffer/service/test_helper.h @@ -61,6 +61,8 @@ class TestHelper { const char* extensions); static void SetupFeatureInfoInitExpectations( ::gfx::MockGLInterface* gl, const char* extensions); + static void SetupFeatureInfoInitExpectationsWithVendor( + ::gfx::MockGLInterface* gl, const char* extensions, const char* vendor); static void SetupTextureManagerInitExpectations(::gfx::MockGLInterface* gl, const char* extensions); |