GrGLInterface.h revision 69c1b24bcaa7cffd59753a75a7f3d155696fcac4
17aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/*
27aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Copyright 2011 Google Inc.
37aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer *
47aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Use of this source code is governed by a BSD-style license that can be
57aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * found in the LICENSE file.
67aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer */
77aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
85d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey#ifndef GrGLInterface_DEFINED
95d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey#define GrGLInterface_DEFINED
1094bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser
115d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey#include "GrGLFunctions.h"
127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#include "GrGLExtensions.h"
137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#include "SkRefCnt.h"
147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer////////////////////////////////////////////////////////////////////////////////
167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/**
187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Rather than depend on platform-specific GL headers and libraries, we require
197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * the client to provide a struct of GL function pointers. This struct can be
207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * specified per-GrContext as a parameter to GrContext::Create. If NULL is
217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * passed to Create then a "default" GL interface is created. If the default is
227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * also NULL GrContext creation will fail.
23969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser *
249930061ce28b1fc60d267ae3474c74a41e655cd5Steven M. Gava * The default interface is returned by GrGLDefaultInterface. This function's
257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * implementation is platform-specific. Several have been provided, along with
267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * an implementation that simply returns NULL.
275d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey *
285d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey * By defining GR_GL_PER_GL_CALL_IFACE_CALLBACK to 1 the client can specify a
29969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser * callback function that will be called prior to each GL function call. See
30969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser * comments in GrGLConfig.h
315d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey */
325d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
335d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teytypedef void(*GrGLFuncPtr)();
345d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
355d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teystruct GrGLInterface;
365d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
375d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyconst GrGLInterface* GrGLDefaultInterface();
385d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
395d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey/**
405d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows,
415d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey * GLX on linux, AGL on Mac). The interface is only valid for the GL context
425d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey * that is current when the interface is created.
437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer */
447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David SchererSK_API const GrGLInterface* GrGLCreateNativeInterface();
457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#if SK_MESA
477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/**
487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Creates a GrGLInterface for an OSMesa context.
497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer */
507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David SchererSK_API const GrGLInterface* GrGLCreateMesaInterface();
517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#endif
527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#if SK_ANGLE
547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/**
557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Creates a GrGLInterface for an ANGLE context.
567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer */
577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David SchererSK_API const GrGLInterface* GrGLCreateANGLEInterface();
587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#endif
597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#if SK_COMMAND_BUFFER
617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/**
627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Creates a GrGLInterface for a Command Buffer context.
637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer */
647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David SchererSK_API const GrGLInterface* GrGLCreateCommandBufferInterface();
657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#endif
667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/**
687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Creates a null GrGLInterface that doesn't draw anything. Used for measuring
697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * CPU overhead.
707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer */
717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererconst SK_API GrGLInterface* GrGLCreateNullInterface();
727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/**
747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * Creates a debugging GrGLInterface that doesn't draw anything. Used for
757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * finding memory leaks and invalid memory accesses.
767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer */
777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererconst GrGLInterface* GrGLCreateDebugInterface();
787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#if GR_GL_PER_GL_FUNC_CALLBACK
807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherertypedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*);
817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherertypedef intptr_t GrGLInterfaceCallbackData;
827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#endif
837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/** Function that returns a new interface identical to "interface" but without support for
857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    GL_NV_path_rendering. */
867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererconst GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface*);
877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/** Function that returns a new interface identical to "interface" but with support for
897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    test version of GL_EXT_debug_marker. */
907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererconst GrGLInterface* GrGLInterfaceAddTestDebugMarker(const GrGLInterface*,
917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer                                                     GrGLInsertEventMarkerProc insertEventMarkerFn,
927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer                                                     GrGLPushGroupMarkerProc pushGroupMarkerFn,
937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer                                                     GrGLPopGroupMarkerProc popGroupMarkerFn);
947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer/**
967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * GrContext uses the following interface to make all calls into OpenGL. When a
977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * GrContext is created it is given a GrGLInterface. The interface's function
987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * pointers must be valid for the OpenGL context associated with the GrContext.
99669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser * On some platforms, such as Windows, function pointers for OpenGL extensions
100669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser * may vary between OpenGL contexts. So the caller must be careful to use a
1017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * GrGLInterface initialized for the correct context. All functions that should
1027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * be available based on the OpenGL's version and extension string must be
1037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer * non-NULL or GrContext creation will fail. This can be tested with the
104669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser * validate() method when the OpenGL context has been made current.
105669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser */
1067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererstruct SK_API GrGLInterface : public SkRefCnt {
1077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererprivate:
1087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    typedef SkRefCnt INHERITED;
1097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
1107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererpublic:
1117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    GrGLInterface();
1127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
1137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    static GrGLInterface* NewClone(const GrGLInterface*);
114669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser
115669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser    // Validates that the GrGLInterface supports its advertised standard. This means the necessary
116669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser    // function pointers have been initialized for both the GL version and any advertised
117669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser    // extensions.
118669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser    bool validate() const;
119669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser
1207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    // Indicates the type of GL implementation
1217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    union {
12283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLStandard fStandard;
1237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLStandard fBindingsExported; // Legacy name, will be remove when Chromium is updated.
1247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    };
1257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
1267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    GrGLExtensions fExtensions;
1277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
1287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    bool hasExtension(const char ext[]) const { return fExtensions.has(ext); }
1297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
1307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    /**
1317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer     * The function pointers are in a struct so that we can have a compiler generated assignment
1327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer     * operator.
1337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer     */
1347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    struct Functions {
1357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLActiveTextureProc> fActiveTexture;
1367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLAttachShaderProc> fAttachShader;
1377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLBeginQueryProc> fBeginQuery;
13883118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLBindAttribLocationProc> fBindAttribLocation;
139b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBindBufferProc> fBindBuffer;
140b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBindFragDataLocationProc> fBindFragDataLocation;
141b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed;
142b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBindFramebufferProc> fBindFramebuffer;
1437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLBindRenderbufferProc> fBindRenderbuffer;
1447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLBindTextureProc> fBindTexture;
1457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLBindVertexArrayProc> fBindVertexArray;
1467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLBlendBarrierProc> fBlendBarrier;
1477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLBlendColorProc> fBlendColor;
148b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBlendEquationProc> fBlendEquation;
149b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBlendFuncProc> fBlendFunc;
150b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBlitFramebufferProc> fBlitFramebuffer;
151b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBufferDataProc> fBufferData;
152b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLBufferSubDataProc> fBufferSubData;
153b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus;
154b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLClearProc> fClear;
155b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLClearColorProc> fClearColor;
156b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLClearStencilProc> fClearStencil;
157b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLColorMaskProc> fColorMask;
158b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLCompileShaderProc> fCompileShader;
159b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava        GrGLFunction<GrGLCompressedTexImage2DProc> fCompressedTexImage2D;
1607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCompressedTexSubImage2DProc> fCompressedTexSubImage2D;
1617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCopyTexSubImage2DProc> fCopyTexSubImage2D;
16283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLCreateProgramProc> fCreateProgram;
1637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCreateShaderProc> fCreateShader;
1647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCullFaceProc> fCullFace;
1657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteBuffersProc> fDeleteBuffers;
1667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteFramebuffersProc> fDeleteFramebuffers;
1677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteProgramProc> fDeleteProgram;
1687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteQueriesProc> fDeleteQueries;
1697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers;
1707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteShaderProc> fDeleteShader;
1717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteTexturesProc> fDeleteTextures;
1727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDeleteVertexArraysProc> fDeleteVertexArrays;
1737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDepthMaskProc> fDepthMask;
1747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDisableProc> fDisable;
1757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray;
1767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawArraysProc> fDrawArrays;
1777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawArraysIndirectProc> fDrawArraysIndirect;
1787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawArraysInstancedProc> fDrawArraysInstanced;
1797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawBufferProc> fDrawBuffer;
1807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawBuffersProc> fDrawBuffers;
1817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawElementsProc> fDrawElements;
1827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawElementsIndirectProc> fDrawElementsIndirect;
1837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDrawElementsInstancedProc> fDrawElementsInstanced;
1847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLEnableProc> fEnable;
1857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray;
1867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLEndQueryProc> fEndQuery;
1877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLFinishProc> fFinish;
18894bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLFlushProc> fFlush;
1897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLFlushMappedBufferRangeProc> fFlushMappedBufferRange;
1905d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer;
1915d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLFramebufferTexture2DProc> fFramebufferTexture2D;
1925d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLFramebufferTexture2DMultisampleProc> fFramebufferTexture2DMultisample;
1935d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLFrontFaceProc> fFrontFace;
1945d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGenBuffersProc> fGenBuffers;
1955d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGenFramebuffersProc> fGenFramebuffers;
1965d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGenerateMipmapProc> fGenerateMipmap;
1975d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGenQueriesProc> fGenQueries;
1985d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGenRenderbuffersProc> fGenRenderbuffers;
1995d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGenTexturesProc> fGenTextures;
2005d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGenVertexArraysProc> fGenVertexArrays;
2015d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetBufferParameterivProc> fGetBufferParameteriv;
2025d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetErrorProc> fGetError;
2035d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv;
2045d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetIntegervProc> fGetIntegerv;
2055d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetMultisamplefvProc> fGetMultisamplefv;
2065d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v;
2075d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetQueryObjectivProc> fGetQueryObjectiv;
2085d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v;
209969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser        GrGLFunction<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv;
2105d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetQueryivProc> fGetQueryiv;
211969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser        GrGLFunction<GrGLGetProgramInfoLogProc> fGetProgramInfoLog;
212969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser        GrGLFunction<GrGLGetProgramivProc> fGetProgramiv;
2135d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv;
214969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser        GrGLFunction<GrGLGetShaderInfoLogProc> fGetShaderInfoLog;
215969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser        GrGLFunction<GrGLGetShaderivProc> fGetShaderiv;
216969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser        GrGLFunction<GrGLGetShaderPrecisionFormatProc> fGetShaderPrecisionFormat;
2175d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetStringProc> fGetString;
2185d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetStringiProc> fGetStringi;
2195d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv;
2205d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetUniformLocationProc> fGetUniformLocation;
2215d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLInsertEventMarkerProc> fInsertEventMarker;
2225d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLInvalidateBufferDataProc> fInvalidateBufferData;
2235d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLInvalidateBufferSubDataProc> fInvalidateBufferSubData;
2245d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLInvalidateFramebufferProc> fInvalidateFramebuffer;
2255d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLInvalidateSubFramebufferProc> fInvalidateSubFramebuffer;
2265d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLInvalidateTexImageProc> fInvalidateTexImage;
2275d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLInvalidateTexSubImageProc> fInvalidateTexSubImage;
2285d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLIsTextureProc> fIsTexture;
2295d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLLineWidthProc> fLineWidth;
2305d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLLinkProgramProc> fLinkProgram;
2315d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLMapBufferProc> fMapBuffer;
2325d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLMapBufferRangeProc> fMapBufferRange;
2335d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLMapBufferSubDataProc> fMapBufferSubData;
2345d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLMapTexSubImage2DProc> fMapTexSubImage2D;
2355d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLPixelStoreiProc> fPixelStorei;
2365d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLPopGroupMarkerProc> fPopGroupMarker;
2375d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLPushGroupMarkerProc> fPushGroupMarker;
2385d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLQueryCounterProc> fQueryCounter;
2395d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLRasterSamplesProc> fRasterSamples;
2405d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLReadBufferProc> fReadBuffer;
2415d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLReadPixelsProc> fReadPixels;
2425d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLRenderbufferStorageProc> fRenderbufferStorage;
2435d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
2445d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  On OpenGL ES there are multiple incompatible extensions that add support for MSAA
2455d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  and ES3 adds MSAA support to the standard. On an ES3 driver we may still use the
2465d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  older extensions for performance reasons or due to ES3 driver bugs. We want the function
2475d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  that creates the GrGLInterface to provide all available functions and internally
2485d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  we will select among them. They all have a method called glRenderbufferStorageMultisample*.
2495d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  So we have separate function pointers for GL_IMG/EXT_multisampled_to_texture,
2505d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  GL_CHROMIUM/ANGLE_framebuffer_multisample/ES3, and GL_APPLE_framebuffer_multisample
2515d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  variations.
2525d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //
2535d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  If a driver supports multiple GL_ARB_framebuffer_multisample-style extensions then we will
2545d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  assume the function pointers for the standard (or equivalent GL_ARB) version have
2555d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  been preferred over GL_EXT, GL_CHROMIUM, or GL_ANGLE variations that have reduced
2565d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  functionality.
2575d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
2585d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  GL_EXT_multisampled_render_to_texture (preferred) or GL_IMG_multisampled_render_to_texture
2595d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2EXT;
2605d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  GL_APPLE_framebuffer_multisample
2615d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2APPLE;
2625d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
2635d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  This is used to store the pointer for GL_ARB/EXT/ANGLE/CHROMIUM_framebuffer_multisample or
2645d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        //  the standard function in ES3+ or GL 3.0+.
2655d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample;
2665d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
2675d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension.
2685d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLBindUniformLocationProc> fBindUniformLocation;
2695d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
2705d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer;
2715d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLScissorProc> fScissor;
2725d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLShaderSourceProc> fShaderSource;
2735d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLStencilFuncProc> fStencilFunc;
2745d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLStencilFuncSeparateProc> fStencilFuncSeparate;
2755d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLStencilMaskProc> fStencilMask;
2765d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLStencilMaskSeparateProc> fStencilMaskSeparate;
2775d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLStencilOpProc> fStencilOp;
2785d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLStencilOpSeparateProc> fStencilOpSeparate;
2795d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLTexImage2DProc> fTexImage2D;
2807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTexParameteriProc> fTexParameteri;
2817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTexParameterivProc> fTexParameteriv;
2827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTexSubImage2DProc> fTexSubImage2D;
28383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLTexStorage2DProc> fTexStorage2D;
2847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureBarrierProc> fTextureBarrier;
2857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDiscardFramebufferProc> fDiscardFramebuffer;
2867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform1fProc> fUniform1f;
2877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform1iProc> fUniform1i;
28883118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLUniform1fvProc> fUniform1fv;
2897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform1ivProc> fUniform1iv;
2907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform2fProc> fUniform2f;
2917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform2iProc> fUniform2i;
2927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform2fvProc> fUniform2fv;
2937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform2ivProc> fUniform2iv;
2947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform3fProc> fUniform3f;
2957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform3iProc> fUniform3i;
2967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform3fvProc> fUniform3fv;
2977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform3ivProc> fUniform3iv;
2987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform4fProc> fUniform4f;
2997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform4iProc> fUniform4i;
30083118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLUniform4fvProc> fUniform4fv;
3017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniform4ivProc> fUniform4iv;
3027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniformMatrix2fvProc> fUniformMatrix2fv;
30394bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLUniformMatrix3fvProc> fUniformMatrix3fv;
30494bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLUniformMatrix4fvProc> fUniformMatrix4fv;
30594bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLUnmapBufferProc> fUnmapBuffer;
30694bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLUnmapBufferSubDataProc> fUnmapBufferSubData;
30794bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLUnmapTexSubImage2DProc> fUnmapTexSubImage2D;
30894bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLUseProgramProc> fUseProgram;
30994bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLVertexAttrib1fProc> fVertexAttrib1f;
31094bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLVertexAttrib2fvProc> fVertexAttrib2fv;
3117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexAttrib3fvProc> fVertexAttrib3fv;
3127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexAttrib4fvProc> fVertexAttrib4fv;
31383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLVertexAttribDivisorProc> fVertexAttribDivisor;
3147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexAttribIPointerProc> fVertexAttribIPointer;
3157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexAttribPointerProc> fVertexAttribPointer;
3167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLViewportProc> fViewport;
3177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
3187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        /* GL_NV_path_rendering */
3197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMatrixLoadfProc> fMatrixLoadf;
3207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMatrixLoadIdentityProc> fMatrixLoadIdentity;
32183118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLGetProgramResourceLocationProc> fGetProgramResourceLocation;
32283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLPathCommandsProc> fPathCommands;
32383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLPathParameteriProc> fPathParameteri;
32483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLPathParameterfProc> fPathParameterf;
32583118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLGenPathsProc> fGenPaths;
32683118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLDeletePathsProc> fDeletePaths;
3277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLIsPathProc> fIsPath;
3287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLPathStencilFuncProc> fPathStencilFunc;
3297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilFillPathProc> fStencilFillPath;
3307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilStrokePathProc> fStencilStrokePath;
3317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced;
3327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced;
3337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCoverFillPathProc> fCoverFillPath;
3347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCoverStrokePathProc> fCoverStrokePath;
3357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced;
3367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced;
3377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // NV_path_rendering v1.2
3387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilThenCoverFillPathProc> fStencilThenCoverFillPath;
3397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilThenCoverStrokePathProc> fStencilThenCoverStrokePath;
3407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilThenCoverFillPathInstancedProc> fStencilThenCoverFillPathInstanced;
3417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLStencilThenCoverStrokePathInstancedProc> fStencilThenCoverStrokePathInstanced;
3427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // NV_path_rendering v1.3
3437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramPathFragmentInputGenProc> fProgramPathFragmentInputGen;
3447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // CHROMIUM_path_rendering
3457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLBindFragmentInputLocationProc> fBindFragmentInputLocation;
3467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
3477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        /* NV_framebuffer_mixed_samples */
3487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCoverageModulationProc> fCoverageModulation;
3497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
3507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        /* EXT_multi_draw_indirect */
3517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMultiDrawArraysIndirectProc> fMultiDrawArraysIndirect;
3527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMultiDrawElementsIndirectProc> fMultiDrawElementsIndirect;
3537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
3547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        /* NV_bindless_texture */
3557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // We use the NVIDIA verson for now because it does not require dynamically uniform handles.
3567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // We may switch the the ARB version and/or omit methods in the future.
3577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetTextureHandleProc> fGetTextureHandle;
3587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetTextureSamplerHandleProc> fGetTextureSamplerHandle;
3597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMakeTextureHandleResidentProc> fMakeTextureHandleResident;
3607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMakeTextureHandleNonResidentProc> fMakeTextureHandleNonResident;
36183118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLGetImageHandleProc> fGetImageHandle;
3627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMakeImageHandleResidentProc> fMakeImageHandleResident;
3637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMakeImageHandleNonResidentProc> fMakeImageHandleNonResident;
3647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLIsTextureHandleResidentProc> fIsTextureHandleResident;
3655d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLIsImageHandleResidentProc> fIsImageHandleResident;
3665d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLUniformHandleui64Proc> fUniformHandleui64;
3677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLUniformHandleui64vProc> fUniformHandleui64v;
3687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformHandleui64Proc> fProgramUniformHandleui64;
3697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformHandleui64vProc> fProgramUniformHandleui64v;
3707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
3717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        /* EXT_direct_state_access */
3727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // We use the EXT verson because it is more expansive and interacts with more extensions
3737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // than the ARB or core (4.5) versions. We may switch and/or omit methods in the future.
3747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureParameteriProc> fTextureParameteri;
3757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureParameterivProc> fTextureParameteriv;
3767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureParameterfProc> fTextureParameterf;
3777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureParameterfvProc> fTextureParameterfv;
3787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureImage1DProc> fTextureImage1D;
3797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureImage2DProc> fTextureImage2D;
3807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureSubImage1DProc> fTextureSubImage1D;
3817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLTextureSubImage2DProc> fTextureSubImage2D;
3825d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCopyTextureImage1DProc> fCopyTextureImage1D;
38383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLCopyTextureImage2DProc> fCopyTextureImage2D;
3845d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCopyTextureSubImage1DProc> fCopyTextureSubImage1D;
3855d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCopyTextureSubImage2DProc> fCopyTextureSubImage2D;
3865d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetTextureImageProc> fGetTextureImage;
3875d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetTextureParameterfvProc> fGetTextureParameterfv;
3885d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetTextureParameterivProc> fGetTextureParameteriv;
3895d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetTextureLevelParameterfvProc> fGetTextureLevelParameterfv;
3905d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetTextureLevelParameterivProc> fGetTextureLevelParameteriv;
3915d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        // OpenGL 1.2
3925d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLTextureImage3DProc> fTextureImage3D;
3935d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLTextureSubImage3DProc> fTextureSubImage3D;
3945d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCopyTextureSubImage3DProc> fCopyTextureSubImage3D;
3955d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCompressedTextureImage3DProc> fCompressedTextureImage3D;
3965d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCompressedTextureImage2DProc> fCompressedTextureImage2D;
3975d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCompressedTextureImage1DProc> fCompressedTextureImage1D;
3987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCompressedTextureSubImage3DProc> fCompressedTextureSubImage3D;
39983118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLCompressedTextureSubImage2DProc> fCompressedTextureSubImage2D;
4005d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLCompressedTextureSubImage1DProc> fCompressedTextureSubImage1D;
4015d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetCompressedTextureImageProc> fGetCompressedTextureImage;
4025d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        // OpenGL 1.5
4035d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLNamedBufferDataProc> fNamedBufferData;
4045d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLNamedBufferSubDataProc> fNamedBufferSubData;
4055d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLMapNamedBufferProc> fMapNamedBuffer;
4065d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLUnmapNamedBufferProc> fUnmapNamedBuffer;
40783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLGetNamedBufferParameterivProc> fGetNamedBufferParameteriv;
4085d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLGetNamedBufferPointervProc> fGetNamedBufferPointerv;
40994bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLGetNamedBufferSubDataProc> fGetNamedBufferSubData;
41094bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        // OpenGL 2.0
41194bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser        GrGLFunction<GrGLProgramUniform1fProc> fProgramUniform1f;
4127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform2fProc> fProgramUniform2f;
4135d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLProgramUniform3fProc> fProgramUniform3f;
4145d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLProgramUniform4fProc> fProgramUniform4f;
4155d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLProgramUniform1iProc> fProgramUniform1i;
4165d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLProgramUniform2iProc> fProgramUniform2i;
4175d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey        GrGLFunction<GrGLProgramUniform3iProc> fProgramUniform3i;
41883118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLProgramUniform4iProc> fProgramUniform4i;
4197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform1fvProc> fProgramUniform1fv;
4207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform2fvProc> fProgramUniform2fv;
4217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform3fvProc> fProgramUniform3fv;
4227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform4fvProc> fProgramUniform4fv;
4237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform1ivProc> fProgramUniform1iv;
4247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform2ivProc> fProgramUniform2iv;
4257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform3ivProc> fProgramUniform3iv;
4267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniform4ivProc> fProgramUniform4iv;
4277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix2fvProc> fProgramUniformMatrix2fv;
4287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix3fvProc> fProgramUniformMatrix3fv;
4297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix4fvProc> fProgramUniformMatrix4fv;
4307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        // OpenGL 2.1
4317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix2x3fvProc> fProgramUniformMatrix2x3fv;
4327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix3x2fvProc> fProgramUniformMatrix3x2fv;
4337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix2x4fvProc> fProgramUniformMatrix2x4fv;
4347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix4x2fvProc> fProgramUniformMatrix4x2fv;
4357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix3x4fvProc> fProgramUniformMatrix3x4fv;
4367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLProgramUniformMatrix4x3fvProc> fProgramUniformMatrix4x3fv;
43783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        // OpenGL 3.0
4387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLNamedRenderbufferStorageProc> fNamedRenderbufferStorage;
4397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetNamedRenderbufferParameterivProc> fGetNamedRenderbufferParameteriv;
4407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLNamedRenderbufferStorageMultisampleProc> fNamedRenderbufferStorageMultisample;
4417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLCheckNamedFramebufferStatusProc> fCheckNamedFramebufferStatus;
44283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser        GrGLFunction<GrGLNamedFramebufferTexture1DProc> fNamedFramebufferTexture1D;
4437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLNamedFramebufferTexture2DProc> fNamedFramebufferTexture2D;
4447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLNamedFramebufferTexture3DProc> fNamedFramebufferTexture3D;
4457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLNamedFramebufferRenderbufferProc> fNamedFramebufferRenderbuffer;
4467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetNamedFramebufferAttachmentParameterivProc> fGetNamedFramebufferAttachmentParameteriv;
4477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGenerateTextureMipmapProc> fGenerateTextureMipmap;
4487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLFramebufferDrawBufferProc> fFramebufferDrawBuffer;
4497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLFramebufferDrawBuffersProc> fFramebufferDrawBuffers;
4507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLFramebufferReadBufferProc> fFramebufferReadBuffer;
4517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetFramebufferParameterivProc> fGetFramebufferParameteriv;
4527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLNamedCopyBufferSubDataProc> fNamedCopyBufferSubData;
4537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayVertexOffsetProc> fVertexArrayVertexOffset;
4547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayColorOffsetProc> fVertexArrayColorOffset;
4553b55a891a197212b34b0c077f72cb3af752468ecSteven M. Gava        GrGLFunction<GrGLVertexArrayEdgeFlagOffsetProc> fVertexArrayEdgeFlagOffset;
4567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayIndexOffsetProc> fVertexArrayIndexOffset;
4577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayNormalOffsetProc> fVertexArrayNormalOffset;
4587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayTexCoordOffsetProc> fVertexArrayTexCoordOffset;
4597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayMultiTexCoordOffsetProc> fVertexArrayMultiTexCoordOffset;
4607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayFogCoordOffsetProc> fVertexArrayFogCoordOffset;
4617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArraySecondaryColorOffsetProc> fVertexArraySecondaryColorOffset;
4627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayVertexAttribOffsetProc> fVertexArrayVertexAttribOffset;
4637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLVertexArrayVertexAttribIOffsetProc> fVertexArrayVertexAttribIOffset;
4647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLEnableVertexArrayProc> fEnableVertexArray;
4657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDisableVertexArrayProc> fDisableVertexArray;
4667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLEnableVertexArrayAttribProc> fEnableVertexArrayAttrib;
4677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDisableVertexArrayAttribProc> fDisableVertexArrayAttrib;
4687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetVertexArrayIntegervProc> fGetVertexArrayIntegerv;
4697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetVertexArrayPointervProc> fGetVertexArrayPointerv;
4707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetVertexArrayIntegeri_vProc> fGetVertexArrayIntegeri_v;
4717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetVertexArrayPointeri_vProc> fGetVertexArrayPointeri_v;
4727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLMapNamedBufferRangeProc> fMapNamedBufferRange;
4737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLFlushMappedNamedBufferRangeProc> fFlushMappedNamedBufferRange;
4747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
4757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        /* KHR_debug */
4767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDebugMessageControlProc> fDebugMessageControl;
4777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDebugMessageInsertProc> fDebugMessageInsert;
4787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLDebugMessageCallbackProc> fDebugMessageCallback;
4797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLGetDebugMessageLogProc> fGetDebugMessageLog;
4807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLPushDebugGroupProc> fPushDebugGroup;
4817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLPopDebugGroupProc> fPopDebugGroup;
4827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrGLObjectLabelProc> fObjectLabel;
4837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
4847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        /* EGL functions */
4857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrEGLCreateImageProc> fEGLCreateImage;
4867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer        GrGLFunction<GrEGLDestroyImageProc> fEGLDestroyImage;
4877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    } fFunctions;
4887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
4897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer    // Per-GL func callback
4907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#if GR_GL_PER_GL_FUNC_CALLBACK
4915d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey    GrGLInterfaceCallbackProc fCallback;
4925d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey    GrGLInterfaceCallbackData fCallbackData;
4937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#endif
4945d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey
4955d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey    // This exists for internal testing.
4965d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey    virtual void abandon() const {}
4975d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey};
4987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer
4997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#endif
5007aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer