blob: 8a3021cd5716fe684b4dd6bf5a49fa76c04c0e79 [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"
kkinnunenccdaa042014-08-20 01:36:23 -070013#include "GrStencil.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,
bsalomon@google.com3012ded2013-02-22 16:44:04 +000043
44 kOther_GrGLVendor
bsalomon@google.com0b1e4812012-10-23 13:52:43 +000045};
46
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000047enum GrGLRenderer {
commit-bot@chromium.org6dee8752014-02-07 22:39:01 +000048 kTegra2_GrGLRenderer,
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000049 kTegra3_GrGLRenderer,
bsalomon63b21962014-11-05 07:05:34 -080050 kPowerVR54x_GrGLRenderer,
51 kPowerVRRogue_GrGLRenderer,
bsalomona8fcea02015-02-13 09:00:39 -080052 kAdreno3xx_GrGLRenderer,
53 kAdreno4xx_GrGLRenderer,
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +000054 kOther_GrGLRenderer
55};
56
cdalton1acea862015-06-02 13:05:52 -070057enum GrGLDriver {
58 kMesa_GrGLDriver,
59 kChromium_GrGLDriver,
60 kNVIDIA_GrGLDriver,
cdalton1dd05422015-06-12 09:01:18 -070061 kIntel_GrGLDriver,
bsalomon88c7b982015-07-31 11:20:16 -070062 kANGLE_GrGLDriver,
cdalton1acea862015-06-02 13:05:52 -070063 kUnknown_GrGLDriver
64};
65
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000066////////////////////////////////////////////////////////////////////////////////
67
68/**
69 * Some drivers want the var-int arg to be zero-initialized on input.
70 */
71#define GR_GL_INIT_ZERO 0
72#define GR_GL_GetIntegerv(gl, e, p) \
73 do { \
74 *(p) = GR_GL_INIT_ZERO; \
75 GR_GL_CALL(gl, GetIntegerv(e, p)); \
76 } while (0)
77
78#define GR_GL_GetFramebufferAttachmentParameteriv(gl, t, a, pname, p) \
79 do { \
80 *(p) = GR_GL_INIT_ZERO; \
81 GR_GL_CALL(gl, GetFramebufferAttachmentParameteriv(t, a, pname, p)); \
82 } while (0)
83
robertphillips7354a4b2015-12-16 05:08:27 -080084#define GR_GL_GetNamedFramebufferAttachmentParameteriv(gl, fb, a, pname, p) \
85 do { \
86 *(p) = GR_GL_INIT_ZERO; \
87 GR_GL_CALL(gl, GetNamedFramebufferAttachmentParameteriv(fb, a, pname, p)); \
88 } while (0)
89
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000090#define GR_GL_GetRenderbufferParameteriv(gl, t, pname, p) \
91 do { \
92 *(p) = GR_GL_INIT_ZERO; \
93 GR_GL_CALL(gl, GetRenderbufferParameteriv(t, pname, p)); \
94 } while (0)
bsalomon17168df2014-12-09 09:00:49 -080095
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +000096#define GR_GL_GetTexLevelParameteriv(gl, t, l, pname, p) \
97 do { \
98 *(p) = GR_GL_INIT_ZERO; \
99 GR_GL_CALL(gl, GetTexLevelParameteriv(t, l, pname, p)); \
100 } while (0)
101
bsalomon17168df2014-12-09 09:00:49 -0800102#define GR_GL_GetShaderPrecisionFormat(gl, st, pt, range, precision) \
103 do { \
104 (range)[0] = GR_GL_INIT_ZERO; \
105 (range)[1] = GR_GL_INIT_ZERO; \
106 (*precision) = GR_GL_INIT_ZERO; \
107 GR_GL_CALL(gl, GetShaderPrecisionFormat(st, pt, range, precision)); \
108 } while (0)
109
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000110////////////////////////////////////////////////////////////////////////////////
111
112/**
113 * Helpers for glGetString()
114 */
115
116// these variants assume caller already has a string from glGetString()
117GrGLVersion GrGLGetVersionFromString(const char* versionString);
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000118GrGLStandard GrGLGetStandardInUseFromString(const char* versionString);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000119GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString);
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000120GrGLVendor GrGLGetVendorFromString(const char* vendorString);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000121GrGLRenderer GrGLGetRendererFromString(const char* rendererString);
cdalton1acea862015-06-02 13:05:52 -0700122
123void GrGLGetDriverInfo(GrGLStandard standard,
124 GrGLVendor vendor,
125 const char* rendererString,
126 const char* versionString,
127 GrGLDriver* outDriver,
128 GrGLDriverVersion* outVersion);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000129
130// these variants call glGetString()
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000131GrGLVersion GrGLGetVersion(const GrGLInterface*);
132GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface*);
bsalomon@google.com0b1e4812012-10-23 13:52:43 +0000133GrGLVendor GrGLGetVendor(const GrGLInterface*);
commit-bot@chromium.org0694ea72013-09-18 13:00:28 +0000134GrGLRenderer GrGLGetRenderer(const GrGLInterface*);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000135
commit-bot@chromium.orgc9424b82013-10-30 20:03:16 +0000136
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000137/**
138 * Helpers for glGetError()
139 */
140
bsalomon@google.com2717d562012-05-07 19:10:52 +0000141void GrGLCheckErr(const GrGLInterface* gl,
142 const char* location,
143 const char* call);
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000144
bsalomon@google.com2717d562012-05-07 19:10:52 +0000145void GrGLClearErr(const GrGLInterface* gl);
146
147////////////////////////////////////////////////////////////////////////////////
148
149/**
150 * Macros for using GrGLInterface to make GL calls
151 */
152
153// internal macro to conditionally call glGetError based on compile-time and
154// run-time flags.
155#if GR_GL_CHECK_ERROR
156 extern bool gCheckErrorGL;
157 #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \
158 if (gCheckErrorGL) \
159 GrGLCheckErr(IFACE, GR_FILE_AND_LINE_STR, #X)
160#else
161 #define GR_GL_CHECK_ERROR_IMPL(IFACE, X)
162#endif
163
tfarina38406c82014-10-31 07:11:12 -0700164// internal macro to conditionally log the gl call using SkDebugf based on
bsalomon@google.com2717d562012-05-07 19:10:52 +0000165// compile-time and run-time flags.
166#if GR_GL_LOG_CALLS
167 extern bool gLogCallsGL;
168 #define GR_GL_LOG_CALLS_IMPL(X) \
169 if (gLogCallsGL) \
tfarina38406c82014-10-31 07:11:12 -0700170 SkDebugf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
bsalomon@google.com2717d562012-05-07 19:10:52 +0000171#else
172 #define GR_GL_LOG_CALLS_IMPL(X)
173#endif
174
175// internal macro that does the per-GL-call callback (if necessary)
176#if GR_GL_PER_GL_FUNC_CALLBACK
177 #define GR_GL_CALLBACK_IMPL(IFACE) (IFACE)->fCallback(IFACE)
178#else
179 #define GR_GL_CALLBACK_IMPL(IFACE)
180#endif
181
182// makes a GL call on the interface and does any error checking and logging
183#define GR_GL_CALL(IFACE, X) \
184 do { \
185 GR_GL_CALL_NOERRCHECK(IFACE, X); \
186 GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
187 } while (false)
188
189// Variant of above that always skips the error check. This is useful when
190// the caller wants to do its own glGetError() call and examine the error value.
191#define GR_GL_CALL_NOERRCHECK(IFACE, X) \
192 do { \
193 GR_GL_CALLBACK_IMPL(IFACE); \
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000194 (IFACE)->fFunctions.f##X; \
bsalomon@google.com2717d562012-05-07 19:10:52 +0000195 GR_GL_LOG_CALLS_IMPL(X); \
196 } while (false)
197
198// same as GR_GL_CALL but stores the return value of the gl call in RET
199#define GR_GL_CALL_RET(IFACE, RET, X) \
200 do { \
201 GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X); \
202 GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
203 } while (false)
204
205// same as GR_GL_CALL_RET but always skips the error check.
206#define GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X) \
207 do { \
208 GR_GL_CALLBACK_IMPL(IFACE); \
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000209 (RET) = (IFACE)->fFunctions.f##X; \
bsalomon@google.com2717d562012-05-07 19:10:52 +0000210 GR_GL_LOG_CALLS_IMPL(X); \
211 } while (false)
212
213// call glGetError without doing a redundant error check or logging.
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000214#define GR_GL_GET_ERROR(IFACE) (IFACE)->fFunctions.fGetError()
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000215
kkinnunenccdaa042014-08-20 01:36:23 -0700216GrGLenum GrToGLStencilFunc(GrStencilFunc basicFunc);
217
218
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000219#endif