180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrGLInterface_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrGLInterface_DEFINED
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLFunctions.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrRefCnt.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////////////
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Classifies GL contexts (currently as Desktop vs. ES2). This is a bitfield.
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * A GrGLInterface (defined below) may support multiple bindings.
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum GrGLBinding {
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kNone_GrGLBinding = 0x0,
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kDesktop_GrGLBinding = 0x01,
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kES2_GrGLBinding = 0x02,
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // for iteration of GrGLBindings
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kFirstGrGLBinding = kDesktop_GrGLBinding,
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kLastGrGLBinding = kES2_GrGLBinding
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////////////
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Rather than depend on platform-specific GL headers and libraries, we require
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * the client to provide a struct of GL function pointers. This struct can be
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * specified per-GrContext as a parameter to GrContext::Create. If NULL is
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * passed to Create then the "default" GL interface is used. If the default is
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * also NULL GrContext creation will fail.
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The default interface is returned by GrGLDefaultInterface. This function's
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * implementation is platform-specific. Several have been provided, along with
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * an implementation that simply returns NULL. It is implementation-specific
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * whether the same GrGLInterface is returned or whether a new one is created
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * at each call. Some platforms may not be able to use a single GrGLInterface
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * because extension function ptrs vary across contexts. Note that GrGLInterface
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * is ref-counted. So if the same object is returned by multiple calls to
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * GrGLDefaultInterface, each should bump the ref count.
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * By defining GR_GL_PER_GL_CALL_IFACE_CALLBACK to 1 the client can specify a
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * callback function that will be called prior to each GL function call. See
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * comments in GrGLConfig.h
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct GrGLInterface;
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLDefaultInterface();
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows,
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * GLX on linux, AGL on Mac). On platforms that have context-specific function
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * pointers for GL extensions (e.g. windows) the returned interface is only
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * valid for the context that was current at creation.
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLCreateNativeInterface();
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_MESA
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Creates a GrGLInterface for an OSMesa context.
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLCreateMesaInterface();
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_ANGLE
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Creates a GrGLInterface for an ANGLE context.
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLCreateANGLEInterface();
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Creates a null GrGLInterface that doesn't draw anything. Used for measuring
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * CPU overhead.
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLCreateNullInterface();
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Creates a debugging GrGLInterface that doesn't draw anything. Used for
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * finding memory leaks and invalid memory accesses.
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLCreateDebugInterface();
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if GR_GL_PER_GL_FUNC_CALLBACK
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*);
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef intptr_t GrGLInterfaceCallbackData;
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * GrContext uses the following interface to make all calls into OpenGL. When a
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * GrContext is created it is given a GrGLInterface. The interface's function
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * pointers must be valid for the OpenGL context associated with the GrContext.
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * On some platforms, such as Windows, function pointers for OpenGL extensions
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * may vary between OpenGL contexts. So the caller must be careful to use a
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * GrGLInterface initialized for the correct context. All functions that should
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * be available based on the OpenGL's version and extension string must be
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * non-NULL or GrContext creation will fail. This can be tested with the
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * validate() method when the OpenGL context has been made current.
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct GR_API GrGLInterface : public GrRefCnt {
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // simple wrapper class that exists only to initialize a pointer to NULL
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    template <typename FNPTR_TYPE> class GLPtr {
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    public:
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        GLPtr() : fPtr(NULL) {}
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        GLPtr operator =(FNPTR_TYPE ptr) { fPtr = ptr; return *this; }
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        operator FNPTR_TYPE() const { return fPtr; }
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    private:
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        FNPTR_TYPE fPtr;
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef GrRefCnt INHERITED;
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_INST_COUNT(GrGLInterface)
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLInterface();
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // Validates that the GrGLInterface supports a binding. This means that
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // the GrGLinterface advertises the binding in fBindingsExported and all
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // the necessary function pointers have been initialized. The interface is
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // validated for the current OpenGL context.
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool validate(GrGLBinding binding) const;
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // Indicator variable specifying the type of GL implementation
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // exported:  GLES2 and/or Desktop.
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLBinding fBindingsExported;
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLActiveTextureProc> fActiveTexture;
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLAttachShaderProc> fAttachShader;
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBeginQueryProc> fBeginQuery;
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBindAttribLocationProc> fBindAttribLocation;
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBindBufferProc> fBindBuffer;
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBindFragDataLocationProc> fBindFragDataLocation;
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBindFramebufferProc> fBindFramebuffer;
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBindRenderbufferProc> fBindRenderbuffer;
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBindTextureProc> fBindTexture;
149096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GLPtr<GrGLBindVertexArrayProc> fBindVertexArray;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBlendColorProc> fBlendColor;
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBlendFuncProc> fBlendFunc;
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBlitFramebufferProc> fBlitFramebuffer;
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBufferDataProc> fBufferData;
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLBufferSubDataProc> fBufferSubData;
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus;
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLClearProc> fClear;
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLClearColorProc> fClearColor;
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLClearStencilProc> fClearStencil;
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLColorMaskProc> fColorMask;
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCompileShaderProc> fCompileShader;
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCompressedTexImage2DProc> fCompressedTexImage2D;
1627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GLPtr<GrGLCopyTexSubImage2DProc> fCopyTexSubImage2D;
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCreateProgramProc> fCreateProgram;
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCreateShaderProc> fCreateShader;
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCullFaceProc> fCullFace;
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeleteBuffersProc> fDeleteBuffers;
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeleteFramebuffersProc> fDeleteFramebuffers;
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeleteProgramProc> fDeleteProgram;
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeleteQueriesProc> fDeleteQueries;
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers;
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeleteShaderProc> fDeleteShader;
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeleteTexturesProc> fDeleteTextures;
173096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GLPtr<GrGLDeleteVertexArraysProc> fDeleteVertexArrays;
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDepthMaskProc> fDepthMask;
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDisableProc> fDisable;
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray;
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDrawArraysProc> fDrawArrays;
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDrawBufferProc> fDrawBuffer;
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDrawBuffersProc> fDrawBuffers;
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDrawElementsProc> fDrawElements;
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLEnableProc> fEnable;
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray;
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLEndQueryProc> fEndQuery;
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLFinishProc> fFinish;
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLFlushProc> fFlush;
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer;
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLFramebufferTexture2DProc> fFramebufferTexture2D;
188096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GLPtr<GrGLFramebufferTexture2DMultisampleProc> fFramebufferTexture2DMultisample;
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLFrontFaceProc> fFrontFace;
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGenBuffersProc> fGenBuffers;
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGenFramebuffersProc> fGenFramebuffers;
192e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    GLPtr<GrGLGenerateMipmapProc> fGenerateMipmap;
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGenQueriesProc> fGenQueries;
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGenRenderbuffersProc> fGenRenderbuffers;
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGenTexturesProc> fGenTextures;
196096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GLPtr<GrGLGenVertexArraysProc> fGenVertexArrays;
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetBufferParameterivProc> fGetBufferParameteriv;
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetErrorProc> fGetError;
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv;
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetIntegervProc> fGetIntegerv;
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v;
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetQueryObjectivProc> fGetQueryObjectiv;
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v;
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv;
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetQueryivProc> fGetQueryiv;
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetProgramInfoLogProc> fGetProgramInfoLog;
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetProgramivProc> fGetProgramiv;
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv;
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetShaderInfoLogProc> fGetShaderInfoLog;
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetShaderivProc> fGetShaderiv;
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetStringProc> fGetString;
212096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GLPtr<GrGLGetStringiProc> fGetStringi;
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv;
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetUniformLocationProc> fGetUniformLocation;
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLLineWidthProc> fLineWidth;
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLLinkProgramProc> fLinkProgram;
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLMapBufferProc> fMapBuffer;
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPixelStoreiProc> fPixelStorei;
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLQueryCounterProc> fQueryCounter;
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLReadBufferProc> fReadBuffer;
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLReadPixelsProc> fReadPixels;
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLRenderbufferStorageProc> fRenderbufferStorage;
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample;
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLRenderbufferStorageMultisampleCoverageProc> fRenderbufferStorageMultisampleCoverage;
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer;
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLScissorProc> fScissor;
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLShaderSourceProc> fShaderSource;
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilFuncProc> fStencilFunc;
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilFuncSeparateProc> fStencilFuncSeparate;
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilMaskProc> fStencilMask;
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilMaskSeparateProc> fStencilMaskSeparate;
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilOpProc> fStencilOp;
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilOpSeparateProc> fStencilOpSeparate;
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLTexImage2DProc> fTexImage2D;
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLTexParameteriProc> fTexParameteri;
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLTexParameterivProc> fTexParameteriv;
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLTexSubImage2DProc> fTexSubImage2D;
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLTexStorage2DProc> fTexStorage2D;
2397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GLPtr<GrGLDiscardFramebufferProc> fDiscardFramebuffer;
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform1fProc> fUniform1f;
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform1iProc> fUniform1i;
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform1fvProc> fUniform1fv;
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform1ivProc> fUniform1iv;
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform2fProc> fUniform2f;
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform2iProc> fUniform2i;
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform2fvProc> fUniform2fv;
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform2ivProc> fUniform2iv;
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform3fProc> fUniform3f;
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform3iProc> fUniform3i;
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform3fvProc> fUniform3fv;
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform3ivProc> fUniform3iv;
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform4fProc> fUniform4f;
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform4iProc> fUniform4i;
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform4fvProc> fUniform4fv;
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniform4ivProc> fUniform4iv;
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniformMatrix2fvProc> fUniformMatrix2fv;
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniformMatrix3fvProc> fUniformMatrix3fv;
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUniformMatrix4fvProc> fUniformMatrix4fv;
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUnmapBufferProc> fUnmapBuffer;
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLUseProgramProc> fUseProgram;
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLVertexAttrib4fvProc> fVertexAttrib4fv;
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLVertexAttribPointerProc> fVertexAttribPointer;
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLViewportProc> fViewport;
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // Experimental: Functions for GL_NV_path_rendering. These will be
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // alphabetized with the above functions once this is fully supported
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // (and functions we are unlikely to use will possibly be omitted).
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLMatrixModeProc> fMatrixMode;
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLLoadIdentityProc> fLoadIdentity;
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLLoadMatrixfProc> fLoadMatrixf;
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathCommandsProc> fPathCommands;
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathCoordsProc> fPathCoords;
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathSubCommandsProc> fPathSubCommands;
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathSubCoordsProc> fPathSubCoords;
27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathStringProc> fPathString;
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathGlyphsProc> fPathGlyphs;
27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathGlyphRangeProc> fPathGlyphRange;
27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLWeightPathsProc> fWeightPaths;
27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCopyPathProc> fCopyPath;
28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLInterpolatePathsProc> fInterpolatePaths;
28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLTransformPathProc> fTransformPath;
28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathParameterivProc> fPathParameteriv;
28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathParameteriProc> fPathParameteri;
28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathParameterfvProc> fPathParameterfv;
28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathParameterfProc> fPathParameterf;
28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathDashArrayProc> fPathDashArray;
28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGenPathsProc> fGenPaths;
28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLDeletePathsProc> fDeletePaths;
28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLIsPathProc> fIsPath;
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathStencilFuncProc> fPathStencilFunc;
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathStencilDepthOffsetProc> fPathStencilDepthOffset;
29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilFillPathProc> fStencilFillPath;
29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilStrokePathProc> fStencilStrokePath;
29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced;
29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced;
29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathCoverDepthFuncProc> fPathCoverDepthFunc;
29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathColorGenProc> fPathColorGen;
29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathTexGenProc> fPathTexGen;
29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPathFogGenProc> fPathFogGen;
30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCoverFillPathProc> fCoverFillPath;
30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCoverStrokePathProc> fCoverStrokePath;
30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced;
30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced;
30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathParameterivProc> fGetPathParameteriv;
30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathParameterfvProc> fGetPathParameterfv;
30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathCommandsProc> fGetPathCommands;
30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathCoordsProc> fGetPathCoords;
30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathDashArrayProc> fGetPathDashArray;
30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathMetricsProc> fGetPathMetrics;
31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathMetricRangeProc> fGetPathMetricRange;
31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathSpacingProc> fGetPathSpacing;
31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathColorGenivProc> fGetPathColorGeniv;
31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathColorGenfvProc> fGetPathColorGenfv;
31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathTexGenivProc> fGetPathTexGeniv;
31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathTexGenfvProc> fGetPathTexGenfv;
31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLIsPointInFillPathProc> fIsPointInFillPath;
31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLIsPointInStrokePathProc> fIsPointInStrokePath;
31880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLGetPathLengthProc> fGetPathLength;
31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GLPtr<GrGLPointAlongPathProc> fPointAlongPath;
32080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
32180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // Per-GL func callback
32280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if GR_GL_PER_GL_FUNC_CALLBACK
32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLInterfaceCallbackProc fCallback;
32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLInterfaceCallbackData fCallbackData;
32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
330