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