summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorkbr@chromium.org <kbr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-17 03:31:24 +0000
committerkbr@chromium.org <kbr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-17 03:31:24 +0000
commit6d9374e8b5ddd573a5da02c9ebf30b80f6a5be6b (patch)
tree1e0f28c8734c459c06f746bcf258a58e6c67f8e3 /gpu
parent860b3c893c3c39387221f36158825613462b61c1 (diff)
downloadchromium_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.cc73
-rw-r--r--gpu/command_buffer/service/feature_info_unittest.cc21
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc8
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);
}