diff options
author | kbr@chromium.org <kbr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-17 03:31:24 +0000 |
---|---|---|
committer | kbr@chromium.org <kbr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-17 03:31:24 +0000 |
commit | 6d9374e8b5ddd573a5da02c9ebf30b80f6a5be6b (patch) | |
tree | 1e0f28c8734c459c06f746bcf258a58e6c67f8e3 /gpu | |
parent | 860b3c893c3c39387221f36158825613462b61c1 (diff) | |
download | chromium_src-6d9374e8b5ddd573a5da02c9ebf30b80f6a5be6b.zip chromium_src-6d9374e8b5ddd573a5da02c9ebf30b80f6a5be6b.tar.gz chromium_src-6d9374e8b5ddd573a5da02c9ebf30b80f6a5be6b.tar.bz2 |
Fix vendor detection code and add gl_PointCoord workaround for Intel GPUs.
BUG=137584
TEST=unit tests; ran WebGL gl-pointcoord.html conformance test on all GPUs on Mac
Review URL: https://chromiumcodereview.appspot.com/10789028
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@146950 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/feature_info.cc | 73 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info_unittest.cc | 21 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 8 |
3 files changed, 66 insertions, 36 deletions
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index c7dce24..7cb350e 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -27,6 +27,41 @@ struct FormatInfo { size_t count; }; +class StringSet { + public: + StringSet() {} + + StringSet(const char* s) { + Init(s); + } + + StringSet(const std::string& str) { + Init(str); + } + + void Init(const char* s) { + std::string str(s ? s : ""); + Init(str); + } + + void Init(const std::string& str) { + std::vector<std::string> tokens; + Tokenize(str, " ", &tokens); + string_set_.insert(tokens.begin(), tokens.end()); + } + + bool Contains(const char* s) { + return string_set_.find(s) != string_set_.end(); + } + + bool Contains(const std::string& s) { + return string_set_.find(s) != string_set_.end(); + } + + private: + std::set<std::string> string_set_; +}; + } // anonymous namespace. FeatureInfo::FeatureInfo() { @@ -77,8 +112,8 @@ class ExtensionHelper { desired_features = NULL; } - InitStringSet(extensions, &have_extensions_); - InitStringSet(desired_features, &desired_extensions_); + have_extensions_.Init(extensions); + desired_extensions_.Init(desired_features); if (!desired_features) { desire_all_features_ = true; @@ -87,13 +122,12 @@ class ExtensionHelper { // Returns true if extension exists. bool Have(const char* extension) { - return have_extensions_.find(extension) != have_extensions_.end(); + return have_extensions_.Contains(extension); } // Returns true of an extension is desired. It may not exist. bool Desire(const char* extension) { - return desire_all_features_ || - desired_extensions_.find(extension) != desired_extensions_.end(); + return desire_all_features_ || desired_extensions_.Contains(extension); } // Returns true if an extension exists and is desired. @@ -102,30 +136,13 @@ class ExtensionHelper { } private: - void InitStringSet(const char* s, std::set<std::string>* string_set) { - std::string str(s ? s : ""); - std::string::size_type lastPos = 0; - while (true) { - std::string::size_type pos = str.find_first_of(" ", lastPos); - if (pos != std::string::npos) { - if (pos - lastPos) { - string_set->insert(str.substr(lastPos, pos - lastPos)); - } - lastPos = pos + 1; - } else { - string_set->insert(str.substr(lastPos)); - break; - } - } - } - bool desire_all_features_; // Extensions that exist. - std::set<std::string> have_extensions_; + StringSet have_extensions_; // Extensions that are desired but may not exist. - std::set<std::string> desired_extensions_; + StringSet desired_extensions_; }; bool FeatureInfo::Initialize(const char* allowed_features) { @@ -162,11 +179,11 @@ void FeatureInfo::AddFeatures(const char* desired_features) { glGetString(string_ids[ii])); if (str) { std::string lstr(StringToLowerASCII(std::string(str))); - feature_flags_.is_intel |= lstr.find("intel") != std::string::npos; - feature_flags_.is_nvidia |= lstr.find("nvidia") != std::string::npos; + StringSet string_set(lstr); + feature_flags_.is_intel |= string_set.Contains("intel"); + feature_flags_.is_nvidia |= string_set.Contains("nvidia"); feature_flags_.is_amd |= - lstr.find("amd") != std::string::npos || - lstr.find("ati") != std::string::npos; + string_set.Contains("amd") || string_set.Contains("ati"); } } diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc index 2724a12..10c7f5c 100644 --- a/gpu/command_buffer/service/feature_info_unittest.cc +++ b/gpu/command_buffer/service/feature_info_unittest.cc @@ -769,11 +769,22 @@ TEST_F(FeatureInfoTest, IsNvidia) { EXPECT_FALSE(info_->feature_flags().is_amd); SetupInitExpectationsWithVendor("", "", "NViDiA"); - FeatureInfo::Ref feature_info(new FeatureInfo()); - feature_info->Initialize(NULL); - EXPECT_FALSE(feature_info->feature_flags().is_intel); - EXPECT_TRUE(feature_info->feature_flags().is_nvidia); - EXPECT_FALSE(feature_info->feature_flags().is_amd); + { + FeatureInfo::Ref feature_info(new FeatureInfo()); + feature_info->Initialize(NULL); + EXPECT_FALSE(feature_info->feature_flags().is_intel); + EXPECT_TRUE(feature_info->feature_flags().is_nvidia); + EXPECT_FALSE(feature_info->feature_flags().is_amd); + } + + SetupInitExpectationsWithVendor("", "NVIDIA Corporation", ""); + { + FeatureInfo::Ref feature_info(new FeatureInfo()); + feature_info->Initialize(NULL); + EXPECT_FALSE(feature_info->feature_flags().is_intel); + EXPECT_TRUE(feature_info->feature_flags().is_nvidia); + EXPECT_FALSE(feature_info->feature_flags().is_amd); + } } TEST_F(FeatureInfoTest, IsAMD) { diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index b1266d8..1824445 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -2311,11 +2311,13 @@ bool GLES2DecoderImpl::Initialize( DoBindFramebuffer(GL_FRAMEBUFFER, 0); DoBindRenderbuffer(GL_RENDERBUFFER, 0); - // AMD drivers apparently get gl_PointCoord backward from the spec - // and this setting makes them work correctly. + // AMD and Intel drivers on Mac OS apparently get gl_PointCoord + // backward from the spec and this setting makes them work + // correctly. rdar://problem/11883495 #if defined(OS_MACOSX) if (!feature_info_->feature_flags().disable_workarounds && - feature_info_->feature_flags().is_amd && + (feature_info_->feature_flags().is_amd || + feature_info_->feature_flags().is_intel) && gfx::GetGLImplementation() == gfx::kGLImplementationDesktopGL) { glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT); } |