GrGLInterface.h revision a9e795eab5f59a52d96b8fdc39351452835f5eb9
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 "GrGLFunctions.h"
12#include "GrGLExtensions.h"
13#include "SkRefCnt.h"
14
15////////////////////////////////////////////////////////////////////////////////
16
17/**
18 * 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
21 * passed to Create then a "default" GL interface is created. If the default is
22 * also NULL GrContext creation will fail.
23 *
24 * The default interface is returned by GrGLDefaultInterface. This function's
25 * implementation is platform-specific. Several have been provided, along with
26 * an implementation that simply returns NULL.
27 *
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
31 */
32
33typedef void(*GrGLFuncPtr)();
34
35struct GrGLInterface;
36
37const GrGLInterface* GrGLDefaultInterface();
38
39/**
40 * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows,
41 * GLX on linux, AGL on Mac). The interface is only valid for the GL context
42 * that is current when the interface is created.
43 */
44SK_API const GrGLInterface* GrGLCreateNativeInterface();
45
46#if GR_GL_PER_GL_FUNC_CALLBACK
47typedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*);
48typedef intptr_t GrGLInterfaceCallbackData;
49#endif
50
51/**
52 * Creates a null GrGLInterface that doesn't draw anything. Used for measuring
53 * CPU overhead. TODO: We would like to move this to tools/gpu/gl/null but currently
54 * Chromium is using it in its unit tests.
55 */
56const SK_API GrGLInterface* GrGLCreateNullInterface(bool enableNVPR = false);
57
58/** Function that returns a new interface identical to "interface" but with support for
59    test version of GL_EXT_debug_marker. */
60const GrGLInterface* GrGLInterfaceAddTestDebugMarker(const GrGLInterface*,
61                                                     GrGLInsertEventMarkerProc insertEventMarkerFn,
62                                                     GrGLPushGroupMarkerProc pushGroupMarkerFn,
63                                                     GrGLPopGroupMarkerProc popGroupMarkerFn);
64
65/**
66 * GrContext uses the following interface to make all calls into OpenGL. When a
67 * GrContext is created it is given a GrGLInterface. The interface's function
68 * pointers must be valid for the OpenGL context associated with the GrContext.
69 * On some platforms, such as Windows, function pointers for OpenGL extensions
70 * may vary between OpenGL contexts. So the caller must be careful to use a
71 * GrGLInterface initialized for the correct context. All functions that should
72 * be available based on the OpenGL's version and extension string must be
73 * non-NULL or GrContext creation will fail. This can be tested with the
74 * validate() method when the OpenGL context has been made current.
75 */
76struct SK_API GrGLInterface : public SkRefCnt {
77private:
78    typedef SkRefCnt INHERITED;
79
80public:
81    GrGLInterface();
82
83    static GrGLInterface* NewClone(const GrGLInterface*);
84
85    // Validates that the GrGLInterface supports its advertised standard. This means the necessary
86    // function pointers have been initialized for both the GL version and any advertised
87    // extensions.
88    bool validate() const;
89
90    // Indicates the type of GL implementation
91    union {
92        GrGLStandard fStandard;
93        GrGLStandard fBindingsExported; // Legacy name, will be remove when Chromium is updated.
94    };
95
96    GrGLExtensions fExtensions;
97
98    bool hasExtension(const char ext[]) const { return fExtensions.has(ext); }
99
100    /**
101     * The function pointers are in a struct so that we can have a compiler generated assignment
102     * operator.
103     */
104    struct Functions {
105        GrGLFunction<GrGLActiveTextureProc> fActiveTexture;
106        GrGLFunction<GrGLAttachShaderProc> fAttachShader;
107        GrGLFunction<GrGLBeginQueryProc> fBeginQuery;
108        GrGLFunction<GrGLBindAttribLocationProc> fBindAttribLocation;
109        GrGLFunction<GrGLBindBufferProc> fBindBuffer;
110        GrGLFunction<GrGLBindFragDataLocationProc> fBindFragDataLocation;
111        GrGLFunction<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed;
112        GrGLFunction<GrGLBindFramebufferProc> fBindFramebuffer;
113        GrGLFunction<GrGLBindRenderbufferProc> fBindRenderbuffer;
114        GrGLFunction<GrGLBindTextureProc> fBindTexture;
115        GrGLFunction<GrGLBindImageTextureProc> fBindImageTexture;
116        GrGLFunction<GrGLBindVertexArrayProc> fBindVertexArray;
117        GrGLFunction<GrGLBlendBarrierProc> fBlendBarrier;
118        GrGLFunction<GrGLBlendColorProc> fBlendColor;
119        GrGLFunction<GrGLBlendEquationProc> fBlendEquation;
120        GrGLFunction<GrGLBlendFuncProc> fBlendFunc;
121        GrGLFunction<GrGLBlitFramebufferProc> fBlitFramebuffer;
122        GrGLFunction<GrGLBufferDataProc> fBufferData;
123        GrGLFunction<GrGLBufferSubDataProc> fBufferSubData;
124        GrGLFunction<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus;
125        GrGLFunction<GrGLClearProc> fClear;
126        GrGLFunction<GrGLClearColorProc> fClearColor;
127        GrGLFunction<GrGLClearStencilProc> fClearStencil;
128        GrGLFunction<GrGLColorMaskProc> fColorMask;
129        GrGLFunction<GrGLCompileShaderProc> fCompileShader;
130        GrGLFunction<GrGLCompressedTexImage2DProc> fCompressedTexImage2D;
131        GrGLFunction<GrGLCompressedTexSubImage2DProc> fCompressedTexSubImage2D;
132        GrGLFunction<GrGLCopyTexSubImage2DProc> fCopyTexSubImage2D;
133        GrGLFunction<GrGLCreateProgramProc> fCreateProgram;
134        GrGLFunction<GrGLCreateShaderProc> fCreateShader;
135        GrGLFunction<GrGLCullFaceProc> fCullFace;
136        GrGLFunction<GrGLDeleteBuffersProc> fDeleteBuffers;
137        GrGLFunction<GrGLDeleteFramebuffersProc> fDeleteFramebuffers;
138        GrGLFunction<GrGLDeleteProgramProc> fDeleteProgram;
139        GrGLFunction<GrGLDeleteQueriesProc> fDeleteQueries;
140        GrGLFunction<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers;
141        GrGLFunction<GrGLDeleteShaderProc> fDeleteShader;
142        GrGLFunction<GrGLDeleteTexturesProc> fDeleteTextures;
143        GrGLFunction<GrGLDeleteVertexArraysProc> fDeleteVertexArrays;
144        GrGLFunction<GrGLDepthMaskProc> fDepthMask;
145        GrGLFunction<GrGLDisableProc> fDisable;
146        GrGLFunction<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray;
147        GrGLFunction<GrGLDrawArraysProc> fDrawArrays;
148        GrGLFunction<GrGLDrawArraysIndirectProc> fDrawArraysIndirect;
149        GrGLFunction<GrGLDrawArraysInstancedProc> fDrawArraysInstanced;
150        GrGLFunction<GrGLDrawBufferProc> fDrawBuffer;
151        GrGLFunction<GrGLDrawBuffersProc> fDrawBuffers;
152        GrGLFunction<GrGLDrawElementsProc> fDrawElements;
153        GrGLFunction<GrGLDrawElementsIndirectProc> fDrawElementsIndirect;
154        GrGLFunction<GrGLDrawElementsInstancedProc> fDrawElementsInstanced;
155        GrGLFunction<GrGLDrawRangeElementsProc> fDrawRangeElements;
156        GrGLFunction<GrGLEnableProc> fEnable;
157        GrGLFunction<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray;
158        GrGLFunction<GrGLEndQueryProc> fEndQuery;
159        GrGLFunction<GrGLFinishProc> fFinish;
160        GrGLFunction<GrGLFlushProc> fFlush;
161        GrGLFunction<GrGLFlushMappedBufferRangeProc> fFlushMappedBufferRange;
162        GrGLFunction<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer;
163        GrGLFunction<GrGLFramebufferTexture2DProc> fFramebufferTexture2D;
164        GrGLFunction<GrGLFramebufferTexture2DMultisampleProc> fFramebufferTexture2DMultisample;
165        GrGLFunction<GrGLFrontFaceProc> fFrontFace;
166        GrGLFunction<GrGLGenBuffersProc> fGenBuffers;
167        GrGLFunction<GrGLGenFramebuffersProc> fGenFramebuffers;
168        GrGLFunction<GrGLGenerateMipmapProc> fGenerateMipmap;
169        GrGLFunction<GrGLGenQueriesProc> fGenQueries;
170        GrGLFunction<GrGLGenRenderbuffersProc> fGenRenderbuffers;
171        GrGLFunction<GrGLGenTexturesProc> fGenTextures;
172        GrGLFunction<GrGLGenVertexArraysProc> fGenVertexArrays;
173        GrGLFunction<GrGLGetBufferParameterivProc> fGetBufferParameteriv;
174        GrGLFunction<GrGLGetErrorProc> fGetError;
175        GrGLFunction<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv;
176        GrGLFunction<GrGLGetIntegervProc> fGetIntegerv;
177        GrGLFunction<GrGLGetMultisamplefvProc> fGetMultisamplefv;
178        GrGLFunction<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v;
179        GrGLFunction<GrGLGetQueryObjectivProc> fGetQueryObjectiv;
180        GrGLFunction<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v;
181        GrGLFunction<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv;
182        GrGLFunction<GrGLGetQueryivProc> fGetQueryiv;
183        GrGLFunction<GrGLGetProgramInfoLogProc> fGetProgramInfoLog;
184        GrGLFunction<GrGLGetProgramivProc> fGetProgramiv;
185        GrGLFunction<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv;
186        GrGLFunction<GrGLGetShaderInfoLogProc> fGetShaderInfoLog;
187        GrGLFunction<GrGLGetShaderivProc> fGetShaderiv;
188        GrGLFunction<GrGLGetShaderPrecisionFormatProc> fGetShaderPrecisionFormat;
189        GrGLFunction<GrGLGetStringProc> fGetString;
190        GrGLFunction<GrGLGetStringiProc> fGetStringi;
191        GrGLFunction<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv;
192        GrGLFunction<GrGLGetUniformLocationProc> fGetUniformLocation;
193        GrGLFunction<GrGLInsertEventMarkerProc> fInsertEventMarker;
194        GrGLFunction<GrGLInvalidateBufferDataProc> fInvalidateBufferData;
195        GrGLFunction<GrGLInvalidateBufferSubDataProc> fInvalidateBufferSubData;
196        GrGLFunction<GrGLInvalidateFramebufferProc> fInvalidateFramebuffer;
197        GrGLFunction<GrGLInvalidateSubFramebufferProc> fInvalidateSubFramebuffer;
198        GrGLFunction<GrGLInvalidateTexImageProc> fInvalidateTexImage;
199        GrGLFunction<GrGLInvalidateTexSubImageProc> fInvalidateTexSubImage;
200        GrGLFunction<GrGLIsTextureProc> fIsTexture;
201        GrGLFunction<GrGLLineWidthProc> fLineWidth;
202        GrGLFunction<GrGLLinkProgramProc> fLinkProgram;
203        GrGLFunction<GrGLMapBufferProc> fMapBuffer;
204        GrGLFunction<GrGLMapBufferRangeProc> fMapBufferRange;
205        GrGLFunction<GrGLMapBufferSubDataProc> fMapBufferSubData;
206        GrGLFunction<GrGLMapTexSubImage2DProc> fMapTexSubImage2D;
207        GrGLFunction<GrGLMemoryBarrierProc> fMemoryBarrier;
208        GrGLFunction<GrGLMemoryBarrierByRegionProc> fMemoryBarrierByRegion;
209        GrGLFunction<GrGLMultiDrawArraysIndirectProc> fMultiDrawArraysIndirect;
210        GrGLFunction<GrGLMultiDrawElementsIndirectProc> fMultiDrawElementsIndirect;
211        GrGLFunction<GrGLPixelStoreiProc> fPixelStorei;
212        GrGLFunction<GrGLPolygonModeProc> fPolygonMode;
213        GrGLFunction<GrGLPopGroupMarkerProc> fPopGroupMarker;
214        GrGLFunction<GrGLPushGroupMarkerProc> fPushGroupMarker;
215        GrGLFunction<GrGLQueryCounterProc> fQueryCounter;
216        GrGLFunction<GrGLRasterSamplesProc> fRasterSamples;
217        GrGLFunction<GrGLReadBufferProc> fReadBuffer;
218        GrGLFunction<GrGLReadPixelsProc> fReadPixels;
219        GrGLFunction<GrGLRenderbufferStorageProc> fRenderbufferStorage;
220
221        //  On OpenGL ES there are multiple incompatible extensions that add support for MSAA
222        //  and ES3 adds MSAA support to the standard. On an ES3 driver we may still use the
223        //  older extensions for performance reasons or due to ES3 driver bugs. We want the function
224        //  that creates the GrGLInterface to provide all available functions and internally
225        //  we will select among them. They all have a method called glRenderbufferStorageMultisample*.
226        //  So we have separate function pointers for GL_IMG/EXT_multisampled_to_texture,
227        //  GL_CHROMIUM/ANGLE_framebuffer_multisample/ES3, and GL_APPLE_framebuffer_multisample
228        //  variations.
229        //
230        //  If a driver supports multiple GL_ARB_framebuffer_multisample-style extensions then we will
231        //  assume the function pointers for the standard (or equivalent GL_ARB) version have
232        //  been preferred over GL_EXT, GL_CHROMIUM, or GL_ANGLE variations that have reduced
233        //  functionality.
234
235        //  GL_EXT_multisampled_render_to_texture (preferred) or GL_IMG_multisampled_render_to_texture
236        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2EXT;
237        //  GL_APPLE_framebuffer_multisample
238        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2APPLE;
239
240        //  This is used to store the pointer for GL_ARB/EXT/ANGLE/CHROMIUM_framebuffer_multisample or
241        //  the standard function in ES3+ or GL 3.0+.
242        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample;
243
244        // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension.
245        GrGLFunction<GrGLBindUniformLocationProc> fBindUniformLocation;
246
247        GrGLFunction<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer;
248        GrGLFunction<GrGLScissorProc> fScissor;
249        GrGLFunction<GrGLShaderSourceProc> fShaderSource;
250        GrGLFunction<GrGLStencilFuncProc> fStencilFunc;
251        GrGLFunction<GrGLStencilFuncSeparateProc> fStencilFuncSeparate;
252        GrGLFunction<GrGLStencilMaskProc> fStencilMask;
253        GrGLFunction<GrGLStencilMaskSeparateProc> fStencilMaskSeparate;
254        GrGLFunction<GrGLStencilOpProc> fStencilOp;
255        GrGLFunction<GrGLStencilOpSeparateProc> fStencilOpSeparate;
256        GrGLFunction<GrGLTexBufferProc> fTexBuffer;
257        GrGLFunction<GrGLTexBufferRangeProc> fTexBufferRange;
258        GrGLFunction<GrGLTexImage2DProc> fTexImage2D;
259        GrGLFunction<GrGLTexParameteriProc> fTexParameteri;
260        GrGLFunction<GrGLTexParameterivProc> fTexParameteriv;
261        GrGLFunction<GrGLTexSubImage2DProc> fTexSubImage2D;
262        GrGLFunction<GrGLTexStorage2DProc> fTexStorage2D;
263        GrGLFunction<GrGLTextureBarrierProc> fTextureBarrier;
264        GrGLFunction<GrGLDiscardFramebufferProc> fDiscardFramebuffer;
265        GrGLFunction<GrGLUniform1fProc> fUniform1f;
266        GrGLFunction<GrGLUniform1iProc> fUniform1i;
267        GrGLFunction<GrGLUniform1fvProc> fUniform1fv;
268        GrGLFunction<GrGLUniform1ivProc> fUniform1iv;
269        GrGLFunction<GrGLUniform2fProc> fUniform2f;
270        GrGLFunction<GrGLUniform2iProc> fUniform2i;
271        GrGLFunction<GrGLUniform2fvProc> fUniform2fv;
272        GrGLFunction<GrGLUniform2ivProc> fUniform2iv;
273        GrGLFunction<GrGLUniform3fProc> fUniform3f;
274        GrGLFunction<GrGLUniform3iProc> fUniform3i;
275        GrGLFunction<GrGLUniform3fvProc> fUniform3fv;
276        GrGLFunction<GrGLUniform3ivProc> fUniform3iv;
277        GrGLFunction<GrGLUniform4fProc> fUniform4f;
278        GrGLFunction<GrGLUniform4iProc> fUniform4i;
279        GrGLFunction<GrGLUniform4fvProc> fUniform4fv;
280        GrGLFunction<GrGLUniform4ivProc> fUniform4iv;
281        GrGLFunction<GrGLUniformMatrix2fvProc> fUniformMatrix2fv;
282        GrGLFunction<GrGLUniformMatrix3fvProc> fUniformMatrix3fv;
283        GrGLFunction<GrGLUniformMatrix4fvProc> fUniformMatrix4fv;
284        GrGLFunction<GrGLUnmapBufferProc> fUnmapBuffer;
285        GrGLFunction<GrGLUnmapBufferSubDataProc> fUnmapBufferSubData;
286        GrGLFunction<GrGLUnmapTexSubImage2DProc> fUnmapTexSubImage2D;
287        GrGLFunction<GrGLUseProgramProc> fUseProgram;
288        GrGLFunction<GrGLVertexAttrib1fProc> fVertexAttrib1f;
289        GrGLFunction<GrGLVertexAttrib2fvProc> fVertexAttrib2fv;
290        GrGLFunction<GrGLVertexAttrib3fvProc> fVertexAttrib3fv;
291        GrGLFunction<GrGLVertexAttrib4fvProc> fVertexAttrib4fv;
292        GrGLFunction<GrGLVertexAttribDivisorProc> fVertexAttribDivisor;
293        GrGLFunction<GrGLVertexAttribIPointerProc> fVertexAttribIPointer;
294        GrGLFunction<GrGLVertexAttribPointerProc> fVertexAttribPointer;
295        GrGLFunction<GrGLViewportProc> fViewport;
296
297        /* GL_NV_path_rendering */
298        GrGLFunction<GrGLMatrixLoadfProc> fMatrixLoadf;
299        GrGLFunction<GrGLMatrixLoadIdentityProc> fMatrixLoadIdentity;
300        GrGLFunction<GrGLGetProgramResourceLocationProc> fGetProgramResourceLocation;
301        GrGLFunction<GrGLPathCommandsProc> fPathCommands;
302        GrGLFunction<GrGLPathParameteriProc> fPathParameteri;
303        GrGLFunction<GrGLPathParameterfProc> fPathParameterf;
304        GrGLFunction<GrGLGenPathsProc> fGenPaths;
305        GrGLFunction<GrGLDeletePathsProc> fDeletePaths;
306        GrGLFunction<GrGLIsPathProc> fIsPath;
307        GrGLFunction<GrGLPathStencilFuncProc> fPathStencilFunc;
308        GrGLFunction<GrGLStencilFillPathProc> fStencilFillPath;
309        GrGLFunction<GrGLStencilStrokePathProc> fStencilStrokePath;
310        GrGLFunction<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced;
311        GrGLFunction<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced;
312        GrGLFunction<GrGLCoverFillPathProc> fCoverFillPath;
313        GrGLFunction<GrGLCoverStrokePathProc> fCoverStrokePath;
314        GrGLFunction<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced;
315        GrGLFunction<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced;
316        // NV_path_rendering v1.2
317        GrGLFunction<GrGLStencilThenCoverFillPathProc> fStencilThenCoverFillPath;
318        GrGLFunction<GrGLStencilThenCoverStrokePathProc> fStencilThenCoverStrokePath;
319        GrGLFunction<GrGLStencilThenCoverFillPathInstancedProc> fStencilThenCoverFillPathInstanced;
320        GrGLFunction<GrGLStencilThenCoverStrokePathInstancedProc> fStencilThenCoverStrokePathInstanced;
321        // NV_path_rendering v1.3
322        GrGLFunction<GrGLProgramPathFragmentInputGenProc> fProgramPathFragmentInputGen;
323        // CHROMIUM_path_rendering
324        GrGLFunction<GrGLBindFragmentInputLocationProc> fBindFragmentInputLocation;
325
326        /* NV_framebuffer_mixed_samples */
327        GrGLFunction<GrGLCoverageModulationProc> fCoverageModulation;
328
329        /* NV_bindless_texture */
330        // We use the NVIDIA verson for now because it does not require dynamically uniform handles.
331        // We may switch the the ARB version and/or omit methods in the future.
332        GrGLFunction<GrGLGetTextureHandleProc> fGetTextureHandle;
333        GrGLFunction<GrGLGetTextureSamplerHandleProc> fGetTextureSamplerHandle;
334        GrGLFunction<GrGLMakeTextureHandleResidentProc> fMakeTextureHandleResident;
335        GrGLFunction<GrGLMakeTextureHandleNonResidentProc> fMakeTextureHandleNonResident;
336        GrGLFunction<GrGLGetImageHandleProc> fGetImageHandle;
337        GrGLFunction<GrGLMakeImageHandleResidentProc> fMakeImageHandleResident;
338        GrGLFunction<GrGLMakeImageHandleNonResidentProc> fMakeImageHandleNonResident;
339        GrGLFunction<GrGLIsTextureHandleResidentProc> fIsTextureHandleResident;
340        GrGLFunction<GrGLIsImageHandleResidentProc> fIsImageHandleResident;
341        GrGLFunction<GrGLUniformHandleui64Proc> fUniformHandleui64;
342        GrGLFunction<GrGLUniformHandleui64vProc> fUniformHandleui64v;
343        GrGLFunction<GrGLProgramUniformHandleui64Proc> fProgramUniformHandleui64;
344        GrGLFunction<GrGLProgramUniformHandleui64vProc> fProgramUniformHandleui64v;
345
346        /* ARB_sample_shading */
347        GrGLFunction<GrGLMinSampleShadingProc> fMinSampleShading;
348
349        /* EXT_direct_state_access */
350        // We use the EXT verson because it is more expansive and interacts with more extensions
351        // than the ARB or core (4.5) versions. We may switch and/or omit methods in the future.
352        GrGLFunction<GrGLTextureParameteriProc> fTextureParameteri;
353        GrGLFunction<GrGLTextureParameterivProc> fTextureParameteriv;
354        GrGLFunction<GrGLTextureParameterfProc> fTextureParameterf;
355        GrGLFunction<GrGLTextureParameterfvProc> fTextureParameterfv;
356        GrGLFunction<GrGLTextureImage1DProc> fTextureImage1D;
357        GrGLFunction<GrGLTextureImage2DProc> fTextureImage2D;
358        GrGLFunction<GrGLTextureSubImage1DProc> fTextureSubImage1D;
359        GrGLFunction<GrGLTextureSubImage2DProc> fTextureSubImage2D;
360        GrGLFunction<GrGLCopyTextureImage1DProc> fCopyTextureImage1D;
361        GrGLFunction<GrGLCopyTextureImage2DProc> fCopyTextureImage2D;
362        GrGLFunction<GrGLCopyTextureSubImage1DProc> fCopyTextureSubImage1D;
363        GrGLFunction<GrGLCopyTextureSubImage2DProc> fCopyTextureSubImage2D;
364        GrGLFunction<GrGLGetTextureImageProc> fGetTextureImage;
365        GrGLFunction<GrGLGetTextureParameterfvProc> fGetTextureParameterfv;
366        GrGLFunction<GrGLGetTextureParameterivProc> fGetTextureParameteriv;
367        GrGLFunction<GrGLGetTextureLevelParameterfvProc> fGetTextureLevelParameterfv;
368        GrGLFunction<GrGLGetTextureLevelParameterivProc> fGetTextureLevelParameteriv;
369        // OpenGL 1.2
370        GrGLFunction<GrGLTextureImage3DProc> fTextureImage3D;
371        GrGLFunction<GrGLTextureSubImage3DProc> fTextureSubImage3D;
372        GrGLFunction<GrGLCopyTextureSubImage3DProc> fCopyTextureSubImage3D;
373        GrGLFunction<GrGLCompressedTextureImage3DProc> fCompressedTextureImage3D;
374        GrGLFunction<GrGLCompressedTextureImage2DProc> fCompressedTextureImage2D;
375        GrGLFunction<GrGLCompressedTextureImage1DProc> fCompressedTextureImage1D;
376        GrGLFunction<GrGLCompressedTextureSubImage3DProc> fCompressedTextureSubImage3D;
377        GrGLFunction<GrGLCompressedTextureSubImage2DProc> fCompressedTextureSubImage2D;
378        GrGLFunction<GrGLCompressedTextureSubImage1DProc> fCompressedTextureSubImage1D;
379        GrGLFunction<GrGLGetCompressedTextureImageProc> fGetCompressedTextureImage;
380        // OpenGL 1.5
381        GrGLFunction<GrGLNamedBufferDataProc> fNamedBufferData;
382        GrGLFunction<GrGLNamedBufferSubDataProc> fNamedBufferSubData;
383        GrGLFunction<GrGLMapNamedBufferProc> fMapNamedBuffer;
384        GrGLFunction<GrGLUnmapNamedBufferProc> fUnmapNamedBuffer;
385        GrGLFunction<GrGLGetNamedBufferParameterivProc> fGetNamedBufferParameteriv;
386        GrGLFunction<GrGLGetNamedBufferPointervProc> fGetNamedBufferPointerv;
387        GrGLFunction<GrGLGetNamedBufferSubDataProc> fGetNamedBufferSubData;
388        // OpenGL 2.0
389        GrGLFunction<GrGLProgramUniform1fProc> fProgramUniform1f;
390        GrGLFunction<GrGLProgramUniform2fProc> fProgramUniform2f;
391        GrGLFunction<GrGLProgramUniform3fProc> fProgramUniform3f;
392        GrGLFunction<GrGLProgramUniform4fProc> fProgramUniform4f;
393        GrGLFunction<GrGLProgramUniform1iProc> fProgramUniform1i;
394        GrGLFunction<GrGLProgramUniform2iProc> fProgramUniform2i;
395        GrGLFunction<GrGLProgramUniform3iProc> fProgramUniform3i;
396        GrGLFunction<GrGLProgramUniform4iProc> fProgramUniform4i;
397        GrGLFunction<GrGLProgramUniform1fvProc> fProgramUniform1fv;
398        GrGLFunction<GrGLProgramUniform2fvProc> fProgramUniform2fv;
399        GrGLFunction<GrGLProgramUniform3fvProc> fProgramUniform3fv;
400        GrGLFunction<GrGLProgramUniform4fvProc> fProgramUniform4fv;
401        GrGLFunction<GrGLProgramUniform1ivProc> fProgramUniform1iv;
402        GrGLFunction<GrGLProgramUniform2ivProc> fProgramUniform2iv;
403        GrGLFunction<GrGLProgramUniform3ivProc> fProgramUniform3iv;
404        GrGLFunction<GrGLProgramUniform4ivProc> fProgramUniform4iv;
405        GrGLFunction<GrGLProgramUniformMatrix2fvProc> fProgramUniformMatrix2fv;
406        GrGLFunction<GrGLProgramUniformMatrix3fvProc> fProgramUniformMatrix3fv;
407        GrGLFunction<GrGLProgramUniformMatrix4fvProc> fProgramUniformMatrix4fv;
408        // OpenGL 2.1
409        GrGLFunction<GrGLProgramUniformMatrix2x3fvProc> fProgramUniformMatrix2x3fv;
410        GrGLFunction<GrGLProgramUniformMatrix3x2fvProc> fProgramUniformMatrix3x2fv;
411        GrGLFunction<GrGLProgramUniformMatrix2x4fvProc> fProgramUniformMatrix2x4fv;
412        GrGLFunction<GrGLProgramUniformMatrix4x2fvProc> fProgramUniformMatrix4x2fv;
413        GrGLFunction<GrGLProgramUniformMatrix3x4fvProc> fProgramUniformMatrix3x4fv;
414        GrGLFunction<GrGLProgramUniformMatrix4x3fvProc> fProgramUniformMatrix4x3fv;
415        // OpenGL 3.0
416        GrGLFunction<GrGLNamedRenderbufferStorageProc> fNamedRenderbufferStorage;
417        GrGLFunction<GrGLGetNamedRenderbufferParameterivProc> fGetNamedRenderbufferParameteriv;
418        GrGLFunction<GrGLNamedRenderbufferStorageMultisampleProc> fNamedRenderbufferStorageMultisample;
419        GrGLFunction<GrGLCheckNamedFramebufferStatusProc> fCheckNamedFramebufferStatus;
420        GrGLFunction<GrGLNamedFramebufferTexture1DProc> fNamedFramebufferTexture1D;
421        GrGLFunction<GrGLNamedFramebufferTexture2DProc> fNamedFramebufferTexture2D;
422        GrGLFunction<GrGLNamedFramebufferTexture3DProc> fNamedFramebufferTexture3D;
423        GrGLFunction<GrGLNamedFramebufferRenderbufferProc> fNamedFramebufferRenderbuffer;
424        GrGLFunction<GrGLGetNamedFramebufferAttachmentParameterivProc> fGetNamedFramebufferAttachmentParameteriv;
425        GrGLFunction<GrGLGenerateTextureMipmapProc> fGenerateTextureMipmap;
426        GrGLFunction<GrGLFramebufferDrawBufferProc> fFramebufferDrawBuffer;
427        GrGLFunction<GrGLFramebufferDrawBuffersProc> fFramebufferDrawBuffers;
428        GrGLFunction<GrGLFramebufferReadBufferProc> fFramebufferReadBuffer;
429        GrGLFunction<GrGLGetFramebufferParameterivProc> fGetFramebufferParameteriv;
430        GrGLFunction<GrGLNamedCopyBufferSubDataProc> fNamedCopyBufferSubData;
431        GrGLFunction<GrGLVertexArrayVertexOffsetProc> fVertexArrayVertexOffset;
432        GrGLFunction<GrGLVertexArrayColorOffsetProc> fVertexArrayColorOffset;
433        GrGLFunction<GrGLVertexArrayEdgeFlagOffsetProc> fVertexArrayEdgeFlagOffset;
434        GrGLFunction<GrGLVertexArrayIndexOffsetProc> fVertexArrayIndexOffset;
435        GrGLFunction<GrGLVertexArrayNormalOffsetProc> fVertexArrayNormalOffset;
436        GrGLFunction<GrGLVertexArrayTexCoordOffsetProc> fVertexArrayTexCoordOffset;
437        GrGLFunction<GrGLVertexArrayMultiTexCoordOffsetProc> fVertexArrayMultiTexCoordOffset;
438        GrGLFunction<GrGLVertexArrayFogCoordOffsetProc> fVertexArrayFogCoordOffset;
439        GrGLFunction<GrGLVertexArraySecondaryColorOffsetProc> fVertexArraySecondaryColorOffset;
440        GrGLFunction<GrGLVertexArrayVertexAttribOffsetProc> fVertexArrayVertexAttribOffset;
441        GrGLFunction<GrGLVertexArrayVertexAttribIOffsetProc> fVertexArrayVertexAttribIOffset;
442        GrGLFunction<GrGLEnableVertexArrayProc> fEnableVertexArray;
443        GrGLFunction<GrGLDisableVertexArrayProc> fDisableVertexArray;
444        GrGLFunction<GrGLEnableVertexArrayAttribProc> fEnableVertexArrayAttrib;
445        GrGLFunction<GrGLDisableVertexArrayAttribProc> fDisableVertexArrayAttrib;
446        GrGLFunction<GrGLGetVertexArrayIntegervProc> fGetVertexArrayIntegerv;
447        GrGLFunction<GrGLGetVertexArrayPointervProc> fGetVertexArrayPointerv;
448        GrGLFunction<GrGLGetVertexArrayIntegeri_vProc> fGetVertexArrayIntegeri_v;
449        GrGLFunction<GrGLGetVertexArrayPointeri_vProc> fGetVertexArrayPointeri_v;
450        GrGLFunction<GrGLMapNamedBufferRangeProc> fMapNamedBufferRange;
451        GrGLFunction<GrGLFlushMappedNamedBufferRangeProc> fFlushMappedNamedBufferRange;
452        // OpenGL 3.1
453        GrGLFunction<GrGLTextureBufferProc> fTextureBuffer;
454
455        /* ARB_sync */
456        GrGLFunction<GrGLFenceSyncProc> fFenceSync;
457        GrGLFunction<GrGLClientWaitSyncProc> fClientWaitSync;
458        GrGLFunction<GrGLWaitSyncProc> fWaitSync;
459        GrGLFunction<GrGLDeleteSyncProc> fDeleteSync;
460
461        /* KHR_debug */
462        GrGLFunction<GrGLDebugMessageControlProc> fDebugMessageControl;
463        GrGLFunction<GrGLDebugMessageInsertProc> fDebugMessageInsert;
464        GrGLFunction<GrGLDebugMessageCallbackProc> fDebugMessageCallback;
465        GrGLFunction<GrGLGetDebugMessageLogProc> fGetDebugMessageLog;
466        GrGLFunction<GrGLPushDebugGroupProc> fPushDebugGroup;
467        GrGLFunction<GrGLPopDebugGroupProc> fPopDebugGroup;
468        GrGLFunction<GrGLObjectLabelProc> fObjectLabel;
469
470        /* EXT_window_rectangles */
471        GrGLFunction<GrGLWindowRectanglesProc> fWindowRectangles;
472
473        /* EGL functions */
474        GrGLFunction<GrEGLCreateImageProc> fEGLCreateImage;
475        GrGLFunction<GrEGLDestroyImageProc> fEGLDestroyImage;
476    } fFunctions;
477
478    // This exists for internal testing.
479    virtual void abandon() const {}
480};
481
482#endif
483