blob: 3732b481a932b8fa83080d06de808792dbf5738e [file] [log] [blame]
bsalomon@google.com27847de2011-02-22 20:59:41 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
bsalomon@google.com27847de2011-02-22 20:59:41 +00006 */
7
epoger@google.comec3ed6a2011-07-28 14:26:00 +00008
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +00009#include "GrGLUtil.h"
Greg Daniele7d8da42017-12-04 11:23:19 -050010#include "GrTypesPriv.h"
commit-bot@chromium.org215a6822013-09-05 18:28:42 +000011#include "SkMatrix.h"
bungeman@google.comfab44db2013-10-11 18:50:45 +000012#include <stdio.h>
bsalomon@google.comf987d1b2011-04-04 17:13:52 +000013
bsalomon@google.com0b77d682011-08-19 13:28:54 +000014void GrGLClearErr(const GrGLInterface* gl) {
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +000015 while (GR_GL_NO_ERROR != gl->fFunctions.fGetError()) {}
bsalomon@google.comf987d1b2011-04-04 17:13:52 +000016}
bsalomon@google.com27847de2011-02-22 20:59:41 +000017
bsalomon@google.com845eafd2012-06-18 12:27:29 +000018namespace {
19const char *get_error_string(uint32_t err) {
20 switch (err) {
21 case GR_GL_NO_ERROR:
22 return "";
23 case GR_GL_INVALID_ENUM:
24 return "Invalid Enum";
25 case GR_GL_INVALID_VALUE:
26 return "Invalid Value";
27 case GR_GL_INVALID_OPERATION:
28 return "Invalid Operation";
29 case GR_GL_OUT_OF_MEMORY:
30 return "Out of Memory";
31 case GR_GL_CONTEXT_LOST:
32 return "Context Lost";
33 }
34 return "Unknown";
35}
36}
37
bsalomon@google.com0b77d682011-08-19 13:28:54 +000038void GrGLCheckErr(const GrGLInterface* gl,
39 const char* location,
40 const char* call) {
41 uint32_t err = GR_GL_GET_ERROR(gl);
twiz@google.com0f31ca72011-03-18 17:38:11 +000042 if (GR_GL_NO_ERROR != err) {
tfarina38406c82014-10-31 07:11:12 -070043 SkDebugf("---- glGetError 0x%x(%s)", err, get_error_string(err));
bsalomon49f085d2014-09-05 13:34:00 -070044 if (location) {
tfarina38406c82014-10-31 07:11:12 -070045 SkDebugf(" at\n\t%s", location);
bsalomon@google.com27847de2011-02-22 20:59:41 +000046 }
bsalomon49f085d2014-09-05 13:34:00 -070047 if (call) {
tfarina38406c82014-10-31 07:11:12 -070048 SkDebugf("\n\t\t%s", call);
bsalomon@google.com27847de2011-02-22 20:59:41 +000049 }
tfarina38406c82014-10-31 07:11:12 -070050 SkDebugf("\n");
bsalomon@google.com27847de2011-02-22 20:59:41 +000051 }
52}
53
54///////////////////////////////////////////////////////////////////////////////
55
bsalomon@google.comd5d10492011-04-28 21:16:31 +000056#if GR_GL_LOG_CALLS
57 bool gLogCallsGL = !!(GR_GL_LOG_CALLS_START);
58#endif
bsalomon@google.com27847de2011-02-22 20:59:41 +000059
bsalomon@google.comd5d10492011-04-28 21:16:31 +000060#if GR_GL_CHECK_ERROR
61 bool gCheckErrorGL = !!(GR_GL_CHECK_ERROR_START);
62#endif
63
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000064///////////////////////////////////////////////////////////////////////////////
65
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000066GrGLStandard GrGLGetStandardInUseFromString(const char* versionString) {
halcanary96fcdcc2015-08-27 07:41:13 -070067 if (nullptr == versionString) {
68 SkDebugf("nullptr GL version string.");
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000069 return kNone_GrGLStandard;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000070 }
71
72 int major, minor;
73
74 // check for desktop
75 int n = sscanf(versionString, "%d.%d", &major, &minor);
76 if (2 == n) {
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000077 return kGL_GrGLStandard;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000078 }
79
80 // check for ES 1
81 char profile[2];
bsalomon@google.com960d1142013-05-29 13:11:54 +000082 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1, &major, &minor);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000083 if (4 == n) {
84 // we no longer support ES1.
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000085 return kNone_GrGLStandard;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000086 }
87
88 // check for ES2
89 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
90 if (2 == n) {
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000091 return kGLES_GrGLStandard;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000092 }
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +000093 return kNone_GrGLStandard;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000094}
95
cdalton1acea862015-06-02 13:05:52 -070096void GrGLGetDriverInfo(GrGLStandard standard,
97 GrGLVendor vendor,
98 const char* rendererString,
99 const char* versionString,
100 GrGLDriver* outDriver,
101 GrGLDriverVersion* outVersion) {
Brian Salomon9a544bc2018-04-04 16:12:31 -0400102 int major, minor, rev, driverMajor, driverMinor, driverPoint;
derekfa6ca5a02014-11-03 13:36:40 -0800103
cdalton1acea862015-06-02 13:05:52 -0700104 *outDriver = kUnknown_GrGLDriver;
105 *outVersion = GR_GL_DRIVER_UNKNOWN_VER;
bsalomon6383ac02016-03-23 14:55:21 -0700106 // These null checks are for test GL contexts that return nullptr in their
107 // glGetString implementation.
108 if (!rendererString) {
109 rendererString = "";
110 }
111 if (!versionString) {
112 versionString = "";
113 }
cdalton1acea862015-06-02 13:05:52 -0700114
Brian Salomona392dba2017-03-16 15:38:57 -0400115 static const char kChromium[] = "Chromium";
116 char suffix[SK_ARRAY_COUNT(kChromium)];
117 if (0 == strcmp(rendererString, kChromium) ||
118 (3 == sscanf(versionString, "OpenGL ES %d.%d %8s", &major, &minor, suffix) &&
119 0 == strcmp(kChromium, suffix))) {
cdalton1acea862015-06-02 13:05:52 -0700120 *outDriver = kChromium_GrGLDriver;
121 return;
122 }
derekfa6ca5a02014-11-03 13:36:40 -0800123
124 if (standard == kGL_GrGLStandard) {
cdalton1acea862015-06-02 13:05:52 -0700125 if (kNVIDIA_GrGLVendor == vendor) {
126 *outDriver = kNVIDIA_GrGLDriver;
127 int n = sscanf(versionString, "%d.%d.%d NVIDIA %d.%d",
128 &major, &minor, &rev, &driverMajor, &driverMinor);
129 // Some older NVIDIA drivers don't report the driver version.
130 if (5 == n) {
Brian Salomon9a544bc2018-04-04 16:12:31 -0400131 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, 0);
cdalton1acea862015-06-02 13:05:52 -0700132 }
133 return;
134 }
cdalton1acea862015-06-02 13:05:52 -0700135 int n = sscanf(versionString, "%d.%d Mesa %d.%d",
136 &major, &minor, &driverMajor, &driverMinor);
Chris Dalton06cd6662017-10-07 14:37:57 -0600137 if (4 != n) {
138 n = sscanf(versionString, "%d.%d (Core Profile) Mesa %d.%d",
139 &major, &minor, &driverMajor, &driverMinor);
140 }
cdalton1acea862015-06-02 13:05:52 -0700141 if (4 == n) {
142 *outDriver = kMesa_GrGLDriver;
Brian Salomon9a544bc2018-04-04 16:12:31 -0400143 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, 0);
cdalton1acea862015-06-02 13:05:52 -0700144 return;
145 }
derekfa6ca5a02014-11-03 13:36:40 -0800146 }
147 else {
cdalton1acea862015-06-02 13:05:52 -0700148 if (kNVIDIA_GrGLVendor == vendor) {
149 *outDriver = kNVIDIA_GrGLDriver;
150 int n = sscanf(versionString, "OpenGL ES %d.%d NVIDIA %d.%d",
151 &major, &minor, &driverMajor, &driverMinor);
152 // Some older NVIDIA drivers don't report the driver version.
153 if (4 == n) {
Brian Salomon9a544bc2018-04-04 16:12:31 -0400154 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, 0);
cdalton1acea862015-06-02 13:05:52 -0700155 }
156 return;
157 }
commit-bot@chromium.org459104c2013-06-14 14:42:56 +0000158
cdalton1acea862015-06-02 13:05:52 -0700159 int n = sscanf(versionString, "OpenGL ES %d.%d Mesa %d.%d",
160 &major, &minor, &driverMajor, &driverMinor);
161 if (4 == n) {
162 *outDriver = kMesa_GrGLDriver;
Brian Salomon9a544bc2018-04-04 16:12:31 -0400163 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, 0);
cdalton1acea862015-06-02 13:05:52 -0700164 return;
165 }
bsalomon88c7b982015-07-31 11:20:16 -0700166 if (0 == strncmp("ANGLE", rendererString, 5)) {
167 *outDriver = kANGLE_GrGLDriver;
168 n = sscanf(versionString, "OpenGL ES %d.%d (ANGLE %d.%d", &major, &minor, &driverMajor,
169 &driverMinor);
170 if (4 == n) {
Brian Salomon9a544bc2018-04-04 16:12:31 -0400171 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, 0);
bsalomon88c7b982015-07-31 11:20:16 -0700172 }
173 return;
174 }
cdalton1acea862015-06-02 13:05:52 -0700175 }
cdalton1dd05422015-06-12 09:01:18 -0700176
Kevin Lubickda2b9f32018-06-05 16:05:58 -0400177 if (kGoogle_GrGLVendor == vendor) {
178 // Swiftshader is the only Google vendor at the moment
179 *outDriver = kSwiftShader_GrGLDriver;
180
181 // Swiftshader has a strange version string: w.x.y.z Going to arbitrarily ignore
182 // y and assume w,x and z are major, minor, point.
183 // As of writing, version is 4.0.0.6
184 int n = sscanf(versionString, "OpenGL ES %d.%d SwiftShader %d.%d.0.%d", &major, &minor,
185 &driverMajor, &driverMinor, &driverPoint);
186 if (5 == n) {
187 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, driverPoint);
188 }
189 return;
190 }
191
cdalton1dd05422015-06-12 09:01:18 -0700192 if (kIntel_GrGLVendor == vendor) {
193 // We presume we're on the Intel driver since it hasn't identified itself as Mesa.
194 *outDriver = kIntel_GrGLDriver;
Brian Salomon9a544bc2018-04-04 16:12:31 -0400195
196 //This is how the macOS version strings are structured. This might be different on different
197 // OSes.
198 int n = sscanf(versionString, "%d.%d INTEL-%d.%d.%d", &major, &minor, &driverMajor,
199 &driverMinor, &driverPoint);
200 if (5 == n) {
201 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, driverPoint);
202 }
cdalton1dd05422015-06-12 09:01:18 -0700203 }
Brian Salomonb52fa022017-06-07 09:42:52 -0400204
205 if (kQualcomm_GrGLVendor == vendor) {
206 *outDriver = kQualcomm_GrGLDriver;
207 int n = sscanf(versionString, "OpenGL ES %d.%d V@%d.%d", &major, &minor, &driverMajor,
208 &driverMinor);
209 if (4 == n) {
Brian Salomon9a544bc2018-04-04 16:12:31 -0400210 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, 0);
Brian Salomonb52fa022017-06-07 09:42:52 -0400211 }
212 return;
213 }
commit-bot@chromium.orgc9424b82013-10-30 20:03:16 +0000214}
215
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000216GrGLVersion GrGLGetVersionFromString(const char* versionString) {
halcanary96fcdcc2015-08-27 07:41:13 -0700217 if (nullptr == versionString) {
218 SkDebugf("nullptr GL version string.");
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000219 return GR_GL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000220 }
221
222 int major, minor;
223
bsalomon@google.com960d1142013-05-29 13:11:54 +0000224 // check for mesa
225 int mesaMajor, mesaMinor;
226 int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
227 if (4 == n) {
joshualitt46821702014-07-30 11:49:12 -0700228 return GR_GL_VER(major, minor);
bsalomon@google.com960d1142013-05-29 13:11:54 +0000229 }
230
231 n = sscanf(versionString, "%d.%d", &major, &minor);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000232 if (2 == n) {
233 return GR_GL_VER(major, minor);
234 }
235
236 char profile[2];
237 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
238 &major, &minor);
239 if (4 == n) {
240 return GR_GL_VER(major, minor);
241 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000242
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000243 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
244 if (2 == n) {
245 return GR_GL_VER(major, minor);
246 }
247
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000248 return GR_GL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000249}
250
251GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString) {
halcanary96fcdcc2015-08-27 07:41:13 -0700252 if (nullptr == versionString) {
253 SkDebugf("nullptr GLSL version string.");
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000254 return GR_GLSL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000255 }
256
257 int major, minor;
258
259 int n = sscanf(versionString, "%d.%d", &major, &minor);
260 if (2 == n) {
261 return GR_GLSL_VER(major, minor);
262 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000263
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000264 n = sscanf(versionString, "OpenGL ES GLSL ES %d.%d", &major, &minor);
265 if (2 == n) {
266 return GR_GLSL_VER(major, minor);
267 }
268
269#ifdef SK_BUILD_FOR_ANDROID
270 // android hack until the gpu vender updates their drivers
271 n = sscanf(versionString, "OpenGL ES GLSL %d.%d", &major, &minor);
272 if (2 == n) {
273 return GR_GLSL_VER(major, minor);
274 }
275#endif
276
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000277 return GR_GLSL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000278}
279
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000280GrGLVendor GrGLGetVendorFromString(const char* vendorString) {
bsalomon49f085d2014-09-05 13:34:00 -0700281 if (vendorString) {
bsalomon@google.com96966a52013-02-21 16:34:21 +0000282 if (0 == strcmp(vendorString, "ARM")) {
283 return kARM_GrGLVendor;
284 }
Kevin Lubickda2b9f32018-06-05 16:05:58 -0400285 if (0 == strcmp(vendorString, "Google Inc.")) {
286 return kGoogle_GrGLVendor;
287 }
bsalomon@google.com3012ded2013-02-22 16:44:04 +0000288 if (0 == strcmp(vendorString, "Imagination Technologies")) {
289 return kImagination_GrGLVendor;
290 }
commit-bot@chromium.org54318d32014-02-14 17:27:04 +0000291 if (0 == strncmp(vendorString, "Intel ", 6) || 0 == strcmp(vendorString, "Intel")) {
bsalomon@google.com3012ded2013-02-22 16:44:04 +0000292 return kIntel_GrGLVendor;
293 }
commit-bot@chromium.org7a434a22013-08-21 14:01:56 +0000294 if (0 == strcmp(vendorString, "Qualcomm")) {
295 return kQualcomm_GrGLVendor;
296 }
bsalomone904c092014-07-17 10:50:59 -0700297 if (0 == strcmp(vendorString, "NVIDIA Corporation")) {
bsalomon63b21962014-11-05 07:05:34 -0800298 return kNVIDIA_GrGLVendor;
bsalomone904c092014-07-17 10:50:59 -0700299 }
brianosman131ff132016-06-07 14:22:44 -0700300 if (0 == strcmp(vendorString, "ATI Technologies Inc.")) {
301 return kATI_GrGLVendor;
302 }
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000303 }
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000304 return kOther_GrGLVendor;
305}
306
Brian Salomon266ef6d2017-09-22 11:27:42 -0400307static bool is_renderer_angle(const char* rendererString) {
308 static constexpr char kHeader[] = "ANGLE ";
309 static constexpr size_t kHeaderLength = SK_ARRAY_COUNT(kHeader) - 1;
310 return 0 == strncmp(rendererString, kHeader, kHeaderLength);
311}
312
Brian Salomon4470e342018-04-04 14:27:48 -0400313GrGLRenderer GrGLGetRendererFromStrings(const char* rendererString,
314 const GrGLExtensions& extensions) {
bsalomon49f085d2014-09-05 13:34:00 -0700315 if (rendererString) {
Chris Dalton0090ef62018-03-28 17:35:00 -0600316 static const char kTegraStr[] = "NVIDIA Tegra";
317 if (0 == strncmp(rendererString, kTegraStr, SK_ARRAY_COUNT(kTegraStr) - 1)) {
318 // Tegra strings are not very descriptive. We distinguish between the modern and legacy
319 // architectures by the presence of NV_path_rendering.
Brian Salomon4470e342018-04-04 14:27:48 -0400320 return extensions.has("GL_NV_path_rendering") ? kTegra_GrGLRenderer
321 : kTegra_PreK1_GrGLRenderer;
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000322 }
bsalomon63b21962014-11-05 07:05:34 -0800323 int lastDigit;
324 int n = sscanf(rendererString, "PowerVR SGX 54%d", &lastDigit);
325 if (1 == n && lastDigit >= 0 && lastDigit <= 9) {
326 return kPowerVR54x_GrGLRenderer;
327 }
jvanverthf10ecb72015-12-10 09:06:24 -0800328 // certain iOS devices also use PowerVR54x GPUs
329 static const char kAppleA4Str[] = "Apple A4";
330 static const char kAppleA5Str[] = "Apple A5";
331 static const char kAppleA6Str[] = "Apple A6";
332 if (0 == strncmp(rendererString, kAppleA4Str,
333 SK_ARRAY_COUNT(kAppleA4Str)-1) ||
334 0 == strncmp(rendererString, kAppleA5Str,
335 SK_ARRAY_COUNT(kAppleA5Str)-1) ||
336 0 == strncmp(rendererString, kAppleA6Str,
337 SK_ARRAY_COUNT(kAppleA6Str)-1)) {
338 return kPowerVR54x_GrGLRenderer;
339 }
bsalomon63b21962014-11-05 07:05:34 -0800340 static const char kPowerVRRogueStr[] = "PowerVR Rogue";
jvanverthf10ecb72015-12-10 09:06:24 -0800341 static const char kAppleA7Str[] = "Apple A7";
342 static const char kAppleA8Str[] = "Apple A8";
bsalomon63b21962014-11-05 07:05:34 -0800343 if (0 == strncmp(rendererString, kPowerVRRogueStr,
jvanverthf10ecb72015-12-10 09:06:24 -0800344 SK_ARRAY_COUNT(kPowerVRRogueStr)-1) ||
345 0 == strncmp(rendererString, kAppleA7Str,
346 SK_ARRAY_COUNT(kAppleA7Str)-1) ||
347 0 == strncmp(rendererString, kAppleA8Str,
348 SK_ARRAY_COUNT(kAppleA8Str)-1)) {
bsalomon63b21962014-11-05 07:05:34 -0800349 return kPowerVRRogue_GrGLRenderer;
350 }
bsalomona8fcea02015-02-13 09:00:39 -0800351 int adrenoNumber;
352 n = sscanf(rendererString, "Adreno (TM) %d", &adrenoNumber);
353 if (1 == n) {
354 if (adrenoNumber >= 300) {
355 if (adrenoNumber < 400) {
356 return kAdreno3xx_GrGLRenderer;
357 }
358 if (adrenoNumber < 500) {
Chris Dalton1214be92018-06-28 19:06:27 -0600359 return adrenoNumber >= 430
360 ? kAdreno430_GrGLRenderer : kAdreno4xx_other_GrGLRenderer;
bsalomona8fcea02015-02-13 09:00:39 -0800361 }
egdaniel7517e452016-09-20 13:00:26 -0700362 if (adrenoNumber < 600) {
363 return kAdreno5xx_GrGLRenderer;
364 }
bsalomona8fcea02015-02-13 09:00:39 -0800365 }
366 }
Kevin Lubickda2b9f32018-06-05 16:05:58 -0400367 if (0 == strcmp("Google SwiftShader", rendererString)) {
368 return kGoogleSwiftShader_GrGLRenderer;
369 }
Robert Phillipsa2fd62a2017-10-05 12:46:21 -0400370 if (0 == strcmp("Intel Iris Pro OpenGL Engine", rendererString)) {
371 return kIntelIrisPro_GrGLRenderer;
372 }
373
Brian Salomon028a9a52017-05-11 11:39:08 -0400374 int intelNumber;
Chris Daltonda40cd22018-04-16 13:19:58 -0600375 if (sscanf(rendererString, "Intel(R) Iris(TM) Graphics %d", &intelNumber) ||
376 sscanf(rendererString, "Intel(R) Iris(TM) Pro Graphics %d", &intelNumber) ||
377 sscanf(rendererString, "Intel(R) Iris(TM) Pro Graphics P%d", &intelNumber) ||
378 sscanf(rendererString, "Intel(R) Iris(R) Graphics %d", &intelNumber) ||
379 sscanf(rendererString, "Intel(R) Iris(R) Pro Graphics %d", &intelNumber) ||
380 sscanf(rendererString, "Intel(R) Iris(R) Pro Graphics P%d", &intelNumber) ||
381 sscanf(rendererString, "Intel(R) HD Graphics %d", &intelNumber) ||
382 sscanf(rendererString, "Intel(R) HD Graphics P%d", &intelNumber)) {
383
Chris Dalton4a6a7322017-10-06 14:28:11 -0600384 if (intelNumber >= 4000 && intelNumber < 5000) {
385 return kIntel4xxx_GrGLRenderer;
386 }
Brian Salomon028a9a52017-05-11 11:39:08 -0400387 if (intelNumber >= 6000 && intelNumber < 7000) {
388 return kIntel6xxx_GrGLRenderer;
389 }
Chris Daltonda40cd22018-04-16 13:19:58 -0600390 if (intelNumber >= 500 && intelNumber < 600) {
391 return kIntelSkylake_GrGLRenderer;
392 }
Brian Salomon028a9a52017-05-11 11:39:08 -0400393 }
Robert Phillipsdbfecd02017-10-18 15:44:08 -0400394
395 // The AMD string can have a somewhat arbitrary preamble (see skbug.com/7195)
396 if (const char* amdString = strstr(rendererString, "Radeon")) {
397 char amdGeneration, amdTier, amdRevision;
398 n = sscanf(amdString, "Radeon (TM) R9 M%c%c%c",
399 &amdGeneration, &amdTier, &amdRevision);
400 if (3 == n) {
401 if ('4' == amdGeneration) {
402 return kAMDRadeonR9M4xx_GrGLRenderer;
403 }
404 }
405
406 char amd0, amd1, amd2;
407 n = sscanf(amdString, "Radeon HD 7%c%c%c Series", &amd0, &amd1, &amd2);
408 if (3 == n) {
409 return kAMDRadeonHD7xxx_GrGLRenderer;
410 }
411 }
412
Brian Salomon0ee6f952017-01-19 15:52:24 -0500413 if (0 == strcmp("Mesa Offscreen", rendererString)) {
bsalomon40170072016-05-05 14:40:03 -0700414 return kOSMesa_GrGLRenderer;
415 }
Greg Daniel25019172017-10-26 13:32:33 -0400416 if (strstr(rendererString, "llvmpipe")) {
417 return kGalliumLLVM_GrGLRenderer;
418 }
Brian Osmanac1e4962017-05-25 11:34:38 -0400419 static const char kMaliTStr[] = "Mali-T";
420 if (0 == strncmp(rendererString, kMaliTStr, SK_ARRAY_COUNT(kMaliTStr) - 1)) {
421 return kMaliT_GrGLRenderer;
422 }
Brian Salomon5fba7ad2018-03-22 10:01:16 -0400423 int mali400Num;
424 if (1 == sscanf(rendererString, "Mali-%d", &mali400Num) && mali400Num >= 400 &&
425 mali400Num < 500) {
426 return kMali4xx_GrGLRenderer;
427 }
Brian Salomon266ef6d2017-09-22 11:27:42 -0400428 if (is_renderer_angle(rendererString)) {
Robert Phillipsbc712742017-06-02 11:20:37 -0400429 return kANGLE_GrGLRenderer;
430 }
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000431 }
432 return kOther_GrGLRenderer;
433}
434
Brian Salomon266ef6d2017-09-22 11:27:42 -0400435void GrGLGetANGLEInfoFromString(const char* rendererString, GrGLANGLEBackend* backend,
436 GrGLANGLEVendor* vendor, GrGLANGLERenderer* renderer) {
437 *backend = GrGLANGLEBackend::kUnknown;
438 *vendor = GrGLANGLEVendor::kUnknown;
439 *renderer = GrGLANGLERenderer::kUnknown;
440 if (!is_renderer_angle(rendererString)) {
441 return;
442 }
443 if (strstr(rendererString, "Intel")) {
444 *vendor = GrGLANGLEVendor::kIntel;
Chris Dalton0a94e4c2018-01-18 15:06:50 -0700445
446 const char* modelStr;
447 int modelNumber;
448 if ((modelStr = strstr(rendererString, "HD Graphics")) &&
449 (1 == sscanf(modelStr, "HD Graphics %i", &modelNumber) ||
450 1 == sscanf(modelStr, "HD Graphics P%i", &modelNumber))) {
451 switch (modelNumber) {
452 case 4000:
453 case 2500:
454 *renderer = GrGLANGLERenderer::kIvyBridge;
455 break;
456 case 510:
457 case 515:
458 case 520:
459 case 530:
460 *renderer = GrGLANGLERenderer::kSkylake;
461 break;
462 }
463 } else if ((modelStr = strstr(rendererString, "Iris")) &&
464 (1 == sscanf(modelStr, "Iris(TM) Graphics %i", &modelNumber) ||
465 1 == sscanf(modelStr, "Iris(TM) Pro Graphics %i", &modelNumber) ||
466 1 == sscanf(modelStr, "Iris(TM) Pro Graphics P%i", &modelNumber))) {
467 switch (modelNumber) {
468 case 540:
469 case 550:
470 case 555:
471 case 580:
472 *renderer = GrGLANGLERenderer::kSkylake;
473 break;
474 }
475 }
Brian Salomon266ef6d2017-09-22 11:27:42 -0400476 }
477 if (strstr(rendererString, "Direct3D11")) {
478 *backend = GrGLANGLEBackend::kD3D11;
479 } else if (strstr(rendererString, "Direct3D9")) {
480 *backend = GrGLANGLEBackend::kD3D9;
481 } else if (strstr(rendererString, "OpenGL")) {
482 *backend = GrGLANGLEBackend::kOpenGL;
483 }
484}
485
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000486GrGLVersion GrGLGetVersion(const GrGLInterface* gl) {
487 const GrGLubyte* v;
488 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
489 return GrGLGetVersionFromString((const char*) v);
490}
491
492GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) {
493 const GrGLubyte* v;
494 GR_GL_CALL_RET(gl, v, GetString(GR_GL_SHADING_LANGUAGE_VERSION));
495 return GrGLGetGLSLVersionFromString((const char*) v);
496}
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000497
498GrGLVendor GrGLGetVendor(const GrGLInterface* gl) {
499 const GrGLubyte* v;
500 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VENDOR));
501 return GrGLGetVendorFromString((const char*) v);
502}
commit-bot@chromium.org215a6822013-09-05 18:28:42 +0000503
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000504GrGLRenderer GrGLGetRenderer(const GrGLInterface* gl) {
Chris Dalton0090ef62018-03-28 17:35:00 -0600505 const GrGLubyte* rendererString;
506 GR_GL_CALL_RET(gl, rendererString, GetString(GR_GL_RENDERER));
507
Brian Salomon4470e342018-04-04 14:27:48 -0400508 return GrGLGetRendererFromStrings((const char*)rendererString, gl->fExtensions);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000509}
510
cdalton93a379b2016-05-11 13:58:08 -0700511GrGLenum GrToGLStencilFunc(GrStencilTest test) {
512 static const GrGLenum gTable[kGrStencilTestCount] = {
513 GR_GL_ALWAYS, // kAlways
514 GR_GL_NEVER, // kNever
515 GR_GL_GREATER, // kGreater
516 GR_GL_GEQUAL, // kGEqual
517 GR_GL_LESS, // kLess
518 GR_GL_LEQUAL, // kLEqual
519 GR_GL_EQUAL, // kEqual
520 GR_GL_NOTEQUAL, // kNotEqual
kkinnunenccdaa042014-08-20 01:36:23 -0700521 };
cdalton93a379b2016-05-11 13:58:08 -0700522 GR_STATIC_ASSERT(0 == (int)GrStencilTest::kAlways);
523 GR_STATIC_ASSERT(1 == (int)GrStencilTest::kNever);
524 GR_STATIC_ASSERT(2 == (int)GrStencilTest::kGreater);
525 GR_STATIC_ASSERT(3 == (int)GrStencilTest::kGEqual);
526 GR_STATIC_ASSERT(4 == (int)GrStencilTest::kLess);
527 GR_STATIC_ASSERT(5 == (int)GrStencilTest::kLEqual);
528 GR_STATIC_ASSERT(6 == (int)GrStencilTest::kEqual);
529 GR_STATIC_ASSERT(7 == (int)GrStencilTest::kNotEqual);
530 SkASSERT(test < (GrStencilTest)kGrStencilTestCount);
kkinnunenccdaa042014-08-20 01:36:23 -0700531
cdalton93a379b2016-05-11 13:58:08 -0700532 return gTable[(int)test];
kkinnunenccdaa042014-08-20 01:36:23 -0700533}
Greg Daniele7d8da42017-12-04 11:23:19 -0500534