blob: 59d6b839c3b94ae99012186d5f87fbd943c4b9e2 [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"
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000014
commit-bot@chromium.org215a6822013-09-05 18:28:42 +000015class SkMatrix;
16
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000017////////////////////////////////////////////////////////////////////////////////
18
19typedef uint32_t GrGLVersion;
20typedef uint32_t GrGLSLVersion;
cdalton1acea862015-06-02 13:05:52 -070021typedef uint32_t GrGLDriverVersion;
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000022
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +000023#define GR_GL_VER(major, minor) ((static_cast<int>(major) << 16) | \
24 static_cast<int>(minor))
25#define GR_GLSL_VER(major, minor) ((static_cast<int>(major) << 16) | \
26 static_cast<int>(minor))
cdalton1acea862015-06-02 13:05:52 -070027#define GR_GL_DRIVER_VER(major, minor) ((static_cast<int>(major) << 16) | \
28 static_cast<int>(minor))
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +000029
30#define GR_GL_INVALID_VER GR_GL_VER(0, 0)
cdalton1acea862015-06-02 13:05:52 -070031#define GR_GLSL_INVALID_VER GR_GLSL_VER(0, 0)
32#define GR_GL_DRIVER_UNKNOWN_VER GR_GL_DRIVER_VER(0, 0)
commit-bot@chromium.orgf4e67e32014-04-30 01:26:04 +000033
bsalomon@google.com0b1e4812012-10-23 13:52:43 +000034/**
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000035 * The Vendor and Renderer enum values are lazily updated as required.
bsalomon@google.com0b1e4812012-10-23 13:52:43 +000036 */
37enum GrGLVendor {
bsalomon@google.com96966a52013-02-21 16:34:21 +000038 kARM_GrGLVendor,
bsalomon@google.com3012ded2013-02-22 16:44:04 +000039 kImagination_GrGLVendor,
40 kIntel_GrGLVendor,
commit-bot@chromium.org7a434a22013-08-21 14:01:56 +000041 kQualcomm_GrGLVendor,
bsalomone904c092014-07-17 10:50:59 -070042 kNVIDIA_GrGLVendor,
brianosman131ff132016-06-07 14:22:44 -070043 kATI_GrGLVendor,
bsalomon@google.com3012ded2013-02-22 16:44:04 +000044
45 kOther_GrGLVendor
bsalomon@google.com0b1e4812012-10-23 13:52:43 +000046};
47
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000048enum GrGLRenderer {
commit-bot@chromium.org6dee8752014-02-07 22:39:01 +000049 kTegra2_GrGLRenderer,
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000050 kTegra3_GrGLRenderer,
bsalomon63b21962014-11-05 07:05:34 -080051 kPowerVR54x_GrGLRenderer,
52 kPowerVRRogue_GrGLRenderer,
bsalomona8fcea02015-02-13 09:00:39 -080053 kAdreno3xx_GrGLRenderer,
54 kAdreno4xx_GrGLRenderer,
egdaniel7517e452016-09-20 13:00:26 -070055 kAdreno5xx_GrGLRenderer,
bsalomon40170072016-05-05 14:40:03 -070056 kOSMesa_GrGLRenderer,
Robert Phillipsa2fd62a2017-10-05 12:46:21 -040057 kIntelIrisPro_GrGLRenderer,
Brian Salomon028a9a52017-05-11 11:39:08 -040058 /** Either HD 6xxx or Iris 6xxx */
59 kIntel6xxx_GrGLRenderer,
Brian Osmanac1e4962017-05-25 11:34:38 -040060 /** T-6xx, T-7xx, or T-8xx */
61 kMaliT_GrGLRenderer,
Robert Phillipsbc712742017-06-02 11:20:37 -040062 kANGLE_GrGLRenderer,
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000063 kOther_GrGLRenderer
64};
65
cdalton1acea862015-06-02 13:05:52 -070066enum GrGLDriver {
67 kMesa_GrGLDriver,
68 kChromium_GrGLDriver,
69 kNVIDIA_GrGLDriver,
cdalton1dd05422015-06-12 09:01:18 -070070 kIntel_GrGLDriver,
bsalomon88c7b982015-07-31 11:20:16 -070071 kANGLE_GrGLDriver,
Brian Salomonb52fa022017-06-07 09:42:52 -040072 kQualcomm_GrGLDriver,
cdalton1acea862015-06-02 13:05:52 -070073 kUnknown_GrGLDriver
74};
75
Brian Salomon266ef6d2017-09-22 11:27:42 -040076enum class GrGLANGLEBackend {
77 kUnknown,
78 kD3D9,
79 kD3D11,
80 kOpenGL
81};
82
83enum class GrGLANGLEVendor {
84 kUnknown,
85 kIntel
86};
87
88enum class GrGLANGLERenderer{
89 kUnknown,
90 kIvyBridge
91};
92
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000093////////////////////////////////////////////////////////////////////////////////
94
95/**
96 * Some drivers want the var-int arg to be zero-initialized on input.
97 */
98#define GR_GL_INIT_ZERO 0
99#define GR_GL_GetIntegerv(gl, e, p) \
100 do { \
101 *(p) = GR_GL_INIT_ZERO; \
102 GR_GL_CALL(gl, GetIntegerv(e, p)); \
103 } while (0)
104
105#define GR_GL_GetFramebufferAttachmentParameteriv(gl, t, a, pname, p) \
106 do { \
107 *(p) = GR_GL_INIT_ZERO; \
108 GR_GL_CALL(gl, GetFramebufferAttachmentParameteriv(t, a, pname, p)); \
109 } while (0)
110
Greg Daniel81e7bf82017-07-19 14:47:42 -0400111#define GR_GL_GetInternalformativ(gl, t, f, n, s, p) \
112 do { \
113 *(p) = GR_GL_INIT_ZERO; \
114 GR_GL_CALL(gl, GetInternalformativ(t, f, n, s, p)); \
115 } while (0)
116
robertphillips7354a4b2015-12-16 05:08:27 -0800117#define GR_GL_GetNamedFramebufferAttachmentParameteriv(gl, fb, a, pname, p) \
118 do { \
119 *(p) = GR_GL_INIT_ZERO; \
120 GR_GL_CALL(gl, GetNamedFramebufferAttachmentParameteriv(fb, a, pname, p)); \
121 } while (0)
122
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000123#define GR_GL_GetRenderbufferParameteriv(gl, t, pname, p) \
124 do { \
125 *(p) = GR_GL_INIT_ZERO; \
126 GR_GL_CALL(gl, GetRenderbufferParameteriv(t, pname, p)); \
127 } while (0)
bsalomon17168df2014-12-09 09:00:49 -0800128
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000129#define GR_GL_GetTexLevelParameteriv(gl, t, l, pname, p) \
130 do { \
131 *(p) = GR_GL_INIT_ZERO; \
132 GR_GL_CALL(gl, GetTexLevelParameteriv(t, l, pname, p)); \
133 } while (0)
134
bsalomon17168df2014-12-09 09:00:49 -0800135#define GR_GL_GetShaderPrecisionFormat(gl, st, pt, range, precision) \
136 do { \
137 (range)[0] = GR_GL_INIT_ZERO; \
138 (range)[1] = GR_GL_INIT_ZERO; \
139 (*precision) = GR_GL_INIT_ZERO; \
140 GR_GL_CALL(gl, GetShaderPrecisionFormat(st, pt, range, precision)); \
141 } while (0)
142
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000143////////////////////////////////////////////////////////////////////////////////
144
145/**
146 * Helpers for glGetString()
147 */
148
149// these variants assume caller already has a string from glGetString()
150GrGLVersion GrGLGetVersionFromString(const char* versionString);
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000151GrGLStandard GrGLGetStandardInUseFromString(const char* versionString);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000152GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString);
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000153GrGLVendor GrGLGetVendorFromString(const char* vendorString);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000154GrGLRenderer GrGLGetRendererFromString(const char* rendererString);
Brian Salomon266ef6d2017-09-22 11:27:42 -0400155void GrGLGetANGLEInfoFromString(const char* rendererString, GrGLANGLEBackend*,
156 GrGLANGLEVendor*, GrGLANGLERenderer*);
cdalton1acea862015-06-02 13:05:52 -0700157
158void GrGLGetDriverInfo(GrGLStandard standard,
159 GrGLVendor vendor,
160 const char* rendererString,
161 const char* versionString,
162 GrGLDriver* outDriver,
163 GrGLDriverVersion* outVersion);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000164
165// these variants call glGetString()
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000166GrGLVersion GrGLGetVersion(const GrGLInterface*);
167GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface*);
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000168GrGLVendor GrGLGetVendor(const GrGLInterface*);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000169GrGLRenderer GrGLGetRenderer(const GrGLInterface*);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000170
171/**
172 * Helpers for glGetError()
173 */
174
bsalomon@google.com2717d562012-05-07 19:10:52 +0000175void GrGLCheckErr(const GrGLInterface* gl,
176 const char* location,
177 const char* call);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000178
bsalomon@google.com2717d562012-05-07 19:10:52 +0000179void GrGLClearErr(const GrGLInterface* gl);
180
181////////////////////////////////////////////////////////////////////////////////
182
183/**
184 * Macros for using GrGLInterface to make GL calls
185 */
186
187// internal macro to conditionally call glGetError based on compile-time and
188// run-time flags.
189#if GR_GL_CHECK_ERROR
190 extern bool gCheckErrorGL;
191 #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \
192 if (gCheckErrorGL) \
193 GrGLCheckErr(IFACE, GR_FILE_AND_LINE_STR, #X)
194#else
195 #define GR_GL_CHECK_ERROR_IMPL(IFACE, X)
196#endif
197
tfarina38406c82014-10-31 07:11:12 -0700198// internal macro to conditionally log the gl call using SkDebugf based on
bsalomon@google.com2717d562012-05-07 19:10:52 +0000199// compile-time and run-time flags.
200#if GR_GL_LOG_CALLS
201 extern bool gLogCallsGL;
202 #define GR_GL_LOG_CALLS_IMPL(X) \
203 if (gLogCallsGL) \
tfarina38406c82014-10-31 07:11:12 -0700204 SkDebugf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
bsalomon@google.com2717d562012-05-07 19:10:52 +0000205#else
206 #define GR_GL_LOG_CALLS_IMPL(X)
207#endif
208
bsalomon@google.com2717d562012-05-07 19:10:52 +0000209// makes a GL call on the interface and does any error checking and logging
210#define GR_GL_CALL(IFACE, X) \
211 do { \
212 GR_GL_CALL_NOERRCHECK(IFACE, X); \
213 GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
214 } while (false)
215
216// Variant of above that always skips the error check. This is useful when
217// the caller wants to do its own glGetError() call and examine the error value.
218#define GR_GL_CALL_NOERRCHECK(IFACE, X) \
219 do { \
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000220 (IFACE)->fFunctions.f##X; \
bsalomon@google.com2717d562012-05-07 19:10:52 +0000221 GR_GL_LOG_CALLS_IMPL(X); \
222 } while (false)
223
224// same as GR_GL_CALL but stores the return value of the gl call in RET
225#define GR_GL_CALL_RET(IFACE, RET, X) \
226 do { \
227 GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X); \
228 GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
229 } while (false)
230
231// same as GR_GL_CALL_RET but always skips the error check.
232#define GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X) \
233 do { \
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000234 (RET) = (IFACE)->fFunctions.f##X; \
bsalomon@google.com2717d562012-05-07 19:10:52 +0000235 GR_GL_LOG_CALLS_IMPL(X); \
236 } while (false)
237
238// call glGetError without doing a redundant error check or logging.
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000239#define GR_GL_GET_ERROR(IFACE) (IFACE)->fFunctions.fGetError()
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000240
cdalton93a379b2016-05-11 13:58:08 -0700241GrGLenum GrToGLStencilFunc(GrStencilTest test);
kkinnunenccdaa042014-08-20 01:36:23 -0700242
243
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000244#endif