blob: 8062a0dbce15f7d8ee4f212a531fd90ace247001 [file] [log] [blame]
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +00001/*
2 * Copyright 2012 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.
6 */
7
8#ifndef GrGLUtil_DEFINED
9#define GrGLUtil_DEFINED
10
11#include "gl/GrGLInterface.h"
bsalomon@google.com91bcc942012-05-07 17:28:41 +000012#include "GrGLDefines.h"
cdalton93a379b2016-05-11 13:58:08 -070013#include "GrStencilSettings.h"
Brian Salomona6a3df72018-03-23 16:32:22 -040014#include "GrTypesPriv.h"
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000015
commit-bot@chromium.org215a6822013-09-05 18:28:42 +000016class SkMatrix;
17
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000018////////////////////////////////////////////////////////////////////////////////
19
20typedef uint32_t GrGLVersion;
21typedef uint32_t GrGLSLVersion;
cdalton1acea862015-06-02 13:05:52 -070022typedef uint32_t GrGLDriverVersion;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000023
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +000024#define GR_GL_VER(major, minor) ((static_cast<int>(major) << 16) | \
25 static_cast<int>(minor))
26#define GR_GLSL_VER(major, minor) ((static_cast<int>(major) << 16) | \
27 static_cast<int>(minor))
cdalton1acea862015-06-02 13:05:52 -070028#define GR_GL_DRIVER_VER(major, minor) ((static_cast<int>(major) << 16) | \
29 static_cast<int>(minor))
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +000030
31#define GR_GL_INVALID_VER GR_GL_VER(0, 0)
cdalton1acea862015-06-02 13:05:52 -070032#define GR_GLSL_INVALID_VER GR_GLSL_VER(0, 0)
33#define GR_GL_DRIVER_UNKNOWN_VER GR_GL_DRIVER_VER(0, 0)
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +000034
bsalomon@google.com0b1e4812012-10-23 13:52:43 +000035/**
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000036 * The Vendor and Renderer enum values are lazily updated as required.
bsalomon@google.com0b1e4812012-10-23 13:52:43 +000037 */
38enum GrGLVendor {
bsalomon@google.com96966a52013-02-21 16:34:21 +000039 kARM_GrGLVendor,
bsalomon@google.com3012ded2013-02-22 16:44:04 +000040 kImagination_GrGLVendor,
41 kIntel_GrGLVendor,
commit-bot@chromium.org7a434a22013-08-21 14:01:56 +000042 kQualcomm_GrGLVendor,
bsalomone904c092014-07-17 10:50:59 -070043 kNVIDIA_GrGLVendor,
brianosman131ff132016-06-07 14:22:44 -070044 kATI_GrGLVendor,
bsalomon@google.com3012ded2013-02-22 16:44:04 +000045
46 kOther_GrGLVendor
bsalomon@google.com0b1e4812012-10-23 13:52:43 +000047};
48
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000049enum GrGLRenderer {
commit-bot@chromium.org6dee8752014-02-07 22:39:01 +000050 kTegra2_GrGLRenderer,
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000051 kTegra3_GrGLRenderer,
bsalomon63b21962014-11-05 07:05:34 -080052 kPowerVR54x_GrGLRenderer,
53 kPowerVRRogue_GrGLRenderer,
bsalomona8fcea02015-02-13 09:00:39 -080054 kAdreno3xx_GrGLRenderer,
55 kAdreno4xx_GrGLRenderer,
egdaniel7517e452016-09-20 13:00:26 -070056 kAdreno5xx_GrGLRenderer,
bsalomon40170072016-05-05 14:40:03 -070057 kOSMesa_GrGLRenderer,
Robert Phillipsa2fd62a2017-10-05 12:46:21 -040058 kIntelIrisPro_GrGLRenderer,
Chris Dalton4a6a7322017-10-06 14:28:11 -060059 /** Either HD 4xxx or Iris 4xxx */
60 kIntel4xxx_GrGLRenderer,
Brian Salomon028a9a52017-05-11 11:39:08 -040061 /** Either HD 6xxx or Iris 6xxx */
62 kIntel6xxx_GrGLRenderer,
Greg Daniel25019172017-10-26 13:32:33 -040063 kGalliumLLVM_GrGLRenderer,
Brian Salomon5fba7ad2018-03-22 10:01:16 -040064 kMali4xx_GrGLRenderer,
Brian Osmanac1e4962017-05-25 11:34:38 -040065 /** T-6xx, T-7xx, or T-8xx */
66 kMaliT_GrGLRenderer,
Robert Phillipsbc712742017-06-02 11:20:37 -040067 kANGLE_GrGLRenderer,
Robert Phillipsdbfecd02017-10-18 15:44:08 -040068
Brian Salomon5fba7ad2018-03-22 10:01:16 -040069 kAMDRadeonHD7xxx_GrGLRenderer, // AMD Radeon HD 7000 Series
70 kAMDRadeonR9M4xx_GrGLRenderer, // AMD Radeon R9 M400 Series
Robert Phillipsdbfecd02017-10-18 15:44:08 -040071
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000072 kOther_GrGLRenderer
73};
74
cdalton1acea862015-06-02 13:05:52 -070075enum GrGLDriver {
76 kMesa_GrGLDriver,
77 kChromium_GrGLDriver,
78 kNVIDIA_GrGLDriver,
cdalton1dd05422015-06-12 09:01:18 -070079 kIntel_GrGLDriver,
bsalomon88c7b982015-07-31 11:20:16 -070080 kANGLE_GrGLDriver,
Brian Salomonb52fa022017-06-07 09:42:52 -040081 kQualcomm_GrGLDriver,
cdalton1acea862015-06-02 13:05:52 -070082 kUnknown_GrGLDriver
83};
84
Brian Salomon266ef6d2017-09-22 11:27:42 -040085enum class GrGLANGLEBackend {
86 kUnknown,
87 kD3D9,
88 kD3D11,
89 kOpenGL
90};
91
92enum class GrGLANGLEVendor {
93 kUnknown,
94 kIntel
95};
96
Chris Dalton0a94e4c2018-01-18 15:06:50 -070097enum class GrGLANGLERenderer {
Brian Salomon266ef6d2017-09-22 11:27:42 -040098 kUnknown,
Chris Dalton0a94e4c2018-01-18 15:06:50 -070099 kIvyBridge,
100 kSkylake
Brian Salomon266ef6d2017-09-22 11:27:42 -0400101};
102
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000103////////////////////////////////////////////////////////////////////////////////
104
105/**
106 * Some drivers want the var-int arg to be zero-initialized on input.
107 */
108#define GR_GL_INIT_ZERO 0
109#define GR_GL_GetIntegerv(gl, e, p) \
110 do { \
111 *(p) = GR_GL_INIT_ZERO; \
112 GR_GL_CALL(gl, GetIntegerv(e, p)); \
113 } while (0)
114
115#define GR_GL_GetFramebufferAttachmentParameteriv(gl, t, a, pname, p) \
116 do { \
117 *(p) = GR_GL_INIT_ZERO; \
118 GR_GL_CALL(gl, GetFramebufferAttachmentParameteriv(t, a, pname, p)); \
119 } while (0)
120
Greg Daniel81e7bf82017-07-19 14:47:42 -0400121#define GR_GL_GetInternalformativ(gl, t, f, n, s, p) \
122 do { \
123 *(p) = GR_GL_INIT_ZERO; \
124 GR_GL_CALL(gl, GetInternalformativ(t, f, n, s, p)); \
125 } while (0)
126
robertphillips7354a4b2015-12-16 05:08:27 -0800127#define GR_GL_GetNamedFramebufferAttachmentParameteriv(gl, fb, a, pname, p) \
128 do { \
129 *(p) = GR_GL_INIT_ZERO; \
130 GR_GL_CALL(gl, GetNamedFramebufferAttachmentParameteriv(fb, a, pname, p)); \
131 } while (0)
132
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000133#define GR_GL_GetRenderbufferParameteriv(gl, t, pname, p) \
134 do { \
135 *(p) = GR_GL_INIT_ZERO; \
136 GR_GL_CALL(gl, GetRenderbufferParameteriv(t, pname, p)); \
137 } while (0)
bsalomon17168df2014-12-09 09:00:49 -0800138
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000139#define GR_GL_GetTexLevelParameteriv(gl, t, l, pname, p) \
140 do { \
141 *(p) = GR_GL_INIT_ZERO; \
142 GR_GL_CALL(gl, GetTexLevelParameteriv(t, l, pname, p)); \
143 } while (0)
144
bsalomon17168df2014-12-09 09:00:49 -0800145#define GR_GL_GetShaderPrecisionFormat(gl, st, pt, range, precision) \
146 do { \
147 (range)[0] = GR_GL_INIT_ZERO; \
148 (range)[1] = GR_GL_INIT_ZERO; \
149 (*precision) = GR_GL_INIT_ZERO; \
150 GR_GL_CALL(gl, GetShaderPrecisionFormat(st, pt, range, precision)); \
151 } while (0)
152
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000153////////////////////////////////////////////////////////////////////////////////
154
155/**
156 * Helpers for glGetString()
157 */
158
159// these variants assume caller already has a string from glGetString()
160GrGLVersion GrGLGetVersionFromString(const char* versionString);
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000161GrGLStandard GrGLGetStandardInUseFromString(const char* versionString);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000162GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString);
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000163GrGLVendor GrGLGetVendorFromString(const char* vendorString);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000164GrGLRenderer GrGLGetRendererFromString(const char* rendererString);
Brian Salomon266ef6d2017-09-22 11:27:42 -0400165void GrGLGetANGLEInfoFromString(const char* rendererString, GrGLANGLEBackend*,
166 GrGLANGLEVendor*, GrGLANGLERenderer*);
cdalton1acea862015-06-02 13:05:52 -0700167
168void GrGLGetDriverInfo(GrGLStandard standard,
169 GrGLVendor vendor,
170 const char* rendererString,
171 const char* versionString,
172 GrGLDriver* outDriver,
173 GrGLDriverVersion* outVersion);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000174
175// these variants call glGetString()
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000176GrGLVersion GrGLGetVersion(const GrGLInterface*);
177GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface*);
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000178GrGLVendor GrGLGetVendor(const GrGLInterface*);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000179GrGLRenderer GrGLGetRenderer(const GrGLInterface*);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000180
181/**
182 * Helpers for glGetError()
183 */
184
bsalomon@google.com2717d562012-05-07 19:10:52 +0000185void GrGLCheckErr(const GrGLInterface* gl,
186 const char* location,
187 const char* call);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000188
bsalomon@google.com2717d562012-05-07 19:10:52 +0000189void GrGLClearErr(const GrGLInterface* gl);
190
191////////////////////////////////////////////////////////////////////////////////
192
193/**
194 * Macros for using GrGLInterface to make GL calls
195 */
196
197// internal macro to conditionally call glGetError based on compile-time and
198// run-time flags.
199#if GR_GL_CHECK_ERROR
200 extern bool gCheckErrorGL;
201 #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \
202 if (gCheckErrorGL) \
203 GrGLCheckErr(IFACE, GR_FILE_AND_LINE_STR, #X)
204#else
205 #define GR_GL_CHECK_ERROR_IMPL(IFACE, X)
206#endif
207
tfarina38406c82014-10-31 07:11:12 -0700208// internal macro to conditionally log the gl call using SkDebugf based on
bsalomon@google.com2717d562012-05-07 19:10:52 +0000209// compile-time and run-time flags.
210#if GR_GL_LOG_CALLS
211 extern bool gLogCallsGL;
212 #define GR_GL_LOG_CALLS_IMPL(X) \
213 if (gLogCallsGL) \
tfarina38406c82014-10-31 07:11:12 -0700214 SkDebugf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
bsalomon@google.com2717d562012-05-07 19:10:52 +0000215#else
216 #define GR_GL_LOG_CALLS_IMPL(X)
217#endif
218
bsalomon@google.com2717d562012-05-07 19:10:52 +0000219// makes a GL call on the interface and does any error checking and logging
220#define GR_GL_CALL(IFACE, X) \
221 do { \
222 GR_GL_CALL_NOERRCHECK(IFACE, X); \
223 GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
224 } while (false)
225
226// Variant of above that always skips the error check. This is useful when
227// the caller wants to do its own glGetError() call and examine the error value.
228#define GR_GL_CALL_NOERRCHECK(IFACE, X) \
229 do { \
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000230 (IFACE)->fFunctions.f##X; \
bsalomon@google.com2717d562012-05-07 19:10:52 +0000231 GR_GL_LOG_CALLS_IMPL(X); \
232 } while (false)
233
234// same as GR_GL_CALL but stores the return value of the gl call in RET
235#define GR_GL_CALL_RET(IFACE, RET, X) \
236 do { \
237 GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X); \
238 GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
239 } while (false)
240
241// same as GR_GL_CALL_RET but always skips the error check.
242#define GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X) \
243 do { \
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000244 (RET) = (IFACE)->fFunctions.f##X; \
bsalomon@google.com2717d562012-05-07 19:10:52 +0000245 GR_GL_LOG_CALLS_IMPL(X); \
246 } while (false)
247
248// call glGetError without doing a redundant error check or logging.
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000249#define GR_GL_GET_ERROR(IFACE) (IFACE)->fFunctions.fGetError()
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000250
cdalton93a379b2016-05-11 13:58:08 -0700251GrGLenum GrToGLStencilFunc(GrStencilTest test);
kkinnunenccdaa042014-08-20 01:36:23 -0700252
Greg Daniel8a3f55c2018-03-14 17:32:12 +0000253GrPixelConfig GrGLSizedFormatToPixelConfig(GrGLenum sizedFormat);
254
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000255#endif