1/*
2 * 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.
6 */
7
8#ifndef GrGLInterface_DEFINED
9#define GrGLInterface_DEFINED
10
11#include "include/core/SkRefCnt.h"
12#include "include/gpu/gl/GrGLExtensions.h"
13#include "include/gpu/gl/GrGLFunctions.h"
14
15////////////////////////////////////////////////////////////////////////////////
16
17typedef void(*GrGLFuncPtr)();
18struct GrGLInterface;
19
20
21/**
22 * Rather than depend on platform-specific GL headers and libraries, we require
23 * the client to provide a struct of GL function pointers. This struct can be
24 * specified per-GrContext as a parameter to GrContext::MakeGL. If no interface is
25 * passed to MakeGL then a default GL interface is created using GrGLMakeNativeInterface().
26 * If this returns nullptr then GrContext::MakeGL() will fail.
27 *
28 * The implementation of GrGLMakeNativeInterface is platform-specific. Several
29 * implementations have been provided (for GLX, WGL, EGL, etc), along with an
30 * implementation that simply returns nullptr. Clients should select the most
31 * appropriate one to build.
32 */
33SK_API sk_sp<const GrGLInterface> GrGLMakeNativeInterface();
34// Deprecated alternative to GrGLMakeNativeInterface().
35SK_API const GrGLInterface* GrGLCreateNativeInterface();
36
37/**
38 * GrContext uses the following interface to make all calls into OpenGL. When a
39 * GrContext is created it is given a GrGLInterface. The interface's function
40 * pointers must be valid for the OpenGL context associated with the GrContext.
41 * On some platforms, such as Windows, function pointers for OpenGL extensions
42 * may vary between OpenGL contexts. So the caller must be careful to use a
43 * GrGLInterface initialized for the correct context. All functions that should
44 * be available based on the OpenGL's version and extension string must be
45 * non-NULL or GrContext creation will fail. This can be tested with the
46 * validate() method when the OpenGL context has been made current.
47 */
48struct SK_API GrGLInterface : public SkRefCnt {
49private:
50 typedef SkRefCnt INHERITED;
51
52#if GR_GL_CHECK_ERROR
53 // This is here to avoid having our debug code that checks for a GL error after most GL calls
54 // accidentally swallow an OOM that should be reported.
55 mutable bool fOOMed = false;
56 bool fSuppressErrorLogging = false;
57#endif
58
59public:
60 GrGLInterface();
61
62 // Validates that the GrGLInterface supports its advertised standard. This means the necessary
63 // function pointers have been initialized for both the GL version and any advertised
64 // extensions.
65 bool validate() const;
66
67#if GR_GL_CHECK_ERROR
68 GrGLenum checkError(const char* location, const char* call) const;
69 bool checkAndResetOOMed() const;
70 void suppressErrorLogging();
71#endif
72
73#if GR_TEST_UTILS
74 GrGLInterface(const GrGLInterface& that)
75 : fStandard(that.fStandard)
76 , fExtensions(that.fExtensions)
77 , fFunctions(that.fFunctions) {}
78#endif
79
80 // Indicates the type of GL implementation
81 union {
82 GrGLStandard fStandard;
83 GrGLStandard fBindingsExported; // Legacy name, will be remove when Chromium is updated.
84 };
85
86 GrGLExtensions fExtensions;
87
88 bool hasExtension(const char ext[]) const { return fExtensions.has(ext); }
89
90 /**
91 * The function pointers are in a struct so that we can have a compiler generated assignment
92 * operator.
93 */
94 struct Functions {
95 GrGLFunction<GrGLActiveTextureFn> fActiveTexture;
96 GrGLFunction<GrGLAttachShaderFn> fAttachShader;
97 GrGLFunction<GrGLBeginQueryFn> fBeginQuery;
98 GrGLFunction<GrGLBindAttribLocationFn> fBindAttribLocation;
99 GrGLFunction<GrGLBindBufferFn> fBindBuffer;
100 GrGLFunction<GrGLBindFragDataLocationFn> fBindFragDataLocation;
101 GrGLFunction<GrGLBindFragDataLocationIndexedFn> fBindFragDataLocationIndexed;
102 GrGLFunction<GrGLBindFramebufferFn> fBindFramebuffer;
103 GrGLFunction<GrGLBindRenderbufferFn> fBindRenderbuffer;
104 GrGLFunction<GrGLBindSamplerFn> fBindSampler;
105 GrGLFunction<GrGLBindTextureFn> fBindTexture;
106 GrGLFunction<GrGLBindVertexArrayFn> fBindVertexArray;
107 GrGLFunction<GrGLBlendBarrierFn> fBlendBarrier;
108 GrGLFunction<GrGLBlendColorFn> fBlendColor;
109 GrGLFunction<GrGLBlendEquationFn> fBlendEquation;
110 GrGLFunction<GrGLBlendFuncFn> fBlendFunc;
111 GrGLFunction<GrGLBlitFramebufferFn> fBlitFramebuffer;
112 GrGLFunction<GrGLBufferDataFn> fBufferData;
113 GrGLFunction<GrGLBufferSubDataFn> fBufferSubData;
114 GrGLFunction<GrGLCheckFramebufferStatusFn> fCheckFramebufferStatus;
115 GrGLFunction<GrGLClearFn> fClear;
116 GrGLFunction<GrGLClearColorFn> fClearColor;
117 GrGLFunction<GrGLClearStencilFn> fClearStencil;
118 GrGLFunction<GrGLClearTexImageFn> fClearTexImage;
119 GrGLFunction<GrGLClearTexSubImageFn> fClearTexSubImage;
120 GrGLFunction<GrGLColorMaskFn> fColorMask;
121 GrGLFunction<GrGLCompileShaderFn> fCompileShader;
122 GrGLFunction<GrGLCompressedTexImage2DFn> fCompressedTexImage2D;
123 GrGLFunction<GrGLCompressedTexSubImage2DFn> fCompressedTexSubImage2D;
124 GrGLFunction<GrGLCopyTexSubImage2DFn> fCopyTexSubImage2D;
125 GrGLFunction<GrGLCreateProgramFn> fCreateProgram;
126 GrGLFunction<GrGLCreateShaderFn> fCreateShader;
127 GrGLFunction<GrGLCullFaceFn> fCullFace;
128 GrGLFunction<GrGLDeleteBuffersFn> fDeleteBuffers;
129 GrGLFunction<GrGLDeleteFencesFn> fDeleteFences;
130 GrGLFunction<GrGLDeleteFramebuffersFn> fDeleteFramebuffers;
131 GrGLFunction<GrGLDeleteProgramFn> fDeleteProgram;
132 GrGLFunction<GrGLDeleteQueriesFn> fDeleteQueries;
133 GrGLFunction<GrGLDeleteRenderbuffersFn> fDeleteRenderbuffers;
134 GrGLFunction<GrGLDeleteSamplersFn> fDeleteSamplers;
135 GrGLFunction<GrGLDeleteShaderFn> fDeleteShader;
136 GrGLFunction<GrGLDeleteTexturesFn> fDeleteTextures;
137 GrGLFunction<GrGLDeleteVertexArraysFn> fDeleteVertexArrays;
138 GrGLFunction<GrGLDepthMaskFn> fDepthMask;
139 GrGLFunction<GrGLDisableFn> fDisable;
140 GrGLFunction<GrGLDisableVertexAttribArrayFn> fDisableVertexAttribArray;
141 GrGLFunction<GrGLDrawArraysFn> fDrawArrays;
142 GrGLFunction<GrGLDrawArraysIndirectFn> fDrawArraysIndirect;
143 GrGLFunction<GrGLDrawArraysInstancedFn> fDrawArraysInstanced;
144 GrGLFunction<GrGLDrawBufferFn> fDrawBuffer;
145 GrGLFunction<GrGLDrawBuffersFn> fDrawBuffers;
146 GrGLFunction<GrGLDrawElementsFn> fDrawElements;
147 GrGLFunction<GrGLDrawElementsIndirectFn> fDrawElementsIndirect;
148 GrGLFunction<GrGLDrawElementsInstancedFn> fDrawElementsInstanced;
149 GrGLFunction<GrGLDrawRangeElementsFn> fDrawRangeElements;
150 GrGLFunction<GrGLEnableFn> fEnable;
151 GrGLFunction<GrGLEnableVertexAttribArrayFn> fEnableVertexAttribArray;
152 GrGLFunction<GrGLEndQueryFn> fEndQuery;
153 GrGLFunction<GrGLFinishFn> fFinish;
154 GrGLFunction<GrGLFinishFenceFn> fFinishFence;
155 GrGLFunction<GrGLFlushFn> fFlush;
156 GrGLFunction<GrGLFlushMappedBufferRangeFn> fFlushMappedBufferRange;
157 GrGLFunction<GrGLFramebufferRenderbufferFn> fFramebufferRenderbuffer;
158 GrGLFunction<GrGLFramebufferTexture2DFn> fFramebufferTexture2D;
159 GrGLFunction<GrGLFramebufferTexture2DMultisampleFn> fFramebufferTexture2DMultisample;
160 GrGLFunction<GrGLFrontFaceFn> fFrontFace;
161 GrGLFunction<GrGLGenBuffersFn> fGenBuffers;
162 GrGLFunction<GrGLGenFencesFn> fGenFences;
163 GrGLFunction<GrGLGenFramebuffersFn> fGenFramebuffers;
164 GrGLFunction<GrGLGenerateMipmapFn> fGenerateMipmap;
165 GrGLFunction<GrGLGenQueriesFn> fGenQueries;
166 GrGLFunction<GrGLGenRenderbuffersFn> fGenRenderbuffers;
167 GrGLFunction<GrGLGenSamplersFn> fGenSamplers;
168 GrGLFunction<GrGLGenTexturesFn> fGenTextures;
169 GrGLFunction<GrGLGenVertexArraysFn> fGenVertexArrays;
170 GrGLFunction<GrGLGetBufferParameterivFn> fGetBufferParameteriv;
171 GrGLFunction<GrGLGetErrorFn> fGetError;
172 GrGLFunction<GrGLGetFramebufferAttachmentParameterivFn> fGetFramebufferAttachmentParameteriv;
173 GrGLFunction<GrGLGetIntegervFn> fGetIntegerv;
174 GrGLFunction<GrGLGetMultisamplefvFn> fGetMultisamplefv;
175 GrGLFunction<GrGLGetProgramBinaryFn> fGetProgramBinary;
176 GrGLFunction<GrGLGetProgramInfoLogFn> fGetProgramInfoLog;
177 GrGLFunction<GrGLGetProgramivFn> fGetProgramiv;
178 GrGLFunction<GrGLGetQueryObjecti64vFn> fGetQueryObjecti64v;
179 GrGLFunction<GrGLGetQueryObjectivFn> fGetQueryObjectiv;
180 GrGLFunction<GrGLGetQueryObjectui64vFn> fGetQueryObjectui64v;
181 GrGLFunction<GrGLGetQueryObjectuivFn> fGetQueryObjectuiv;
182 GrGLFunction<GrGLGetQueryivFn> fGetQueryiv;
183 GrGLFunction<GrGLGetRenderbufferParameterivFn> fGetRenderbufferParameteriv;
184 GrGLFunction<GrGLGetShaderInfoLogFn> fGetShaderInfoLog;
185 GrGLFunction<GrGLGetShaderivFn> fGetShaderiv;
186 GrGLFunction<GrGLGetShaderPrecisionFormatFn> fGetShaderPrecisionFormat;
187 GrGLFunction<GrGLGetStringFn> fGetString;
188 GrGLFunction<GrGLGetStringiFn> fGetStringi;
189 GrGLFunction<GrGLGetTexLevelParameterivFn> fGetTexLevelParameteriv;
190 GrGLFunction<GrGLGetUniformLocationFn> fGetUniformLocation;
191 GrGLFunction<GrGLInsertEventMarkerFn> fInsertEventMarker;
192 GrGLFunction<GrGLInvalidateBufferDataFn> fInvalidateBufferData;
193 GrGLFunction<GrGLInvalidateBufferSubDataFn> fInvalidateBufferSubData;
194 GrGLFunction<GrGLInvalidateFramebufferFn> fInvalidateFramebuffer;
195 GrGLFunction<GrGLInvalidateSubFramebufferFn> fInvalidateSubFramebuffer;
196 GrGLFunction<GrGLInvalidateTexImageFn> fInvalidateTexImage;
197 GrGLFunction<GrGLInvalidateTexSubImageFn> fInvalidateTexSubImage;
198 GrGLFunction<GrGLIsTextureFn> fIsTexture;
199 GrGLFunction<GrGLLineWidthFn> fLineWidth;
200 GrGLFunction<GrGLLinkProgramFn> fLinkProgram;
201 GrGLFunction<GrGLProgramBinaryFn> fProgramBinary;
202 GrGLFunction<GrGLProgramParameteriFn> fProgramParameteri;
203 GrGLFunction<GrGLMapBufferFn> fMapBuffer;
204 GrGLFunction<GrGLMapBufferRangeFn> fMapBufferRange;
205 GrGLFunction<GrGLMapBufferSubDataFn> fMapBufferSubData;
206 GrGLFunction<GrGLMapTexSubImage2DFn> fMapTexSubImage2D;
207 GrGLFunction<GrGLMemoryBarrierFn> fMemoryBarrier;
208 GrGLFunction<GrGLDrawArraysInstancedBaseInstanceFn> fDrawArraysInstancedBaseInstance;
209 GrGLFunction<GrGLDrawElementsInstancedBaseVertexBaseInstanceFn> fDrawElementsInstancedBaseVertexBaseInstance;
210 GrGLFunction<GrGLMultiDrawArraysIndirectFn> fMultiDrawArraysIndirect;
211 GrGLFunction<GrGLMultiDrawElementsIndirectFn> fMultiDrawElementsIndirect;
212 GrGLFunction<GrGLMultiDrawArraysInstancedBaseInstanceFn> fMultiDrawArraysInstancedBaseInstance;
213 GrGLFunction<GrGLMultiDrawElementsInstancedBaseVertexBaseInstanceFn> fMultiDrawElementsInstancedBaseVertexBaseInstance;
214 GrGLFunction<GrGLPatchParameteriFn> fPatchParameteri;
215 GrGLFunction<GrGLPixelStoreiFn> fPixelStorei;
216 GrGLFunction<GrGLPolygonModeFn> fPolygonMode;
217 GrGLFunction<GrGLPopGroupMarkerFn> fPopGroupMarker;
218 GrGLFunction<GrGLPushGroupMarkerFn> fPushGroupMarker;
219 GrGLFunction<GrGLQueryCounterFn> fQueryCounter;
220 GrGLFunction<GrGLReadBufferFn> fReadBuffer;
221 GrGLFunction<GrGLReadPixelsFn> fReadPixels;
222 GrGLFunction<GrGLRenderbufferStorageFn> fRenderbufferStorage;
223
224 // On OpenGL ES there are multiple incompatible extensions that add support for MSAA
225 // and ES3 adds MSAA support to the standard. On an ES3 driver we may still use the
226 // older extensions for performance reasons or due to ES3 driver bugs. We want the function
227 // that creates the GrGLInterface to provide all available functions and internally
228 // we will select among them. They all have a method called glRenderbufferStorageMultisample*.
229 // So we have separate function pointers for GL_IMG/EXT_multisampled_to_texture,
230 // GL_CHROMIUM/ANGLE_framebuffer_multisample/ES3, and GL_APPLE_framebuffer_multisample
231 // variations.
232 //
233 // If a driver supports multiple GL_ARB_framebuffer_multisample-style extensions then we will
234 // assume the function pointers for the standard (or equivalent GL_ARB) version have
235 // been preferred over GL_EXT, GL_CHROMIUM, or GL_ANGLE variations that have reduced
236 // functionality.
237
238 // GL_EXT_multisampled_render_to_texture (preferred) or GL_IMG_multisampled_render_to_texture
239 GrGLFunction<GrGLRenderbufferStorageMultisampleFn> fRenderbufferStorageMultisampleES2EXT;
240 // GL_APPLE_framebuffer_multisample
241 GrGLFunction<GrGLRenderbufferStorageMultisampleFn> fRenderbufferStorageMultisampleES2APPLE;
242
243 // This is used to store the pointer for GL_ARB/EXT/ANGLE/CHROMIUM_framebuffer_multisample or
244 // the standard function in ES3+ or GL 3.0+.
245 GrGLFunction<GrGLRenderbufferStorageMultisampleFn> fRenderbufferStorageMultisample;
246
247 // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension.
248 GrGLFunction<GrGLBindUniformLocationFn> fBindUniformLocation;
249
250 GrGLFunction<GrGLResolveMultisampleFramebufferFn> fResolveMultisampleFramebuffer;
251 GrGLFunction<GrGLSamplerParameteriFn> fSamplerParameteri;
252 GrGLFunction<GrGLSamplerParameterivFn> fSamplerParameteriv;
253 GrGLFunction<GrGLScissorFn> fScissor;
254 GrGLFunction<GrGLSetFenceFn> fSetFence;
255 GrGLFunction<GrGLShaderSourceFn> fShaderSource;
256 GrGLFunction<GrGLStencilFuncFn> fStencilFunc;
257 GrGLFunction<GrGLStencilFuncSeparateFn> fStencilFuncSeparate;
258 GrGLFunction<GrGLStencilMaskFn> fStencilMask;
259 GrGLFunction<GrGLStencilMaskSeparateFn> fStencilMaskSeparate;
260 GrGLFunction<GrGLStencilOpFn> fStencilOp;
261 GrGLFunction<GrGLStencilOpSeparateFn> fStencilOpSeparate;
262 GrGLFunction<GrGLTestFenceFn> fTestFence;
263 GrGLFunction<GrGLTexBufferFn> fTexBuffer;
264 GrGLFunction<GrGLTexBufferRangeFn> fTexBufferRange;
265 GrGLFunction<GrGLTexImage2DFn> fTexImage2D;
266 GrGLFunction<GrGLTexParameterfFn> fTexParameterf;
267 GrGLFunction<GrGLTexParameterfvFn> fTexParameterfv;
268 GrGLFunction<GrGLTexParameteriFn> fTexParameteri;
269 GrGLFunction<GrGLTexParameterivFn> fTexParameteriv;
270 GrGLFunction<GrGLTexSubImage2DFn> fTexSubImage2D;
271 GrGLFunction<GrGLTexStorage2DFn> fTexStorage2D;
272 GrGLFunction<GrGLTextureBarrierFn> fTextureBarrier;
273 GrGLFunction<GrGLDiscardFramebufferFn> fDiscardFramebuffer;
274 GrGLFunction<GrGLUniform1fFn> fUniform1f;
275 GrGLFunction<GrGLUniform1iFn> fUniform1i;
276 GrGLFunction<GrGLUniform1fvFn> fUniform1fv;
277 GrGLFunction<GrGLUniform1ivFn> fUniform1iv;
278 GrGLFunction<GrGLUniform2fFn> fUniform2f;
279 GrGLFunction<GrGLUniform2iFn> fUniform2i;
280 GrGLFunction<GrGLUniform2fvFn> fUniform2fv;
281 GrGLFunction<GrGLUniform2ivFn> fUniform2iv;
282 GrGLFunction<GrGLUniform3fFn> fUniform3f;
283 GrGLFunction<GrGLUniform3iFn> fUniform3i;
284 GrGLFunction<GrGLUniform3fvFn> fUniform3fv;
285 GrGLFunction<GrGLUniform3ivFn> fUniform3iv;
286 GrGLFunction<GrGLUniform4fFn> fUniform4f;
287 GrGLFunction<GrGLUniform4iFn> fUniform4i;
288 GrGLFunction<GrGLUniform4fvFn> fUniform4fv;
289 GrGLFunction<GrGLUniform4ivFn> fUniform4iv;
290 GrGLFunction<GrGLUniformMatrix2fvFn> fUniformMatrix2fv;
291 GrGLFunction<GrGLUniformMatrix3fvFn> fUniformMatrix3fv;
292 GrGLFunction<GrGLUniformMatrix4fvFn> fUniformMatrix4fv;
293 GrGLFunction<GrGLUnmapBufferFn> fUnmapBuffer;
294 GrGLFunction<GrGLUnmapBufferSubDataFn> fUnmapBufferSubData;
295 GrGLFunction<GrGLUnmapTexSubImage2DFn> fUnmapTexSubImage2D;
296 GrGLFunction<GrGLUseProgramFn> fUseProgram;
297 GrGLFunction<GrGLVertexAttrib1fFn> fVertexAttrib1f;
298 GrGLFunction<GrGLVertexAttrib2fvFn> fVertexAttrib2fv;
299 GrGLFunction<GrGLVertexAttrib3fvFn> fVertexAttrib3fv;
300 GrGLFunction<GrGLVertexAttrib4fvFn> fVertexAttrib4fv;
301 GrGLFunction<GrGLVertexAttribDivisorFn> fVertexAttribDivisor;
302 GrGLFunction<GrGLVertexAttribIPointerFn> fVertexAttribIPointer;
303 GrGLFunction<GrGLVertexAttribPointerFn> fVertexAttribPointer;
304 GrGLFunction<GrGLViewportFn> fViewport;
305
306 /* GL_NV_path_rendering */
307 GrGLFunction<GrGLMatrixLoadfFn> fMatrixLoadf;
308 GrGLFunction<GrGLMatrixLoadIdentityFn> fMatrixLoadIdentity;
309 GrGLFunction<GrGLGetProgramResourceLocationFn> fGetProgramResourceLocation;
310 GrGLFunction<GrGLPathCommandsFn> fPathCommands;
311 GrGLFunction<GrGLPathParameteriFn> fPathParameteri;
312 GrGLFunction<GrGLPathParameterfFn> fPathParameterf;
313 GrGLFunction<GrGLGenPathsFn> fGenPaths;
314 GrGLFunction<GrGLDeletePathsFn> fDeletePaths;
315 GrGLFunction<GrGLIsPathFn> fIsPath;
316 GrGLFunction<GrGLPathStencilFuncFn> fPathStencilFunc;
317 GrGLFunction<GrGLStencilFillPathFn> fStencilFillPath;
318 GrGLFunction<GrGLStencilStrokePathFn> fStencilStrokePath;
319 GrGLFunction<GrGLStencilFillPathInstancedFn> fStencilFillPathInstanced;
320 GrGLFunction<GrGLStencilStrokePathInstancedFn> fStencilStrokePathInstanced;
321 GrGLFunction<GrGLCoverFillPathFn> fCoverFillPath;
322 GrGLFunction<GrGLCoverStrokePathFn> fCoverStrokePath;
323 GrGLFunction<GrGLCoverFillPathInstancedFn> fCoverFillPathInstanced;
324 GrGLFunction<GrGLCoverStrokePathInstancedFn> fCoverStrokePathInstanced;
325 // NV_path_rendering v1.2
326 GrGLFunction<GrGLStencilThenCoverFillPathFn> fStencilThenCoverFillPath;
327 GrGLFunction<GrGLStencilThenCoverStrokePathFn> fStencilThenCoverStrokePath;
328 GrGLFunction<GrGLStencilThenCoverFillPathInstancedFn> fStencilThenCoverFillPathInstanced;
329 GrGLFunction<GrGLStencilThenCoverStrokePathInstancedFn> fStencilThenCoverStrokePathInstanced;
330 // NV_path_rendering v1.3
331 GrGLFunction<GrGLProgramPathFragmentInputGenFn> fProgramPathFragmentInputGen;
332 // CHROMIUM_path_rendering
333 GrGLFunction<GrGLBindFragmentInputLocationFn> fBindFragmentInputLocation;
334
335 /* NV_framebuffer_mixed_samples */
336 GrGLFunction<GrGLCoverageModulationFn> fCoverageModulation;
337
338 /* ARB_sync */
339 GrGLFunction<GrGLFenceSyncFn> fFenceSync;
340 GrGLFunction<GrGLIsSyncFn> fIsSync;
341 GrGLFunction<GrGLClientWaitSyncFn> fClientWaitSync;
342 GrGLFunction<GrGLWaitSyncFn> fWaitSync;
343 GrGLFunction<GrGLDeleteSyncFn> fDeleteSync;
344
345 /* ARB_internalforamt_query */
346 GrGLFunction<GrGLGetInternalformativFn> fGetInternalformativ;
347
348 /* KHR_debug */
349 GrGLFunction<GrGLDebugMessageControlFn> fDebugMessageControl;
350 GrGLFunction<GrGLDebugMessageInsertFn> fDebugMessageInsert;
351 GrGLFunction<GrGLDebugMessageCallbackFn> fDebugMessageCallback;
352 GrGLFunction<GrGLGetDebugMessageLogFn> fGetDebugMessageLog;
353 GrGLFunction<GrGLPushDebugGroupFn> fPushDebugGroup;
354 GrGLFunction<GrGLPopDebugGroupFn> fPopDebugGroup;
355 GrGLFunction<GrGLObjectLabelFn> fObjectLabel;
356
357 /* EXT_window_rectangles */
358 GrGLFunction<GrGLWindowRectanglesFn> fWindowRectangles;
359
360 /* GL_QCOM_tiled_rendering */
361 GrGLFunction<GrGLStartTilingFn> fStartTiling;
362 GrGLFunction<GrGLEndTilingFn> fEndTiling;
363 } fFunctions;
364
365#if GR_TEST_UTILS
366 // This exists for internal testing.
367 virtual void abandon() const;
368#endif
369};
370
371#endif
372