blob: dd9a9fb386619d1079b4238b97b0e221ed39f90a [file] [log] [blame]
twiz@google.com59a190b2011-03-14 21:23:01 +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.
twiz@google.com59a190b2011-03-14 21:23:01 +00006 */
7
twiz@google.com59a190b2011-03-14 21:23:01 +00008#ifndef GrGLInterface_DEFINED
9#define GrGLInterface_DEFINED
10
bsalomon@google.com637d5e92012-05-07 21:33:56 +000011#include "GrGLFunctions.h"
commit-bot@chromium.org90313cc2014-01-17 15:05:38 +000012#include "GrGLExtensions.h"
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000013#include "SkRefCnt.h"
twiz@google.com59a190b2011-03-14 21:23:01 +000014
twiz@google.com59a190b2011-03-14 21:23:01 +000015////////////////////////////////////////////////////////////////////////////////
16
17/**
bsalomon@google.com0b77d682011-08-19 13:28:54 +000018 * Rather than depend on platform-specific GL headers and libraries, we require
19 * the client to provide a struct of GL function pointers. This struct can be
20 * specified per-GrContext as a parameter to GrContext::Create. If NULL is
commit-bot@chromium.orga3b15ed2014-01-15 19:32:03 +000021 * passed to Create then a "default" GL interface is created. If the default is
bsalomon@google.com0b77d682011-08-19 13:28:54 +000022 * also NULL GrContext creation will fail.
23 *
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000024 * The default interface is returned by GrGLDefaultInterface. This function's
robertphillips@google.com0da37192012-03-19 14:42:13 +000025 * implementation is platform-specific. Several have been provided, along with
commit-bot@chromium.orga3b15ed2014-01-15 19:32:03 +000026 * an implementation that simply returns NULL.
bsalomon@google.com56bfc5a2011-09-01 13:28:16 +000027 *
28 * By defining GR_GL_PER_GL_CALL_IFACE_CALLBACK to 1 the client can specify a
29 * callback function that will be called prior to each GL function call. See
30 * comments in GrGLConfig.h
twiz@google.com59a190b2011-03-14 21:23:01 +000031 */
twiz@google.com59a190b2011-03-14 21:23:01 +000032
cdaltond416a5b2015-06-23 13:23:44 -070033typedef void(*GrGLFuncPtr)();
34
bsalomon@google.com0b77d682011-08-19 13:28:54 +000035struct GrGLInterface;
36
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000037const GrGLInterface* GrGLDefaultInterface();
twiz@google.com59a190b2011-03-14 21:23:01 +000038
bsalomon@google.com57f5d982011-10-24 21:17:53 +000039/**
40 * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows,
commit-bot@chromium.orga3b15ed2014-01-15 19:32:03 +000041 * GLX on linux, AGL on Mac). The interface is only valid for the GL context
42 * that is current when the interface is created.
bsalomon@google.com57f5d982011-10-24 21:17:53 +000043 */
halcanary0fc1dbe2015-09-21 08:22:19 -070044SK_API const GrGLInterface* GrGLCreateNativeInterface();
bsalomon@google.com373a6632011-10-19 20:43:20 +000045
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000046#if SK_MESA
bsalomon@google.com57f5d982011-10-24 21:17:53 +000047/**
48 * Creates a GrGLInterface for an OSMesa context.
49 */
halcanary0fc1dbe2015-09-21 08:22:19 -070050SK_API const GrGLInterface* GrGLCreateMesaInterface();
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000051#endif
52
53#if SK_ANGLE
54/**
55 * Creates a GrGLInterface for an ANGLE context.
56 */
halcanary0fc1dbe2015-09-21 08:22:19 -070057SK_API const GrGLInterface* GrGLCreateANGLEInterface();
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000058#endif
bsalomon@google.com373a6632011-10-19 20:43:20 +000059
hendrikw885bf092015-08-27 10:38:39 -070060#if SK_COMMAND_BUFFER
61/**
62 * Creates a GrGLInterface for a Command Buffer context.
63 */
halcanary0fc1dbe2015-09-21 08:22:19 -070064SK_API const GrGLInterface* GrGLCreateCommandBufferInterface();
hendrikw885bf092015-08-27 10:38:39 -070065#endif
66
bsalomon@google.com74913722011-10-27 20:44:19 +000067/**
68 * Creates a null GrGLInterface that doesn't draw anything. Used for measuring
69 * CPU overhead.
70 */
commit-bot@chromium.orgaae7c2a2013-11-25 20:39:27 +000071const SK_API GrGLInterface* GrGLCreateNullInterface();
bsalomon@google.com74913722011-10-27 20:44:19 +000072
robertphillips@google.com0da37192012-03-19 14:42:13 +000073/**
rmistry@google.comfbfcd562012-08-23 18:09:54 +000074 * Creates a debugging GrGLInterface that doesn't draw anything. Used for
robertphillips@google.com0da37192012-03-19 14:42:13 +000075 * finding memory leaks and invalid memory accesses.
76 */
77const GrGLInterface* GrGLCreateDebugInterface();
78
bsalomon@google.com56bfc5a2011-09-01 13:28:16 +000079#if GR_GL_PER_GL_FUNC_CALLBACK
80typedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*);
81typedef intptr_t GrGLInterfaceCallbackData;
82#endif
83
commit-bot@chromium.orgd8ed8512014-01-24 20:49:44 +000084/** Function that returns a new interface identical to "interface" but without support for
85 GL_NV_path_rendering. */
86const GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface*);
87
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +000088/** Function that returns a new interface identical to "interface" but with support for
89 test version of GL_EXT_debug_marker. */
90const GrGLInterface* GrGLInterfaceAddTestDebugMarker(const GrGLInterface*,
91 GrGLInsertEventMarkerProc insertEventMarkerFn,
92 GrGLPushGroupMarkerProc pushGroupMarkerFn,
93 GrGLPopGroupMarkerProc popGroupMarkerFn);
94
commit-bot@chromium.orgd8ed8512014-01-24 20:49:44 +000095/**
bsalomon@google.comcc61b172012-05-07 21:45:48 +000096 * GrContext uses the following interface to make all calls into OpenGL. When a
97 * GrContext is created it is given a GrGLInterface. The interface's function
98 * pointers must be valid for the OpenGL context associated with the GrContext.
99 * On some platforms, such as Windows, function pointers for OpenGL extensions
100 * may vary between OpenGL contexts. So the caller must be careful to use a
101 * GrGLInterface initialized for the correct context. All functions that should
102 * be available based on the OpenGL's version and extension string must be
103 * non-NULL or GrContext creation will fail. This can be tested with the
104 * validate() method when the OpenGL context has been made current.
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000105 */
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000106struct SK_API GrGLInterface : public SkRefCnt {
bsalomon@google.comba800e22012-03-29 21:04:52 +0000107private:
bsalomon@google.com9c1f1ac2012-05-07 17:09:37 +0000108 // simple wrapper class that exists only to initialize a pointer to NULL
bsalomon@google.comba800e22012-03-29 21:04:52 +0000109 template <typename FNPTR_TYPE> class GLPtr {
110 public:
111 GLPtr() : fPtr(NULL) {}
benjaminwagnerf49c75a2016-02-05 07:02:38 -0800112 GLPtr(const GLPtr&) = delete;
113 GLPtr& operator=(FNPTR_TYPE ptr) { fPtr = ptr; return *this; }
bsalomon@google.comba800e22012-03-29 21:04:52 +0000114 operator FNPTR_TYPE() const { return fPtr; }
115 private:
116 FNPTR_TYPE fPtr;
117 };
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000118
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000119 // This is a temporary workaround to keep Chromium's GrGLInterface factories compiling until
120 // they're updated to use the Functions struct.
121 template <typename FNPTR_TYPE> class GLPtrAlias {
122 public:
benjaminwagnerf49c75a2016-02-05 07:02:38 -0800123 explicit GLPtrAlias(GLPtr<FNPTR_TYPE>* base) : fBase(base) {}
124 GLPtrAlias(const GLPtrAlias&) = delete;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000125 void operator=(FNPTR_TYPE ptr) { *fBase = ptr; }
126 private:
127 GLPtr<FNPTR_TYPE>* fBase;
128 };
129
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000130 typedef SkRefCnt INHERITED;
robertphillips@google.com15e9d3e2012-06-21 20:25:03 +0000131
bsalomon@google.comba800e22012-03-29 21:04:52 +0000132public:
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000133 GrGLInterface();
134
commit-bot@chromium.orgd8ed8512014-01-24 20:49:44 +0000135 static GrGLInterface* NewClone(const GrGLInterface*);
136
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000137 // Validates that the GrGLInterface supports its advertised standard. This means the necessary
138 // function pointers have been initialized for both the GL version and any advertised
139 // extensions.
140 bool validate() const;
bsalomon@google.com89ec61e2012-02-10 20:05:18 +0000141
commit-bot@chromium.org9e90aed2014-01-16 16:35:09 +0000142 // Indicates the type of GL implementation
143 union {
144 GrGLStandard fStandard;
145 GrGLStandard fBindingsExported; // Legacy name, will be remove when Chromium is updated.
146 };
twiz@google.comb65e0cb2011-03-18 20:41:44 +0000147
commit-bot@chromium.org90313cc2014-01-17 15:05:38 +0000148 GrGLExtensions fExtensions;
149
commit-bot@chromium.orgf5355612014-02-28 20:28:50 +0000150 bool hasExtension(const char ext[]) const { return fExtensions.has(ext); }
commit-bot@chromium.org90313cc2014-01-17 15:05:38 +0000151
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000152 /**
153 * The function pointers are in a struct so that we can have a compiler generated assignment
154 * operator.
155 */
156 struct Functions {
157 GLPtr<GrGLActiveTextureProc> fActiveTexture;
158 GLPtr<GrGLAttachShaderProc> fAttachShader;
159 GLPtr<GrGLBeginQueryProc> fBeginQuery;
160 GLPtr<GrGLBindAttribLocationProc> fBindAttribLocation;
161 GLPtr<GrGLBindBufferProc> fBindBuffer;
162 GLPtr<GrGLBindFragDataLocationProc> fBindFragDataLocation;
163 GLPtr<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed;
164 GLPtr<GrGLBindFramebufferProc> fBindFramebuffer;
165 GLPtr<GrGLBindRenderbufferProc> fBindRenderbuffer;
166 GLPtr<GrGLBindTextureProc> fBindTexture;
167 GLPtr<GrGLBindVertexArrayProc> fBindVertexArray;
cdaltonbae6f6c2015-04-22 10:39:03 -0700168 GLPtr<GrGLBlendBarrierProc> fBlendBarrier;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000169 GLPtr<GrGLBlendColorProc> fBlendColor;
cdaltonbae6f6c2015-04-22 10:39:03 -0700170 GLPtr<GrGLBlendEquationProc> fBlendEquation;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000171 GLPtr<GrGLBlendFuncProc> fBlendFunc;
172 GLPtr<GrGLBlitFramebufferProc> fBlitFramebuffer;
173 GLPtr<GrGLBufferDataProc> fBufferData;
174 GLPtr<GrGLBufferSubDataProc> fBufferSubData;
175 GLPtr<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus;
176 GLPtr<GrGLClearProc> fClear;
177 GLPtr<GrGLClearColorProc> fClearColor;
178 GLPtr<GrGLClearStencilProc> fClearStencil;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000179 GLPtr<GrGLColorMaskProc> fColorMask;
180 GLPtr<GrGLCompileShaderProc> fCompileShader;
181 GLPtr<GrGLCompressedTexImage2DProc> fCompressedTexImage2D;
krajcevski37d20f72014-06-11 10:38:47 -0700182 GLPtr<GrGLCompressedTexSubImage2DProc> fCompressedTexSubImage2D;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000183 GLPtr<GrGLCopyTexSubImage2DProc> fCopyTexSubImage2D;
184 GLPtr<GrGLCreateProgramProc> fCreateProgram;
185 GLPtr<GrGLCreateShaderProc> fCreateShader;
186 GLPtr<GrGLCullFaceProc> fCullFace;
187 GLPtr<GrGLDeleteBuffersProc> fDeleteBuffers;
188 GLPtr<GrGLDeleteFramebuffersProc> fDeleteFramebuffers;
189 GLPtr<GrGLDeleteProgramProc> fDeleteProgram;
190 GLPtr<GrGLDeleteQueriesProc> fDeleteQueries;
191 GLPtr<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers;
192 GLPtr<GrGLDeleteShaderProc> fDeleteShader;
193 GLPtr<GrGLDeleteTexturesProc> fDeleteTextures;
194 GLPtr<GrGLDeleteVertexArraysProc> fDeleteVertexArrays;
195 GLPtr<GrGLDepthMaskProc> fDepthMask;
196 GLPtr<GrGLDisableProc> fDisable;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000197 GLPtr<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray;
198 GLPtr<GrGLDrawArraysProc> fDrawArrays;
cdalton06604b92016-02-05 10:09:51 -0800199 GLPtr<GrGLDrawArraysIndirectProc> fDrawArraysIndirect;
200 GLPtr<GrGLDrawArraysInstancedProc> fDrawArraysInstanced;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000201 GLPtr<GrGLDrawBufferProc> fDrawBuffer;
202 GLPtr<GrGLDrawBuffersProc> fDrawBuffers;
203 GLPtr<GrGLDrawElementsProc> fDrawElements;
cdalton06604b92016-02-05 10:09:51 -0800204 GLPtr<GrGLDrawElementsIndirectProc> fDrawElementsIndirect;
205 GLPtr<GrGLDrawElementsInstancedProc> fDrawElementsInstanced;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000206 GLPtr<GrGLEnableProc> fEnable;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000207 GLPtr<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray;
208 GLPtr<GrGLEndQueryProc> fEndQuery;
209 GLPtr<GrGLFinishProc> fFinish;
210 GLPtr<GrGLFlushProc> fFlush;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000211 GLPtr<GrGLFlushMappedBufferRangeProc> fFlushMappedBufferRange;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000212 GLPtr<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer;
213 GLPtr<GrGLFramebufferTexture2DProc> fFramebufferTexture2D;
214 GLPtr<GrGLFramebufferTexture2DMultisampleProc> fFramebufferTexture2DMultisample;
215 GLPtr<GrGLFrontFaceProc> fFrontFace;
216 GLPtr<GrGLGenBuffersProc> fGenBuffers;
217 GLPtr<GrGLGenFramebuffersProc> fGenFramebuffers;
218 GLPtr<GrGLGenerateMipmapProc> fGenerateMipmap;
219 GLPtr<GrGLGenQueriesProc> fGenQueries;
220 GLPtr<GrGLGenRenderbuffersProc> fGenRenderbuffers;
221 GLPtr<GrGLGenTexturesProc> fGenTextures;
222 GLPtr<GrGLGenVertexArraysProc> fGenVertexArrays;
223 GLPtr<GrGLGetBufferParameterivProc> fGetBufferParameteriv;
224 GLPtr<GrGLGetErrorProc> fGetError;
225 GLPtr<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv;
226 GLPtr<GrGLGetIntegervProc> fGetIntegerv;
227 GLPtr<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v;
228 GLPtr<GrGLGetQueryObjectivProc> fGetQueryObjectiv;
229 GLPtr<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v;
230 GLPtr<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv;
231 GLPtr<GrGLGetQueryivProc> fGetQueryiv;
232 GLPtr<GrGLGetProgramInfoLogProc> fGetProgramInfoLog;
233 GLPtr<GrGLGetProgramivProc> fGetProgramiv;
234 GLPtr<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv;
235 GLPtr<GrGLGetShaderInfoLogProc> fGetShaderInfoLog;
236 GLPtr<GrGLGetShaderivProc> fGetShaderiv;
bsalomonee64d6e2014-12-03 10:46:08 -0800237 GLPtr<GrGLGetShaderPrecisionFormatProc> fGetShaderPrecisionFormat;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000238 GLPtr<GrGLGetStringProc> fGetString;
239 GLPtr<GrGLGetStringiProc> fGetStringi;
240 GLPtr<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv;
241 GLPtr<GrGLGetUniformLocationProc> fGetUniformLocation;
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000242 GLPtr<GrGLInsertEventMarkerProc> fInsertEventMarker;
bsalomon@google.coma34bb602014-04-01 13:07:29 +0000243 GLPtr<GrGLInvalidateBufferDataProc> fInvalidateBufferData;
244 GLPtr<GrGLInvalidateBufferSubDataProc> fInvalidateBufferSubData;
245 GLPtr<GrGLInvalidateFramebufferProc> fInvalidateFramebuffer;
246 GLPtr<GrGLInvalidateSubFramebufferProc> fInvalidateSubFramebuffer;
247 GLPtr<GrGLInvalidateTexImageProc> fInvalidateTexImage;
248 GLPtr<GrGLInvalidateTexSubImageProc> fInvalidateTexSubImage;
bsalomon6dc6f5f2015-06-18 09:12:16 -0700249 GLPtr<GrGLIsTextureProc> fIsTexture;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000250 GLPtr<GrGLLineWidthProc> fLineWidth;
251 GLPtr<GrGLLinkProgramProc> fLinkProgram;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000252 GLPtr<GrGLMapBufferProc> fMapBuffer;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000253 GLPtr<GrGLMapBufferRangeProc> fMapBufferRange;
commit-bot@chromium.orgbeb8b3a2014-04-15 15:37:51 +0000254 GLPtr<GrGLMapBufferSubDataProc> fMapBufferSubData;
255 GLPtr<GrGLMapTexSubImage2DProc> fMapTexSubImage2D;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000256 GLPtr<GrGLPixelStoreiProc> fPixelStorei;
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000257 GLPtr<GrGLPopGroupMarkerProc> fPopGroupMarker;
258 GLPtr<GrGLPushGroupMarkerProc> fPushGroupMarker;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000259 GLPtr<GrGLQueryCounterProc> fQueryCounter;
cdalton0edea2c2015-05-21 08:27:44 -0700260 GLPtr<GrGLRasterSamplesProc> fRasterSamples;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000261 GLPtr<GrGLReadBufferProc> fReadBuffer;
262 GLPtr<GrGLReadPixelsProc> fReadPixels;
263 GLPtr<GrGLRenderbufferStorageProc> fRenderbufferStorage;
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +0000264
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000265 // On OpenGL ES there are multiple incompatible extensions that add support for MSAA
266 // and ES3 adds MSAA support to the standard. On an ES3 driver we may still use the
267 // older extensions for performance reasons or due to ES3 driver bugs. We want the function
268 // that creates the GrGLInterface to provide all available functions and internally
269 // we will select among them. They all have a method called glRenderbufferStorageMultisample*.
270 // So we have separate function pointers for GL_IMG/EXT_multisampled_to_texture,
271 // GL_CHROMIUM/ANGLE_framebuffer_multisample/ES3, and GL_APPLE_framebuffer_multisample
272 // variations.
273 //
274 // If a driver supports multiple GL_ARB_framebuffer_multisample-style extensions then we will
275 // assume the function pointers for the standard (or equivalent GL_ARB) version have
276 // been preferred over GL_EXT, GL_CHROMIUM, or GL_ANGLE variations that have reduced
277 // functionality.
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +0000278
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000279 // GL_EXT_multisampled_render_to_texture (preferred) or GL_IMG_multisampled_render_to_texture
280 GLPtr<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2EXT;
281 // GL_APPLE_framebuffer_multisample
282 GLPtr<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2APPLE;
commit-bot@chromium.org92b78842014-01-16 20:49:46 +0000283
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000284 // This is used to store the pointer for GL_ARB/EXT/ANGLE/CHROMIUM_framebuffer_multisample or
285 // the standard function in ES3+ or GL 3.0+.
286 GLPtr<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample;
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +0000287
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000288 // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension.
kkinnunen0adfffb2015-10-13 12:58:37 -0700289 GLPtr<GrGLBindUniformLocationProc> fBindUniformLocation;
commit-bot@chromium.orgd3baf202013-11-07 22:06:08 +0000290
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000291 GLPtr<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer;
292 GLPtr<GrGLScissorProc> fScissor;
293 GLPtr<GrGLShaderSourceProc> fShaderSource;
294 GLPtr<GrGLStencilFuncProc> fStencilFunc;
295 GLPtr<GrGLStencilFuncSeparateProc> fStencilFuncSeparate;
296 GLPtr<GrGLStencilMaskProc> fStencilMask;
297 GLPtr<GrGLStencilMaskSeparateProc> fStencilMaskSeparate;
298 GLPtr<GrGLStencilOpProc> fStencilOp;
299 GLPtr<GrGLStencilOpSeparateProc> fStencilOpSeparate;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000300 GLPtr<GrGLTexImage2DProc> fTexImage2D;
301 GLPtr<GrGLTexParameteriProc> fTexParameteri;
302 GLPtr<GrGLTexParameterivProc> fTexParameteriv;
303 GLPtr<GrGLTexSubImage2DProc> fTexSubImage2D;
304 GLPtr<GrGLTexStorage2DProc> fTexStorage2D;
cdaltonfd4167d2015-04-21 11:45:56 -0700305 GLPtr<GrGLTextureBarrierProc> fTextureBarrier;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000306 GLPtr<GrGLDiscardFramebufferProc> fDiscardFramebuffer;
307 GLPtr<GrGLUniform1fProc> fUniform1f;
308 GLPtr<GrGLUniform1iProc> fUniform1i;
309 GLPtr<GrGLUniform1fvProc> fUniform1fv;
310 GLPtr<GrGLUniform1ivProc> fUniform1iv;
311 GLPtr<GrGLUniform2fProc> fUniform2f;
312 GLPtr<GrGLUniform2iProc> fUniform2i;
313 GLPtr<GrGLUniform2fvProc> fUniform2fv;
314 GLPtr<GrGLUniform2ivProc> fUniform2iv;
315 GLPtr<GrGLUniform3fProc> fUniform3f;
316 GLPtr<GrGLUniform3iProc> fUniform3i;
317 GLPtr<GrGLUniform3fvProc> fUniform3fv;
318 GLPtr<GrGLUniform3ivProc> fUniform3iv;
319 GLPtr<GrGLUniform4fProc> fUniform4f;
320 GLPtr<GrGLUniform4iProc> fUniform4i;
321 GLPtr<GrGLUniform4fvProc> fUniform4fv;
322 GLPtr<GrGLUniform4ivProc> fUniform4iv;
323 GLPtr<GrGLUniformMatrix2fvProc> fUniformMatrix2fv;
324 GLPtr<GrGLUniformMatrix3fvProc> fUniformMatrix3fv;
325 GLPtr<GrGLUniformMatrix4fvProc> fUniformMatrix4fv;
326 GLPtr<GrGLUnmapBufferProc> fUnmapBuffer;
commit-bot@chromium.orgbeb8b3a2014-04-15 15:37:51 +0000327 GLPtr<GrGLUnmapBufferSubDataProc> fUnmapBufferSubData;
328 GLPtr<GrGLUnmapTexSubImage2DProc> fUnmapTexSubImage2D;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000329 GLPtr<GrGLUseProgramProc> fUseProgram;
egdaniel27c15212014-10-24 15:00:50 -0700330 GLPtr<GrGLVertexAttrib1fProc> fVertexAttrib1f;
331 GLPtr<GrGLVertexAttrib2fvProc> fVertexAttrib2fv;
332 GLPtr<GrGLVertexAttrib3fvProc> fVertexAttrib3fv;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000333 GLPtr<GrGLVertexAttrib4fvProc> fVertexAttrib4fv;
cdalton06604b92016-02-05 10:09:51 -0800334 GLPtr<GrGLVertexAttribDivisorProc> fVertexAttribDivisor;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000335 GLPtr<GrGLVertexAttribPointerProc> fVertexAttribPointer;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000336 GLPtr<GrGLViewportProc> fViewport;
bsalomon@google.com271cffc2011-05-20 14:13:56 +0000337
cdalton626e1ff2015-06-12 13:56:46 -0700338 /* GL_NV_path_rendering */
339 GLPtr<GrGLMatrixLoadfProc> fMatrixLoadf;
340 GLPtr<GrGLMatrixLoadIdentityProc> fMatrixLoadIdentity;
kkinnunen32b9a3b2014-07-02 22:56:35 -0700341 GLPtr<GrGLGetProgramResourceLocationProc> fGetProgramResourceLocation;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000342 GLPtr<GrGLPathCommandsProc> fPathCommands;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000343 GLPtr<GrGLPathParameteriProc> fPathParameteri;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000344 GLPtr<GrGLPathParameterfProc> fPathParameterf;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000345 GLPtr<GrGLGenPathsProc> fGenPaths;
346 GLPtr<GrGLDeletePathsProc> fDeletePaths;
cdalton8dd90cb2014-07-17 09:28:36 -0700347 GLPtr<GrGLIsPathProc> fIsPath;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000348 GLPtr<GrGLPathStencilFuncProc> fPathStencilFunc;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000349 GLPtr<GrGLStencilFillPathProc> fStencilFillPath;
350 GLPtr<GrGLStencilStrokePathProc> fStencilStrokePath;
351 GLPtr<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced;
352 GLPtr<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000353 GLPtr<GrGLCoverFillPathProc> fCoverFillPath;
354 GLPtr<GrGLCoverStrokePathProc> fCoverStrokePath;
355 GLPtr<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced;
356 GLPtr<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced;
cdaltonc7103a12014-08-11 14:05:05 -0700357 // NV_path_rendering v1.2
cdaltonc8f52042014-07-29 15:25:51 -0700358 GLPtr<GrGLStencilThenCoverFillPathProc> fStencilThenCoverFillPath;
359 GLPtr<GrGLStencilThenCoverStrokePathProc> fStencilThenCoverStrokePath;
360 GLPtr<GrGLStencilThenCoverFillPathInstancedProc> fStencilThenCoverFillPathInstanced;
361 GLPtr<GrGLStencilThenCoverStrokePathInstancedProc> fStencilThenCoverStrokePathInstanced;
cdaltonc7103a12014-08-11 14:05:05 -0700362 // NV_path_rendering v1.3
kkinnunen32b9a3b2014-07-02 22:56:35 -0700363 GLPtr<GrGLProgramPathFragmentInputGenProc> fProgramPathFragmentInputGen;
kkinnunen6bb6d402015-07-14 10:59:23 -0700364 // CHROMIUM_path_rendering
365 GLPtr<GrGLBindFragmentInputLocationProc> fBindFragmentInputLocation;
cdalton626e1ff2015-06-12 13:56:46 -0700366
367 /* NV_framebuffer_mixed_samples */
vbuzinov08b4d292015-04-01 06:29:49 -0700368 GLPtr<GrGLCoverageModulationProc> fCoverageModulation;
cdalton626e1ff2015-06-12 13:56:46 -0700369
cdalton06604b92016-02-05 10:09:51 -0800370 /* EXT_multi_draw_indirect */
371 GLPtr<GrGLMultiDrawArraysIndirectProc> fMultiDrawArraysIndirect;
372 GLPtr<GrGLMultiDrawElementsIndirectProc> fMultiDrawElementsIndirect;
cdalton626e1ff2015-06-12 13:56:46 -0700373
374 /* NV_bindless_texture */
375 // We use the NVIDIA verson for now because it does not require dynamically uniform handles.
376 // We may switch the the ARB version and/or omit methods in the future.
377 GLPtr<GrGLGetTextureHandleProc> fGetTextureHandle;
378 GLPtr<GrGLGetTextureSamplerHandleProc> fGetTextureSamplerHandle;
379 GLPtr<GrGLMakeTextureHandleResidentProc> fMakeTextureHandleResident;
380 GLPtr<GrGLMakeTextureHandleNonResidentProc> fMakeTextureHandleNonResident;
381 GLPtr<GrGLGetImageHandleProc> fGetImageHandle;
382 GLPtr<GrGLMakeImageHandleResidentProc> fMakeImageHandleResident;
383 GLPtr<GrGLMakeImageHandleNonResidentProc> fMakeImageHandleNonResident;
384 GLPtr<GrGLIsTextureHandleResidentProc> fIsTextureHandleResident;
385 GLPtr<GrGLIsImageHandleResidentProc> fIsImageHandleResident;
386 GLPtr<GrGLUniformHandleui64Proc> fUniformHandleui64;
387 GLPtr<GrGLUniformHandleui64vProc> fUniformHandleui64v;
388 GLPtr<GrGLProgramUniformHandleui64Proc> fProgramUniformHandleui64;
389 GLPtr<GrGLProgramUniformHandleui64vProc> fProgramUniformHandleui64v;
390
391 /* EXT_direct_state_access */
392 // We use the EXT verson because it is more expansive and interacts with more extensions
393 // than the ARB or core (4.5) versions. We may switch and/or omit methods in the future.
394 GLPtr<GrGLTextureParameteriProc> fTextureParameteri;
395 GLPtr<GrGLTextureParameterivProc> fTextureParameteriv;
396 GLPtr<GrGLTextureParameterfProc> fTextureParameterf;
397 GLPtr<GrGLTextureParameterfvProc> fTextureParameterfv;
398 GLPtr<GrGLTextureImage1DProc> fTextureImage1D;
399 GLPtr<GrGLTextureImage2DProc> fTextureImage2D;
400 GLPtr<GrGLTextureSubImage1DProc> fTextureSubImage1D;
401 GLPtr<GrGLTextureSubImage2DProc> fTextureSubImage2D;
402 GLPtr<GrGLCopyTextureImage1DProc> fCopyTextureImage1D;
403 GLPtr<GrGLCopyTextureImage2DProc> fCopyTextureImage2D;
404 GLPtr<GrGLCopyTextureSubImage1DProc> fCopyTextureSubImage1D;
405 GLPtr<GrGLCopyTextureSubImage2DProc> fCopyTextureSubImage2D;
406 GLPtr<GrGLGetTextureImageProc> fGetTextureImage;
407 GLPtr<GrGLGetTextureParameterfvProc> fGetTextureParameterfv;
408 GLPtr<GrGLGetTextureParameterivProc> fGetTextureParameteriv;
409 GLPtr<GrGLGetTextureLevelParameterfvProc> fGetTextureLevelParameterfv;
410 GLPtr<GrGLGetTextureLevelParameterivProc> fGetTextureLevelParameteriv;
411 // OpenGL 1.2
412 GLPtr<GrGLTextureImage3DProc> fTextureImage3D;
413 GLPtr<GrGLTextureSubImage3DProc> fTextureSubImage3D;
414 GLPtr<GrGLCopyTextureSubImage3DProc> fCopyTextureSubImage3D;
415 GLPtr<GrGLCompressedTextureImage3DProc> fCompressedTextureImage3D;
416 GLPtr<GrGLCompressedTextureImage2DProc> fCompressedTextureImage2D;
417 GLPtr<GrGLCompressedTextureImage1DProc> fCompressedTextureImage1D;
418 GLPtr<GrGLCompressedTextureSubImage3DProc> fCompressedTextureSubImage3D;
419 GLPtr<GrGLCompressedTextureSubImage2DProc> fCompressedTextureSubImage2D;
420 GLPtr<GrGLCompressedTextureSubImage1DProc> fCompressedTextureSubImage1D;
421 GLPtr<GrGLGetCompressedTextureImageProc> fGetCompressedTextureImage;
422 // OpenGL 1.5
423 GLPtr<GrGLNamedBufferDataProc> fNamedBufferData;
424 GLPtr<GrGLNamedBufferSubDataProc> fNamedBufferSubData;
425 GLPtr<GrGLMapNamedBufferProc> fMapNamedBuffer;
426 GLPtr<GrGLUnmapNamedBufferProc> fUnmapNamedBuffer;
427 GLPtr<GrGLGetNamedBufferParameterivProc> fGetNamedBufferParameteriv;
428 GLPtr<GrGLGetNamedBufferPointervProc> fGetNamedBufferPointerv;
429 GLPtr<GrGLGetNamedBufferSubDataProc> fGetNamedBufferSubData;
430 // OpenGL 2.0
431 GLPtr<GrGLProgramUniform1fProc> fProgramUniform1f;
432 GLPtr<GrGLProgramUniform2fProc> fProgramUniform2f;
433 GLPtr<GrGLProgramUniform3fProc> fProgramUniform3f;
434 GLPtr<GrGLProgramUniform4fProc> fProgramUniform4f;
435 GLPtr<GrGLProgramUniform1iProc> fProgramUniform1i;
436 GLPtr<GrGLProgramUniform2iProc> fProgramUniform2i;
437 GLPtr<GrGLProgramUniform3iProc> fProgramUniform3i;
438 GLPtr<GrGLProgramUniform4iProc> fProgramUniform4i;
439 GLPtr<GrGLProgramUniform1fvProc> fProgramUniform1fv;
440 GLPtr<GrGLProgramUniform2fvProc> fProgramUniform2fv;
441 GLPtr<GrGLProgramUniform3fvProc> fProgramUniform3fv;
442 GLPtr<GrGLProgramUniform4fvProc> fProgramUniform4fv;
443 GLPtr<GrGLProgramUniform1ivProc> fProgramUniform1iv;
444 GLPtr<GrGLProgramUniform2ivProc> fProgramUniform2iv;
445 GLPtr<GrGLProgramUniform3ivProc> fProgramUniform3iv;
446 GLPtr<GrGLProgramUniform4ivProc> fProgramUniform4iv;
447 GLPtr<GrGLProgramUniformMatrix2fvProc> fProgramUniformMatrix2fv;
448 GLPtr<GrGLProgramUniformMatrix3fvProc> fProgramUniformMatrix3fv;
449 GLPtr<GrGLProgramUniformMatrix4fvProc> fProgramUniformMatrix4fv;
450 // OpenGL 2.1
451 GLPtr<GrGLProgramUniformMatrix2x3fvProc> fProgramUniformMatrix2x3fv;
452 GLPtr<GrGLProgramUniformMatrix3x2fvProc> fProgramUniformMatrix3x2fv;
453 GLPtr<GrGLProgramUniformMatrix2x4fvProc> fProgramUniformMatrix2x4fv;
454 GLPtr<GrGLProgramUniformMatrix4x2fvProc> fProgramUniformMatrix4x2fv;
455 GLPtr<GrGLProgramUniformMatrix3x4fvProc> fProgramUniformMatrix3x4fv;
456 GLPtr<GrGLProgramUniformMatrix4x3fvProc> fProgramUniformMatrix4x3fv;
457 // OpenGL 3.0
458 GLPtr<GrGLNamedRenderbufferStorageProc> fNamedRenderbufferStorage;
459 GLPtr<GrGLGetNamedRenderbufferParameterivProc> fGetNamedRenderbufferParameteriv;
460 GLPtr<GrGLNamedRenderbufferStorageMultisampleProc> fNamedRenderbufferStorageMultisample;
461 GLPtr<GrGLCheckNamedFramebufferStatusProc> fCheckNamedFramebufferStatus;
462 GLPtr<GrGLNamedFramebufferTexture1DProc> fNamedFramebufferTexture1D;
463 GLPtr<GrGLNamedFramebufferTexture2DProc> fNamedFramebufferTexture2D;
464 GLPtr<GrGLNamedFramebufferTexture3DProc> fNamedFramebufferTexture3D;
465 GLPtr<GrGLNamedFramebufferRenderbufferProc> fNamedFramebufferRenderbuffer;
466 GLPtr<GrGLGetNamedFramebufferAttachmentParameterivProc> fGetNamedFramebufferAttachmentParameteriv;
467 GLPtr<GrGLGenerateTextureMipmapProc> fGenerateTextureMipmap;
468 GLPtr<GrGLFramebufferDrawBufferProc> fFramebufferDrawBuffer;
469 GLPtr<GrGLFramebufferDrawBuffersProc> fFramebufferDrawBuffers;
470 GLPtr<GrGLFramebufferReadBufferProc> fFramebufferReadBuffer;
471 GLPtr<GrGLGetFramebufferParameterivProc> fGetFramebufferParameteriv;
472 GLPtr<GrGLNamedCopyBufferSubDataProc> fNamedCopyBufferSubData;
473 GLPtr<GrGLVertexArrayVertexOffsetProc> fVertexArrayVertexOffset;
474 GLPtr<GrGLVertexArrayColorOffsetProc> fVertexArrayColorOffset;
475 GLPtr<GrGLVertexArrayEdgeFlagOffsetProc> fVertexArrayEdgeFlagOffset;
476 GLPtr<GrGLVertexArrayIndexOffsetProc> fVertexArrayIndexOffset;
477 GLPtr<GrGLVertexArrayNormalOffsetProc> fVertexArrayNormalOffset;
478 GLPtr<GrGLVertexArrayTexCoordOffsetProc> fVertexArrayTexCoordOffset;
479 GLPtr<GrGLVertexArrayMultiTexCoordOffsetProc> fVertexArrayMultiTexCoordOffset;
480 GLPtr<GrGLVertexArrayFogCoordOffsetProc> fVertexArrayFogCoordOffset;
481 GLPtr<GrGLVertexArraySecondaryColorOffsetProc> fVertexArraySecondaryColorOffset;
482 GLPtr<GrGLVertexArrayVertexAttribOffsetProc> fVertexArrayVertexAttribOffset;
483 GLPtr<GrGLVertexArrayVertexAttribIOffsetProc> fVertexArrayVertexAttribIOffset;
484 GLPtr<GrGLEnableVertexArrayProc> fEnableVertexArray;
485 GLPtr<GrGLDisableVertexArrayProc> fDisableVertexArray;
486 GLPtr<GrGLEnableVertexArrayAttribProc> fEnableVertexArrayAttrib;
487 GLPtr<GrGLDisableVertexArrayAttribProc> fDisableVertexArrayAttrib;
488 GLPtr<GrGLGetVertexArrayIntegervProc> fGetVertexArrayIntegerv;
489 GLPtr<GrGLGetVertexArrayPointervProc> fGetVertexArrayPointerv;
490 GLPtr<GrGLGetVertexArrayIntegeri_vProc> fGetVertexArrayIntegeri_v;
491 GLPtr<GrGLGetVertexArrayPointeri_vProc> fGetVertexArrayPointeri_v;
492 GLPtr<GrGLMapNamedBufferRangeProc> fMapNamedBufferRange;
493 GLPtr<GrGLFlushMappedNamedBufferRangeProc> fFlushMappedNamedBufferRange;
494
495 /* KHR_debug */
496 GLPtr<GrGLDebugMessageControlProc> fDebugMessageControl;
497 GLPtr<GrGLDebugMessageInsertProc> fDebugMessageInsert;
498 GLPtr<GrGLDebugMessageCallbackProc> fDebugMessageCallback;
499 GLPtr<GrGLGetDebugMessageLogProc> fGetDebugMessageLog;
500 GLPtr<GrGLPushDebugGroupProc> fPushDebugGroup;
501 GLPtr<GrGLPopDebugGroupProc> fPopDebugGroup;
502 GLPtr<GrGLObjectLabelProc> fObjectLabel;
bsalomonb1a32ad2015-11-16 06:48:44 -0800503
504 /* EGL functions */
bsalomon7ea33f52015-11-22 14:51:00 -0800505 GLPtr<GrEGLCreateImageProc> fEGLCreateImage;
506 GLPtr<GrEGLDestroyImageProc> fEGLDestroyImage;
commit-bot@chromium.orgc72425a2014-01-21 16:09:18 +0000507 } fFunctions;
508
bsalomon@google.com56bfc5a2011-09-01 13:28:16 +0000509 // Per-GL func callback
510#if GR_GL_PER_GL_FUNC_CALLBACK
511 GrGLInterfaceCallbackProc fCallback;
512 GrGLInterfaceCallbackData fCallbackData;
513#endif
bsalomon944bcf02014-07-29 08:01:52 -0700514
515 // This exists for internal testing.
516 virtual void abandon() const {}
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000517};
twiz@google.com59a190b2011-03-14 21:23:01 +0000518
519#endif