[email protected] | a37d7ff | 2014-01-17 21:31:00 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "ui/gl/gl_version_info.h" |
| 6 | |
sievers | e3b17fd5 | 2015-01-29 04:00:53 | [diff] [blame] | 7 | #include "base/strings/string_number_conversions.h" |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 8 | #include "base/strings/string_split.h" |
sievers | e3b17fd5 | 2015-01-29 04:00:53 | [diff] [blame] | 9 | #include "base/strings/string_tokenizer.h" |
[email protected] | a37d7ff | 2014-01-17 21:31:00 | [diff] [blame] | 10 | #include "base/strings/string_util.h" |
| 11 | |
kbr | b1cca00 | 2015-04-11 02:55:20 | [diff] [blame] | 12 | namespace { |
| 13 | |
| 14 | bool DesktopCoreCommonCheck( |
| 15 | bool is_es, unsigned major_version, unsigned minor_version) { |
| 16 | return (!is_es && |
| 17 | ((major_version == 3 && minor_version >= 2) || |
| 18 | major_version > 3)); |
| 19 | } |
| 20 | |
| 21 | } |
| 22 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 23 | namespace gl { |
[email protected] | a37d7ff | 2014-01-17 21:31:00 | [diff] [blame] | 24 | |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 25 | GLVersionInfo::GLVersionInfo(const char* version_str, |
| 26 | const char* renderer_str, |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 27 | const char* extensions_str) |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 28 | : GLVersionInfo() { |
| 29 | std::set<std::string> extensions; |
| 30 | if (extensions_str) { |
| 31 | auto split = base::SplitString(extensions_str, " ", base::KEEP_WHITESPACE, |
| 32 | base::SPLIT_WANT_NONEMPTY); |
| 33 | extensions.insert(split.begin(), split.end()); |
| 34 | } |
| 35 | Initialize(version_str, renderer_str, extensions); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 36 | } |
| 37 | |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 38 | GLVersionInfo::GLVersionInfo(const char* version_str, |
| 39 | const char* renderer_str, |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 40 | const std::set<std::string>& extensions) |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 41 | : GLVersionInfo() { |
| 42 | Initialize(version_str, renderer_str, extensions); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 43 | } |
| 44 | |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 45 | GLVersionInfo::GLVersionInfo() |
[email protected] | a37d7ff | 2014-01-17 21:31:00 | [diff] [blame] | 46 | : is_es(false), |
sievers | e3b17fd5 | 2015-01-29 04:00:53 | [diff] [blame] | 47 | is_angle(false), |
junov | 0c61414 | 2016-07-21 18:56:02 | [diff] [blame] | 48 | is_mesa(false), |
sievers | e3b17fd5 | 2015-01-29 04:00:53 | [diff] [blame] | 49 | major_version(0), |
| 50 | minor_version(0), |
zmo | 9192d28 | 2016-04-29 18:22:58 | [diff] [blame] | 51 | is_es2(false), |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 52 | is_es3(false), |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 53 | is_desktop_core_profile(false), |
| 54 | is_es3_capable(false) {} |
| 55 | |
| 56 | void GLVersionInfo::Initialize(const char* version_str, |
| 57 | const char* renderer_str, |
| 58 | const std::set<std::string>& extensions) { |
[email protected] | a37d7ff | 2014-01-17 21:31:00 | [diff] [blame] | 59 | if (version_str) { |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 60 | ParseVersionString(version_str, &major_version, &minor_version, |
zmo | 9192d28 | 2016-04-29 18:22:58 | [diff] [blame] | 61 | &is_es, &is_es2, &is_es3); |
[email protected] | a37d7ff | 2014-01-17 21:31:00 | [diff] [blame] | 62 | } |
[email protected] | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 63 | if (renderer_str) { |
brettw | 9550931 | 2015-07-16 23:57:33 | [diff] [blame] | 64 | is_angle = base::StartsWith(renderer_str, "ANGLE", |
| 65 | base::CompareCase::SENSITIVE); |
junov | 0c61414 | 2016-07-21 18:56:02 | [diff] [blame] | 66 | is_mesa = base::StartsWith(renderer_str, "Mesa", |
| 67 | base::CompareCase::SENSITIVE); |
[email protected] | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 68 | } |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 69 | is_desktop_core_profile = |
| 70 | DesktopCoreCommonCheck(is_es, major_version, minor_version) && |
| 71 | extensions.find("GL_ARB_compatibility") == extensions.end(); |
| 72 | is_es3_capable = IsES3Capable(extensions); |
| 73 | } |
| 74 | |
| 75 | bool GLVersionInfo::IsES3Capable( |
| 76 | const std::set<std::string>& extensions) const { |
| 77 | auto has_extension = [&extensions](std::string extension) -> bool { |
| 78 | return extensions.find(extension) != extensions.end(); |
| 79 | }; |
| 80 | |
| 81 | // Version ES3 capable without extensions needed. |
| 82 | if (IsAtLeastGLES(3, 0) || IsAtLeastGL(4, 2)) { |
| 83 | return true; |
| 84 | } |
| 85 | |
zmo | 05f50f9b | 2016-10-29 00:40:29 | [diff] [blame] | 86 | // Don't try supporting ES3 on ES2, or desktop before 3.3. |
| 87 | if (is_es || !IsAtLeastGL(3, 3)) { |
cwallez | 3b2dfed | 2016-06-27 20:03:27 | [diff] [blame] | 88 | return false; |
| 89 | } |
| 90 | |
zmo | 05f50f9b | 2016-10-29 00:40:29 | [diff] [blame] | 91 | bool has_transform_feedback = |
| 92 | (IsAtLeastGL(4, 0) || has_extension("GL_ARB_transform_feedback2")); |
kbr | 2bd1f05 | 2016-12-05 20:41:19 | [diff] [blame^] | 93 | |
| 94 | // This code used to require the GL_ARB_gpu_shader5 extension in order to |
| 95 | // have support for dynamic indexing of sampler arrays, which was |
| 96 | // optionally supported in ESSL 1.00. However, since this is expressly |
| 97 | // forbidden in ESSL 3.00, and some desktop drivers (specifically |
| 98 | // Mesa/Gallium on AMD GPUs) don't support it, we no longer require it. |
| 99 | |
zmo | 05f50f9b | 2016-10-29 00:40:29 | [diff] [blame] | 100 | // tex storage is available in core spec since GL 4.2. |
zmo | 7ec1021 | 2016-10-26 23:27:40 | [diff] [blame] | 101 | bool has_tex_storage = has_extension("GL_ARB_texture_storage"); |
zmo | 05f50f9b | 2016-10-29 00:40:29 | [diff] [blame] | 102 | |
| 103 | // TODO(cwallez) check for texture related extensions. See crbug.com/623577 |
| 104 | |
kbr | 2bd1f05 | 2016-12-05 20:41:19 | [diff] [blame^] | 105 | return (has_transform_feedback && has_tex_storage); |
[email protected] | a37d7ff | 2014-01-17 21:31:00 | [diff] [blame] | 106 | } |
| 107 | |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 108 | void GLVersionInfo::ParseVersionString(const char* version_str, |
| 109 | unsigned* major_version, |
| 110 | unsigned* minor_version, |
| 111 | bool* is_es, |
zmo | 9192d28 | 2016-04-29 18:22:58 | [diff] [blame] | 112 | bool* is_es2, |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 113 | bool* is_es3) { |
| 114 | // Make sure the outputs are always initialized. |
| 115 | *major_version = 0; |
| 116 | *minor_version = 0; |
| 117 | *is_es = false; |
zmo | 9192d28 | 2016-04-29 18:22:58 | [diff] [blame] | 118 | *is_es2 = false; |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 119 | *is_es3 = false; |
zmo | 9a7b17e | 2015-05-06 00:22:33 | [diff] [blame] | 120 | if (!version_str) |
| 121 | return; |
brettw | 8e2106d | 2015-08-11 19:30:22 | [diff] [blame] | 122 | std::string lstr(base::ToLowerASCII(version_str)); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 123 | *is_es = (lstr.length() > 12) && (lstr.substr(0, 9) == "opengl es"); |
| 124 | if (*is_es) |
| 125 | lstr = lstr.substr(10, 3); |
xinghua.cao | 4999331 | 2016-06-22 07:21:50 | [diff] [blame] | 126 | base::StringTokenizer tokenizer(lstr.begin(), lstr.end(), ". "); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 127 | unsigned major, minor; |
| 128 | if (tokenizer.GetNext() && |
| 129 | base::StringToUint(tokenizer.token_piece(), &major)) { |
| 130 | *major_version = major; |
| 131 | if (tokenizer.GetNext() && |
| 132 | base::StringToUint(tokenizer.token_piece(), &minor)) { |
| 133 | *minor_version = minor; |
| 134 | } |
| 135 | } |
zmo | 9192d28 | 2016-04-29 18:22:58 | [diff] [blame] | 136 | if (*is_es && *major_version == 2) |
| 137 | *is_es2 = true; |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 138 | if (*is_es && *major_version == 3) |
| 139 | *is_es3 = true; |
martina.kollarova | 9709e1c | 2016-03-07 09:28:11 | [diff] [blame] | 140 | DCHECK(major_version != 0); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 141 | } |
| 142 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 143 | } // namespace gl |