blob: 54bf0d3700ead2a9ffb1d6de0a6774cfe0b93f8a [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
177 if (kIntel_GrGLVendor == vendor) {
178 // We presume we're on the Intel driver since it hasn't identified itself as Mesa.
179 *outDriver = kIntel_GrGLDriver;
Brian Salomon9a544bc2018-04-04 16:12:31 -0400180
181 //This is how the macOS version strings are structured. This might be different on different
182 // OSes.
183 int n = sscanf(versionString, "%d.%d INTEL-%d.%d.%d", &major, &minor, &driverMajor,
184 &driverMinor, &driverPoint);
185 if (5 == n) {
186 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, driverPoint);
187 }
cdalton1dd05422015-06-12 09:01:18 -0700188 }
Brian Salomonb52fa022017-06-07 09:42:52 -0400189
190 if (kQualcomm_GrGLVendor == vendor) {
191 *outDriver = kQualcomm_GrGLDriver;
192 int n = sscanf(versionString, "OpenGL ES %d.%d V@%d.%d", &major, &minor, &driverMajor,
193 &driverMinor);
194 if (4 == n) {
Brian Salomon9a544bc2018-04-04 16:12:31 -0400195 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor, 0);
Brian Salomonb52fa022017-06-07 09:42:52 -0400196 }
197 return;
198 }
commit-bot@chromium.orgc9424b82013-10-30 20:03:16 +0000199}
200
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000201GrGLVersion GrGLGetVersionFromString(const char* versionString) {
halcanary96fcdcc2015-08-27 07:41:13 -0700202 if (nullptr == versionString) {
203 SkDebugf("nullptr GL version string.");
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000204 return GR_GL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000205 }
206
207 int major, minor;
208
bsalomon@google.com960d1142013-05-29 13:11:54 +0000209 // check for mesa
210 int mesaMajor, mesaMinor;
211 int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
212 if (4 == n) {
joshualitt46821702014-07-30 11:49:12 -0700213 return GR_GL_VER(major, minor);
bsalomon@google.com960d1142013-05-29 13:11:54 +0000214 }
215
216 n = sscanf(versionString, "%d.%d", &major, &minor);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000217 if (2 == n) {
218 return GR_GL_VER(major, minor);
219 }
220
221 char profile[2];
222 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
223 &major, &minor);
224 if (4 == n) {
225 return GR_GL_VER(major, minor);
226 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000227
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000228 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
229 if (2 == n) {
230 return GR_GL_VER(major, minor);
231 }
232
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000233 return GR_GL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000234}
235
236GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString) {
halcanary96fcdcc2015-08-27 07:41:13 -0700237 if (nullptr == versionString) {
238 SkDebugf("nullptr GLSL version string.");
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000239 return GR_GLSL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000240 }
241
242 int major, minor;
243
244 int n = sscanf(versionString, "%d.%d", &major, &minor);
245 if (2 == n) {
246 return GR_GLSL_VER(major, minor);
247 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000248
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000249 n = sscanf(versionString, "OpenGL ES GLSL ES %d.%d", &major, &minor);
250 if (2 == n) {
251 return GR_GLSL_VER(major, minor);
252 }
253
254#ifdef SK_BUILD_FOR_ANDROID
255 // android hack until the gpu vender updates their drivers
256 n = sscanf(versionString, "OpenGL ES GLSL %d.%d", &major, &minor);
257 if (2 == n) {
258 return GR_GLSL_VER(major, minor);
259 }
260#endif
261
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000262 return GR_GLSL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000263}
264
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000265GrGLVendor GrGLGetVendorFromString(const char* vendorString) {
bsalomon49f085d2014-09-05 13:34:00 -0700266 if (vendorString) {
bsalomon@google.com96966a52013-02-21 16:34:21 +0000267 if (0 == strcmp(vendorString, "ARM")) {
268 return kARM_GrGLVendor;
269 }
bsalomon@google.com3012ded2013-02-22 16:44:04 +0000270 if (0 == strcmp(vendorString, "Imagination Technologies")) {
271 return kImagination_GrGLVendor;
272 }
commit-bot@chromium.org54318d32014-02-14 17:27:04 +0000273 if (0 == strncmp(vendorString, "Intel ", 6) || 0 == strcmp(vendorString, "Intel")) {
bsalomon@google.com3012ded2013-02-22 16:44:04 +0000274 return kIntel_GrGLVendor;
275 }
commit-bot@chromium.org7a434a22013-08-21 14:01:56 +0000276 if (0 == strcmp(vendorString, "Qualcomm")) {
277 return kQualcomm_GrGLVendor;
278 }
bsalomone904c092014-07-17 10:50:59 -0700279 if (0 == strcmp(vendorString, "NVIDIA Corporation")) {
bsalomon63b21962014-11-05 07:05:34 -0800280 return kNVIDIA_GrGLVendor;
bsalomone904c092014-07-17 10:50:59 -0700281 }
brianosman131ff132016-06-07 14:22:44 -0700282 if (0 == strcmp(vendorString, "ATI Technologies Inc.")) {
283 return kATI_GrGLVendor;
284 }
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000285 }
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000286 return kOther_GrGLVendor;
287}
288
Brian Salomon266ef6d2017-09-22 11:27:42 -0400289static bool is_renderer_angle(const char* rendererString) {
290 static constexpr char kHeader[] = "ANGLE ";
291 static constexpr size_t kHeaderLength = SK_ARRAY_COUNT(kHeader) - 1;
292 return 0 == strncmp(rendererString, kHeader, kHeaderLength);
293}
294
Brian Salomon4470e342018-04-04 14:27:48 -0400295GrGLRenderer GrGLGetRendererFromStrings(const char* rendererString,
296 const GrGLExtensions& extensions) {
bsalomon49f085d2014-09-05 13:34:00 -0700297 if (rendererString) {
Chris Dalton0090ef62018-03-28 17:35:00 -0600298 static const char kTegraStr[] = "NVIDIA Tegra";
299 if (0 == strncmp(rendererString, kTegraStr, SK_ARRAY_COUNT(kTegraStr) - 1)) {
300 // Tegra strings are not very descriptive. We distinguish between the modern and legacy
301 // architectures by the presence of NV_path_rendering.
Brian Salomon4470e342018-04-04 14:27:48 -0400302 return extensions.has("GL_NV_path_rendering") ? kTegra_GrGLRenderer
303 : kTegra_PreK1_GrGLRenderer;
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000304 }
bsalomon63b21962014-11-05 07:05:34 -0800305 int lastDigit;
306 int n = sscanf(rendererString, "PowerVR SGX 54%d", &lastDigit);
307 if (1 == n && lastDigit >= 0 && lastDigit <= 9) {
308 return kPowerVR54x_GrGLRenderer;
309 }
jvanverthf10ecb72015-12-10 09:06:24 -0800310 // certain iOS devices also use PowerVR54x GPUs
311 static const char kAppleA4Str[] = "Apple A4";
312 static const char kAppleA5Str[] = "Apple A5";
313 static const char kAppleA6Str[] = "Apple A6";
314 if (0 == strncmp(rendererString, kAppleA4Str,
315 SK_ARRAY_COUNT(kAppleA4Str)-1) ||
316 0 == strncmp(rendererString, kAppleA5Str,
317 SK_ARRAY_COUNT(kAppleA5Str)-1) ||
318 0 == strncmp(rendererString, kAppleA6Str,
319 SK_ARRAY_COUNT(kAppleA6Str)-1)) {
320 return kPowerVR54x_GrGLRenderer;
321 }
bsalomon63b21962014-11-05 07:05:34 -0800322 static const char kPowerVRRogueStr[] = "PowerVR Rogue";
jvanverthf10ecb72015-12-10 09:06:24 -0800323 static const char kAppleA7Str[] = "Apple A7";
324 static const char kAppleA8Str[] = "Apple A8";
bsalomon63b21962014-11-05 07:05:34 -0800325 if (0 == strncmp(rendererString, kPowerVRRogueStr,
jvanverthf10ecb72015-12-10 09:06:24 -0800326 SK_ARRAY_COUNT(kPowerVRRogueStr)-1) ||
327 0 == strncmp(rendererString, kAppleA7Str,
328 SK_ARRAY_COUNT(kAppleA7Str)-1) ||
329 0 == strncmp(rendererString, kAppleA8Str,
330 SK_ARRAY_COUNT(kAppleA8Str)-1)) {
bsalomon63b21962014-11-05 07:05:34 -0800331 return kPowerVRRogue_GrGLRenderer;
332 }
bsalomona8fcea02015-02-13 09:00:39 -0800333 int adrenoNumber;
334 n = sscanf(rendererString, "Adreno (TM) %d", &adrenoNumber);
335 if (1 == n) {
336 if (adrenoNumber >= 300) {
337 if (adrenoNumber < 400) {
338 return kAdreno3xx_GrGLRenderer;
339 }
340 if (adrenoNumber < 500) {
341 return kAdreno4xx_GrGLRenderer;
342 }
egdaniel7517e452016-09-20 13:00:26 -0700343 if (adrenoNumber < 600) {
344 return kAdreno5xx_GrGLRenderer;
345 }
bsalomona8fcea02015-02-13 09:00:39 -0800346 }
347 }
Robert Phillipsa2fd62a2017-10-05 12:46:21 -0400348 if (0 == strcmp("Intel Iris Pro OpenGL Engine", rendererString)) {
349 return kIntelIrisPro_GrGLRenderer;
350 }
351
Brian Salomon028a9a52017-05-11 11:39:08 -0400352 int intelNumber;
353 n = sscanf(rendererString, "Intel(R) Iris(TM) Graphics %d", &intelNumber);
354 if (1 != n) {
355 n = sscanf(rendererString, "Intel(R) HD Graphics %d", &intelNumber);
356 }
357 if (1 == n) {
Chris Dalton4a6a7322017-10-06 14:28:11 -0600358 if (intelNumber >= 4000 && intelNumber < 5000) {
359 return kIntel4xxx_GrGLRenderer;
360 }
Brian Salomon028a9a52017-05-11 11:39:08 -0400361 if (intelNumber >= 6000 && intelNumber < 7000) {
362 return kIntel6xxx_GrGLRenderer;
363 }
364 }
Robert Phillipsdbfecd02017-10-18 15:44:08 -0400365
366 // The AMD string can have a somewhat arbitrary preamble (see skbug.com/7195)
367 if (const char* amdString = strstr(rendererString, "Radeon")) {
368 char amdGeneration, amdTier, amdRevision;
369 n = sscanf(amdString, "Radeon (TM) R9 M%c%c%c",
370 &amdGeneration, &amdTier, &amdRevision);
371 if (3 == n) {
372 if ('4' == amdGeneration) {
373 return kAMDRadeonR9M4xx_GrGLRenderer;
374 }
375 }
376
377 char amd0, amd1, amd2;
378 n = sscanf(amdString, "Radeon HD 7%c%c%c Series", &amd0, &amd1, &amd2);
379 if (3 == n) {
380 return kAMDRadeonHD7xxx_GrGLRenderer;
381 }
382 }
383
Brian Salomon0ee6f952017-01-19 15:52:24 -0500384 if (0 == strcmp("Mesa Offscreen", rendererString)) {
bsalomon40170072016-05-05 14:40:03 -0700385 return kOSMesa_GrGLRenderer;
386 }
Greg Daniel25019172017-10-26 13:32:33 -0400387 if (strstr(rendererString, "llvmpipe")) {
388 return kGalliumLLVM_GrGLRenderer;
389 }
Brian Osmanac1e4962017-05-25 11:34:38 -0400390 static const char kMaliTStr[] = "Mali-T";
391 if (0 == strncmp(rendererString, kMaliTStr, SK_ARRAY_COUNT(kMaliTStr) - 1)) {
392 return kMaliT_GrGLRenderer;
393 }
Brian Salomon5fba7ad2018-03-22 10:01:16 -0400394 int mali400Num;
395 if (1 == sscanf(rendererString, "Mali-%d", &mali400Num) && mali400Num >= 400 &&
396 mali400Num < 500) {
397 return kMali4xx_GrGLRenderer;
398 }
Brian Salomon266ef6d2017-09-22 11:27:42 -0400399 if (is_renderer_angle(rendererString)) {
Robert Phillipsbc712742017-06-02 11:20:37 -0400400 return kANGLE_GrGLRenderer;
401 }
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000402 }
403 return kOther_GrGLRenderer;
404}
405
Brian Salomon266ef6d2017-09-22 11:27:42 -0400406void GrGLGetANGLEInfoFromString(const char* rendererString, GrGLANGLEBackend* backend,
407 GrGLANGLEVendor* vendor, GrGLANGLERenderer* renderer) {
408 *backend = GrGLANGLEBackend::kUnknown;
409 *vendor = GrGLANGLEVendor::kUnknown;
410 *renderer = GrGLANGLERenderer::kUnknown;
411 if (!is_renderer_angle(rendererString)) {
412 return;
413 }
414 if (strstr(rendererString, "Intel")) {
415 *vendor = GrGLANGLEVendor::kIntel;
Chris Dalton0a94e4c2018-01-18 15:06:50 -0700416
417 const char* modelStr;
418 int modelNumber;
419 if ((modelStr = strstr(rendererString, "HD Graphics")) &&
420 (1 == sscanf(modelStr, "HD Graphics %i", &modelNumber) ||
421 1 == sscanf(modelStr, "HD Graphics P%i", &modelNumber))) {
422 switch (modelNumber) {
423 case 4000:
424 case 2500:
425 *renderer = GrGLANGLERenderer::kIvyBridge;
426 break;
427 case 510:
428 case 515:
429 case 520:
430 case 530:
431 *renderer = GrGLANGLERenderer::kSkylake;
432 break;
433 }
434 } else if ((modelStr = strstr(rendererString, "Iris")) &&
435 (1 == sscanf(modelStr, "Iris(TM) Graphics %i", &modelNumber) ||
436 1 == sscanf(modelStr, "Iris(TM) Pro Graphics %i", &modelNumber) ||
437 1 == sscanf(modelStr, "Iris(TM) Pro Graphics P%i", &modelNumber))) {
438 switch (modelNumber) {
439 case 540:
440 case 550:
441 case 555:
442 case 580:
443 *renderer = GrGLANGLERenderer::kSkylake;
444 break;
445 }
446 }
Brian Salomon266ef6d2017-09-22 11:27:42 -0400447 }
448 if (strstr(rendererString, "Direct3D11")) {
449 *backend = GrGLANGLEBackend::kD3D11;
450 } else if (strstr(rendererString, "Direct3D9")) {
451 *backend = GrGLANGLEBackend::kD3D9;
452 } else if (strstr(rendererString, "OpenGL")) {
453 *backend = GrGLANGLEBackend::kOpenGL;
454 }
455}
456
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000457GrGLVersion GrGLGetVersion(const GrGLInterface* gl) {
458 const GrGLubyte* v;
459 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
460 return GrGLGetVersionFromString((const char*) v);
461}
462
463GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) {
464 const GrGLubyte* v;
465 GR_GL_CALL_RET(gl, v, GetString(GR_GL_SHADING_LANGUAGE_VERSION));
466 return GrGLGetGLSLVersionFromString((const char*) v);
467}
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000468
469GrGLVendor GrGLGetVendor(const GrGLInterface* gl) {
470 const GrGLubyte* v;
471 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VENDOR));
472 return GrGLGetVendorFromString((const char*) v);
473}
commit-bot@chromium.org215a6822013-09-05 18:28:42 +0000474
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000475GrGLRenderer GrGLGetRenderer(const GrGLInterface* gl) {
Chris Dalton0090ef62018-03-28 17:35:00 -0600476 const GrGLubyte* rendererString;
477 GR_GL_CALL_RET(gl, rendererString, GetString(GR_GL_RENDERER));
478
Brian Salomon4470e342018-04-04 14:27:48 -0400479 return GrGLGetRendererFromStrings((const char*)rendererString, gl->fExtensions);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000480}
481
cdalton93a379b2016-05-11 13:58:08 -0700482GrGLenum GrToGLStencilFunc(GrStencilTest test) {
483 static const GrGLenum gTable[kGrStencilTestCount] = {
484 GR_GL_ALWAYS, // kAlways
485 GR_GL_NEVER, // kNever
486 GR_GL_GREATER, // kGreater
487 GR_GL_GEQUAL, // kGEqual
488 GR_GL_LESS, // kLess
489 GR_GL_LEQUAL, // kLEqual
490 GR_GL_EQUAL, // kEqual
491 GR_GL_NOTEQUAL, // kNotEqual
kkinnunenccdaa042014-08-20 01:36:23 -0700492 };
cdalton93a379b2016-05-11 13:58:08 -0700493 GR_STATIC_ASSERT(0 == (int)GrStencilTest::kAlways);
494 GR_STATIC_ASSERT(1 == (int)GrStencilTest::kNever);
495 GR_STATIC_ASSERT(2 == (int)GrStencilTest::kGreater);
496 GR_STATIC_ASSERT(3 == (int)GrStencilTest::kGEqual);
497 GR_STATIC_ASSERT(4 == (int)GrStencilTest::kLess);
498 GR_STATIC_ASSERT(5 == (int)GrStencilTest::kLEqual);
499 GR_STATIC_ASSERT(6 == (int)GrStencilTest::kEqual);
500 GR_STATIC_ASSERT(7 == (int)GrStencilTest::kNotEqual);
501 SkASSERT(test < (GrStencilTest)kGrStencilTestCount);
kkinnunenccdaa042014-08-20 01:36:23 -0700502
cdalton93a379b2016-05-11 13:58:08 -0700503 return gTable[(int)test];
kkinnunenccdaa042014-08-20 01:36:23 -0700504}
Greg Daniele7d8da42017-12-04 11:23:19 -0500505
Greg Daniel8a3f55c2018-03-14 17:32:12 +0000506GrPixelConfig GrGLSizedFormatToPixelConfig(GrGLenum sizedFormat) {
507 switch (sizedFormat) {
508 case GR_GL_R8:
509 return kAlpha_8_as_Red_GrPixelConfig;
510 case GR_GL_ALPHA8:
511 return kAlpha_8_as_Alpha_GrPixelConfig;
512 case GR_GL_RGBA8:
513 return kRGBA_8888_GrPixelConfig;
Brian Salomon5fba7ad2018-03-22 10:01:16 -0400514 case GR_GL_RGB8:
515 return kRGB_888_GrPixelConfig;
Greg Daniel8a3f55c2018-03-14 17:32:12 +0000516 case GR_GL_BGRA8:
517 return kBGRA_8888_GrPixelConfig;
518 case GR_GL_SRGB8_ALPHA8:
519 return kSRGBA_8888_GrPixelConfig;
520 case GR_GL_RGB565:
521 return kRGB_565_GrPixelConfig;
522 case GR_GL_RGB5:
523 return kRGB_565_GrPixelConfig;
524 case GR_GL_RGBA4:
525 return kRGBA_4444_GrPixelConfig;
526 case GR_GL_RGB10_A2:
527 return kRGBA_1010102_GrPixelConfig;
528 case GR_GL_LUMINANCE8:
529 return kGray_8_GrPixelConfig;
530 case GR_GL_RGBA32F:
531 return kRGBA_float_GrPixelConfig;
532 case GR_GL_RG32F:
533 return kRG_float_GrPixelConfig;
534 case GR_GL_R16F:
535 return kAlpha_half_as_Red_GrPixelConfig;
536 case GR_GL_RGBA16F:
537 return kRGBA_half_GrPixelConfig;
538 default:
539 return kUnknown_GrPixelConfig;
540 }
541}
542