blob: 791d9ecfcb602728c96070748c61af2b4719862c [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) {
102 int major, minor, rev, driverMajor, driverMinor;
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) {
131 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor);
132 }
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;
143 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor);
144 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) {
154 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor);
155 }
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;
163 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor);
164 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) {
171 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor);
172 }
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;
180 }
Brian Salomonb52fa022017-06-07 09:42:52 -0400181
182 if (kQualcomm_GrGLVendor == vendor) {
183 *outDriver = kQualcomm_GrGLDriver;
184 int n = sscanf(versionString, "OpenGL ES %d.%d V@%d.%d", &major, &minor, &driverMajor,
185 &driverMinor);
186 if (4 == n) {
187 *outVersion = GR_GL_DRIVER_VER(driverMajor, driverMinor);
188 }
189 return;
190 }
commit-bot@chromium.orgc9424b82013-10-30 20:03:16 +0000191}
192
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000193GrGLVersion GrGLGetVersionFromString(const char* versionString) {
halcanary96fcdcc2015-08-27 07:41:13 -0700194 if (nullptr == versionString) {
195 SkDebugf("nullptr GL version string.");
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000196 return GR_GL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000197 }
198
199 int major, minor;
200
bsalomon@google.com960d1142013-05-29 13:11:54 +0000201 // check for mesa
202 int mesaMajor, mesaMinor;
203 int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
204 if (4 == n) {
joshualitt46821702014-07-30 11:49:12 -0700205 return GR_GL_VER(major, minor);
bsalomon@google.com960d1142013-05-29 13:11:54 +0000206 }
207
208 n = sscanf(versionString, "%d.%d", &major, &minor);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000209 if (2 == n) {
210 return GR_GL_VER(major, minor);
211 }
212
213 char profile[2];
214 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
215 &major, &minor);
216 if (4 == n) {
217 return GR_GL_VER(major, minor);
218 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000219
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000220 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
221 if (2 == n) {
222 return GR_GL_VER(major, minor);
223 }
224
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000225 return GR_GL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000226}
227
228GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString) {
halcanary96fcdcc2015-08-27 07:41:13 -0700229 if (nullptr == versionString) {
230 SkDebugf("nullptr GLSL version string.");
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +0000231 return GR_GLSL_INVALID_VER;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000232 }
233
234 int major, minor;
235
236 int n = sscanf(versionString, "%d.%d", &major, &minor);
237 if (2 == n) {
238 return GR_GLSL_VER(major, minor);
239 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000240
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000241 n = sscanf(versionString, "OpenGL ES GLSL ES %d.%d", &major, &minor);
242 if (2 == n) {
243 return GR_GLSL_VER(major, minor);
244 }
245
246#ifdef SK_BUILD_FOR_ANDROID
247 // android hack until the gpu vender updates their drivers
248 n = sscanf(versionString, "OpenGL ES GLSL %d.%d", &major, &minor);
249 if (2 == n) {
250 return GR_GLSL_VER(major, minor);
251 }
252#endif
253
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
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000257GrGLVendor GrGLGetVendorFromString(const char* vendorString) {
bsalomon49f085d2014-09-05 13:34:00 -0700258 if (vendorString) {
bsalomon@google.com96966a52013-02-21 16:34:21 +0000259 if (0 == strcmp(vendorString, "ARM")) {
260 return kARM_GrGLVendor;
261 }
bsalomon@google.com3012ded2013-02-22 16:44:04 +0000262 if (0 == strcmp(vendorString, "Imagination Technologies")) {
263 return kImagination_GrGLVendor;
264 }
commit-bot@chromium.org54318d32014-02-14 17:27:04 +0000265 if (0 == strncmp(vendorString, "Intel ", 6) || 0 == strcmp(vendorString, "Intel")) {
bsalomon@google.com3012ded2013-02-22 16:44:04 +0000266 return kIntel_GrGLVendor;
267 }
commit-bot@chromium.org7a434a22013-08-21 14:01:56 +0000268 if (0 == strcmp(vendorString, "Qualcomm")) {
269 return kQualcomm_GrGLVendor;
270 }
bsalomone904c092014-07-17 10:50:59 -0700271 if (0 == strcmp(vendorString, "NVIDIA Corporation")) {
bsalomon63b21962014-11-05 07:05:34 -0800272 return kNVIDIA_GrGLVendor;
bsalomone904c092014-07-17 10:50:59 -0700273 }
brianosman131ff132016-06-07 14:22:44 -0700274 if (0 == strcmp(vendorString, "ATI Technologies Inc.")) {
275 return kATI_GrGLVendor;
276 }
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000277 }
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000278 return kOther_GrGLVendor;
279}
280
Brian Salomon266ef6d2017-09-22 11:27:42 -0400281static bool is_renderer_angle(const char* rendererString) {
282 static constexpr char kHeader[] = "ANGLE ";
283 static constexpr size_t kHeaderLength = SK_ARRAY_COUNT(kHeader) - 1;
284 return 0 == strncmp(rendererString, kHeader, kHeaderLength);
285}
286
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000287GrGLRenderer GrGLGetRendererFromString(const char* rendererString) {
bsalomon49f085d2014-09-05 13:34:00 -0700288 if (rendererString) {
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000289 if (0 == strcmp(rendererString, "NVIDIA Tegra 3")) {
290 return kTegra3_GrGLRenderer;
commit-bot@chromium.org6dee8752014-02-07 22:39:01 +0000291 } else if (0 == strcmp(rendererString, "NVIDIA Tegra")) {
292 return kTegra2_GrGLRenderer;
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000293 }
bsalomon63b21962014-11-05 07:05:34 -0800294 int lastDigit;
295 int n = sscanf(rendererString, "PowerVR SGX 54%d", &lastDigit);
296 if (1 == n && lastDigit >= 0 && lastDigit <= 9) {
297 return kPowerVR54x_GrGLRenderer;
298 }
jvanverthf10ecb72015-12-10 09:06:24 -0800299 // certain iOS devices also use PowerVR54x GPUs
300 static const char kAppleA4Str[] = "Apple A4";
301 static const char kAppleA5Str[] = "Apple A5";
302 static const char kAppleA6Str[] = "Apple A6";
303 if (0 == strncmp(rendererString, kAppleA4Str,
304 SK_ARRAY_COUNT(kAppleA4Str)-1) ||
305 0 == strncmp(rendererString, kAppleA5Str,
306 SK_ARRAY_COUNT(kAppleA5Str)-1) ||
307 0 == strncmp(rendererString, kAppleA6Str,
308 SK_ARRAY_COUNT(kAppleA6Str)-1)) {
309 return kPowerVR54x_GrGLRenderer;
310 }
bsalomon63b21962014-11-05 07:05:34 -0800311 static const char kPowerVRRogueStr[] = "PowerVR Rogue";
jvanverthf10ecb72015-12-10 09:06:24 -0800312 static const char kAppleA7Str[] = "Apple A7";
313 static const char kAppleA8Str[] = "Apple A8";
bsalomon63b21962014-11-05 07:05:34 -0800314 if (0 == strncmp(rendererString, kPowerVRRogueStr,
jvanverthf10ecb72015-12-10 09:06:24 -0800315 SK_ARRAY_COUNT(kPowerVRRogueStr)-1) ||
316 0 == strncmp(rendererString, kAppleA7Str,
317 SK_ARRAY_COUNT(kAppleA7Str)-1) ||
318 0 == strncmp(rendererString, kAppleA8Str,
319 SK_ARRAY_COUNT(kAppleA8Str)-1)) {
bsalomon63b21962014-11-05 07:05:34 -0800320 return kPowerVRRogue_GrGLRenderer;
321 }
bsalomona8fcea02015-02-13 09:00:39 -0800322 int adrenoNumber;
323 n = sscanf(rendererString, "Adreno (TM) %d", &adrenoNumber);
324 if (1 == n) {
325 if (adrenoNumber >= 300) {
326 if (adrenoNumber < 400) {
327 return kAdreno3xx_GrGLRenderer;
328 }
329 if (adrenoNumber < 500) {
330 return kAdreno4xx_GrGLRenderer;
331 }
egdaniel7517e452016-09-20 13:00:26 -0700332 if (adrenoNumber < 600) {
333 return kAdreno5xx_GrGLRenderer;
334 }
bsalomona8fcea02015-02-13 09:00:39 -0800335 }
336 }
Robert Phillipsa2fd62a2017-10-05 12:46:21 -0400337 if (0 == strcmp("Intel Iris Pro OpenGL Engine", rendererString)) {
338 return kIntelIrisPro_GrGLRenderer;
339 }
340
Brian Salomon028a9a52017-05-11 11:39:08 -0400341 int intelNumber;
342 n = sscanf(rendererString, "Intel(R) Iris(TM) Graphics %d", &intelNumber);
343 if (1 != n) {
344 n = sscanf(rendererString, "Intel(R) HD Graphics %d", &intelNumber);
345 }
346 if (1 == n) {
Chris Dalton4a6a7322017-10-06 14:28:11 -0600347 if (intelNumber >= 4000 && intelNumber < 5000) {
348 return kIntel4xxx_GrGLRenderer;
349 }
Brian Salomon028a9a52017-05-11 11:39:08 -0400350 if (intelNumber >= 6000 && intelNumber < 7000) {
351 return kIntel6xxx_GrGLRenderer;
352 }
353 }
Robert Phillipsdbfecd02017-10-18 15:44:08 -0400354
355 // The AMD string can have a somewhat arbitrary preamble (see skbug.com/7195)
356 if (const char* amdString = strstr(rendererString, "Radeon")) {
357 char amdGeneration, amdTier, amdRevision;
358 n = sscanf(amdString, "Radeon (TM) R9 M%c%c%c",
359 &amdGeneration, &amdTier, &amdRevision);
360 if (3 == n) {
361 if ('4' == amdGeneration) {
362 return kAMDRadeonR9M4xx_GrGLRenderer;
363 }
364 }
365
366 char amd0, amd1, amd2;
367 n = sscanf(amdString, "Radeon HD 7%c%c%c Series", &amd0, &amd1, &amd2);
368 if (3 == n) {
369 return kAMDRadeonHD7xxx_GrGLRenderer;
370 }
371 }
372
Brian Salomon0ee6f952017-01-19 15:52:24 -0500373 if (0 == strcmp("Mesa Offscreen", rendererString)) {
bsalomon40170072016-05-05 14:40:03 -0700374 return kOSMesa_GrGLRenderer;
375 }
Greg Daniel25019172017-10-26 13:32:33 -0400376 if (strstr(rendererString, "llvmpipe")) {
377 return kGalliumLLVM_GrGLRenderer;
378 }
Brian Osmanac1e4962017-05-25 11:34:38 -0400379 static const char kMaliTStr[] = "Mali-T";
380 if (0 == strncmp(rendererString, kMaliTStr, SK_ARRAY_COUNT(kMaliTStr) - 1)) {
381 return kMaliT_GrGLRenderer;
382 }
Brian Salomon266ef6d2017-09-22 11:27:42 -0400383 if (is_renderer_angle(rendererString)) {
Robert Phillipsbc712742017-06-02 11:20:37 -0400384 return kANGLE_GrGLRenderer;
385 }
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000386 }
387 return kOther_GrGLRenderer;
388}
389
Brian Salomon266ef6d2017-09-22 11:27:42 -0400390void GrGLGetANGLEInfoFromString(const char* rendererString, GrGLANGLEBackend* backend,
391 GrGLANGLEVendor* vendor, GrGLANGLERenderer* renderer) {
392 *backend = GrGLANGLEBackend::kUnknown;
393 *vendor = GrGLANGLEVendor::kUnknown;
394 *renderer = GrGLANGLERenderer::kUnknown;
395 if (!is_renderer_angle(rendererString)) {
396 return;
397 }
398 if (strstr(rendererString, "Intel")) {
399 *vendor = GrGLANGLEVendor::kIntel;
Chris Dalton0a94e4c2018-01-18 15:06:50 -0700400
401 const char* modelStr;
402 int modelNumber;
403 if ((modelStr = strstr(rendererString, "HD Graphics")) &&
404 (1 == sscanf(modelStr, "HD Graphics %i", &modelNumber) ||
405 1 == sscanf(modelStr, "HD Graphics P%i", &modelNumber))) {
406 switch (modelNumber) {
407 case 4000:
408 case 2500:
409 *renderer = GrGLANGLERenderer::kIvyBridge;
410 break;
411 case 510:
412 case 515:
413 case 520:
414 case 530:
415 *renderer = GrGLANGLERenderer::kSkylake;
416 break;
417 }
418 } else if ((modelStr = strstr(rendererString, "Iris")) &&
419 (1 == sscanf(modelStr, "Iris(TM) Graphics %i", &modelNumber) ||
420 1 == sscanf(modelStr, "Iris(TM) Pro Graphics %i", &modelNumber) ||
421 1 == sscanf(modelStr, "Iris(TM) Pro Graphics P%i", &modelNumber))) {
422 switch (modelNumber) {
423 case 540:
424 case 550:
425 case 555:
426 case 580:
427 *renderer = GrGLANGLERenderer::kSkylake;
428 break;
429 }
430 }
Brian Salomon266ef6d2017-09-22 11:27:42 -0400431 }
432 if (strstr(rendererString, "Direct3D11")) {
433 *backend = GrGLANGLEBackend::kD3D11;
434 } else if (strstr(rendererString, "Direct3D9")) {
435 *backend = GrGLANGLEBackend::kD3D9;
436 } else if (strstr(rendererString, "OpenGL")) {
437 *backend = GrGLANGLEBackend::kOpenGL;
438 }
439}
440
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000441GrGLVersion GrGLGetVersion(const GrGLInterface* gl) {
442 const GrGLubyte* v;
443 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
444 return GrGLGetVersionFromString((const char*) v);
445}
446
447GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) {
448 const GrGLubyte* v;
449 GR_GL_CALL_RET(gl, v, GetString(GR_GL_SHADING_LANGUAGE_VERSION));
450 return GrGLGetGLSLVersionFromString((const char*) v);
451}
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000452
453GrGLVendor GrGLGetVendor(const GrGLInterface* gl) {
454 const GrGLubyte* v;
455 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VENDOR));
456 return GrGLGetVendorFromString((const char*) v);
457}
commit-bot@chromium.org215a6822013-09-05 18:28:42 +0000458
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000459GrGLRenderer GrGLGetRenderer(const GrGLInterface* gl) {
460 const GrGLubyte* v;
461 GR_GL_CALL_RET(gl, v, GetString(GR_GL_RENDERER));
462 return GrGLGetRendererFromString((const char*) v);
463}
464
cdalton93a379b2016-05-11 13:58:08 -0700465GrGLenum GrToGLStencilFunc(GrStencilTest test) {
466 static const GrGLenum gTable[kGrStencilTestCount] = {
467 GR_GL_ALWAYS, // kAlways
468 GR_GL_NEVER, // kNever
469 GR_GL_GREATER, // kGreater
470 GR_GL_GEQUAL, // kGEqual
471 GR_GL_LESS, // kLess
472 GR_GL_LEQUAL, // kLEqual
473 GR_GL_EQUAL, // kEqual
474 GR_GL_NOTEQUAL, // kNotEqual
kkinnunenccdaa042014-08-20 01:36:23 -0700475 };
cdalton93a379b2016-05-11 13:58:08 -0700476 GR_STATIC_ASSERT(0 == (int)GrStencilTest::kAlways);
477 GR_STATIC_ASSERT(1 == (int)GrStencilTest::kNever);
478 GR_STATIC_ASSERT(2 == (int)GrStencilTest::kGreater);
479 GR_STATIC_ASSERT(3 == (int)GrStencilTest::kGEqual);
480 GR_STATIC_ASSERT(4 == (int)GrStencilTest::kLess);
481 GR_STATIC_ASSERT(5 == (int)GrStencilTest::kLEqual);
482 GR_STATIC_ASSERT(6 == (int)GrStencilTest::kEqual);
483 GR_STATIC_ASSERT(7 == (int)GrStencilTest::kNotEqual);
484 SkASSERT(test < (GrStencilTest)kGrStencilTestCount);
kkinnunenccdaa042014-08-20 01:36:23 -0700485
cdalton93a379b2016-05-11 13:58:08 -0700486 return gTable[(int)test];
kkinnunenccdaa042014-08-20 01:36:23 -0700487}
Greg Daniele7d8da42017-12-04 11:23:19 -0500488
489GrPixelConfig GrGLSizedFormatToPixelConfig(GrGLenum sizedFormat) {
490 switch (sizedFormat) {
491 case GR_GL_R8:
492 return kAlpha_8_as_Red_GrPixelConfig;
493 case GR_GL_ALPHA8:
494 return kAlpha_8_as_Alpha_GrPixelConfig;
495 case GR_GL_RGBA8:
496 return kRGBA_8888_GrPixelConfig;
497 case GR_GL_BGRA8:
498 return kBGRA_8888_GrPixelConfig;
499 case GR_GL_SRGB8_ALPHA8:
500 return kSRGBA_8888_GrPixelConfig;
Greg Daniele7d8da42017-12-04 11:23:19 -0500501 case GR_GL_RGB565:
502 return kRGB_565_GrPixelConfig;
503 case GR_GL_RGB5:
504 return kRGB_565_GrPixelConfig;
505 case GR_GL_RGBA4:
506 return kRGBA_4444_GrPixelConfig;
507 case GR_GL_LUMINANCE8:
508 return kGray_8_GrPixelConfig;
509 case GR_GL_RGBA32F:
510 return kRGBA_float_GrPixelConfig;
511 case GR_GL_RG32F:
512 return kRG_float_GrPixelConfig;
513 case GR_GL_R16F:
514 return kAlpha_half_as_Red_GrPixelConfig;
515 case GR_GL_RGBA16F:
516 return kRGBA_half_GrPixelConfig;
517 default:
518 return kUnknown_GrPixelConfig;
519 }
520}
521