• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 
11 #ifndef GrGLInterface_DEFINED
12 #define GrGLInterface_DEFINED
13 
14 #include "GrGLConfig.h"
15 #include "GrRefCnt.h"
16 
17 #if !defined(GR_GL_FUNCTION_TYPE)
18     #define GR_GL_FUNCTION_TYPE
19 #endif
20 
21 ////////////////////////////////////////////////////////////////////////////////
22 
23 /**
24  * Classifies GL contexts (currently as Desktop vs. ES2). This is a bitfield.
25  * A GrGLInterface (defined below) may support multiple bindings.
26  */
27 enum GrGLBinding {
28     kNone_GrGLBinding = 0x0,
29 
30     kDesktop_GrGLBinding = 0x01,
31     kES2_GrGLBinding = 0x02,
32 
33     // for iteration of GrGLBindings
34     kFirstGrGLBinding = kDesktop_GrGLBinding,
35     kLastGrGLBinding = kES2_GrGLBinding
36 };
37 
38 ////////////////////////////////////////////////////////////////////////////////
39 
40 /**
41  * Helpers for glGetString()
42  */
43 
44 typedef uint32_t GrGLVersion;
45 typedef uint32_t GrGLSLVersion;
46 
47 #define GR_GL_VER(major, minor) ((static_cast<int>(major) << 16) | \
48                                  static_cast<int>(minor))
49 #define GR_GLSL_VER(major, minor) ((static_cast<int>(major) << 16) | \
50                                    static_cast<int>(minor))
51 
52 // these variants assume caller already has a string from glGetString()
53 GrGLVersion GrGLGetVersionFromString(const char* versionString);
54 GrGLBinding GrGLGetBindingInUseFromString(const char* versionString);
55 GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString);
56 bool GrGLHasExtensionFromString(const char* ext, const char* extensionString);
57 
58 // these variants call glGetString()
59 bool GrGLHasExtension(const GrGLInterface*, const char* ext);
60 GrGLBinding GrGLGetBindingInUse(const GrGLInterface*);
61 GrGLVersion GrGLGetVersion(const GrGLInterface*);
62 GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface*);
63 
64 ////////////////////////////////////////////////////////////////////////////////
65 
66 /**
67  * Rather than depend on platform-specific GL headers and libraries, we require
68  * the client to provide a struct of GL function pointers. This struct can be
69  * specified per-GrContext as a parameter to GrContext::Create. If NULL is
70  * passed to Create then the "default" GL interface is used. If the default is
71  * also NULL GrContext creation will fail.
72  *
73  * The default interface is returned by GrGLDefaultInterface. This function's
74  * implementation is platform-specifc. Several have been provided, along with an
75  * implementation that simply returns NULL. It is implementation-specific
76  * whether the same GrGLInterface is returned or whether a new one is created
77  * at each call. Some platforms may not be able to use a single GrGLInterface
78  * because extension function ptrs vary across contexts. Note that GrGLInterface
79  * is ref-counted. So if the same object is returned by multiple calls to
80  * GrGLDefaultInterface, each should bump the ref count.
81  *
82  * By defining GR_GL_PER_GL_CALL_IFACE_CALLBACK to 1 the client can specify a
83  * callback function that will be called prior to each GL function call. See
84  * comments in GrGLConfig.h
85  */
86 
87 struct GrGLInterface;
88 
89 const GrGLInterface* GrGLDefaultInterface();
90 
91 /**
92  * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows,
93  * GLX on linux, AGL on Mac). On platforms that have context-specific function
94  * pointers for GL extensions (e.g. windows) the returned interface is only
95  * valid for the context that was current at creation.
96  */
97 const GrGLInterface* GrGLCreateNativeInterface();
98 
99 /**
100  * Creates a GrGLInterface for an OSMesa context.
101  */
102 const GrGLInterface* GrGLCreateMesaInterface();
103 
104 /**
105  * Creates a null GrGLInterface that doesn't draw anything. Used for measuring
106  * CPU overhead.
107  */
108 const GrGLInterface* GrGLCreateNullInterface();
109 
110 typedef unsigned int GrGLenum;
111 typedef unsigned char GrGLboolean;
112 typedef unsigned int GrGLbitfield;
113 typedef signed char GrGLbyte;
114 typedef char GrGLchar;
115 typedef short GrGLshort;
116 typedef int GrGLint;
117 typedef int GrGLsizei;
118 typedef int64_t GrGLint64;
119 typedef unsigned char GrGLubyte;
120 typedef unsigned short GrGLushort;
121 typedef unsigned int GrGLuint;
122 typedef uint64_t GrGLuint64;
123 typedef float GrGLfloat;
124 typedef float GrGLclampf;
125 typedef double GrGLdouble;
126 typedef double GrGLclampd;
127 typedef void GrGLvoid;
128 typedef long GrGLintptr;
129 typedef long GrGLsizeiptr;
130 
131 extern "C" {
132     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLActiveTextureProc)(GrGLenum texture);
133     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLAttachShaderProc)(GrGLuint program, GrGLuint shader);
134     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBeginQueryProc)(GrGLenum target, GrGLuint id);
135     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBindAttribLocationProc)(GrGLuint program, GrGLuint index, const char* name);
136     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBindBufferProc)(GrGLenum target, GrGLuint buffer);
137     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBindTextureProc)(GrGLenum target, GrGLuint texture);
138     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBlendColorProc)(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha);
139     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBindFragDataLocationProc)(GrGLuint program, GrGLuint colorNumber, const GrGLchar* name);
140     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBlendFuncProc)(GrGLenum sfactor, GrGLenum dfactor);
141     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBufferDataProc)(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage);
142     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBufferSubDataProc)(GrGLenum target, GrGLintptr offset, GrGLsizeiptr size, const GrGLvoid* data);
143     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLClearProc)(GrGLbitfield mask);
144     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLClearColorProc)(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha);
145     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLClearStencilProc)(GrGLint s);
146     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLColorMaskProc)(GrGLboolean red, GrGLboolean green, GrGLboolean blue, GrGLboolean alpha);
147     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLColorPointerProc)(GrGLint size, GrGLenum type, GrGLsizei stride, const GrGLvoid* pointer);
148     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLCompileShaderProc)(GrGLuint shader);
149     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLCompressedTexImage2DProc)(GrGLenum target, GrGLint level, GrGLenum internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLsizei imageSize, const GrGLvoid* data);
150     typedef GrGLuint (GR_GL_FUNCTION_TYPE *GrGLCreateProgramProc)(void);
151     typedef GrGLuint (GR_GL_FUNCTION_TYPE *GrGLCreateShaderProc)(GrGLenum type);
152     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLCullFaceProc)(GrGLenum mode);
153     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDeleteBuffersProc)(GrGLsizei n, const GrGLuint* buffers);
154     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDeleteProgramProc)(GrGLuint program);
155     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDeleteQueriesProc)(GrGLsizei n, const GrGLuint *ids);
156     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDeleteShaderProc)(GrGLuint shader);
157     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDeleteTexturesProc)(GrGLsizei n, const GrGLuint* textures);
158     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDepthMaskProc)(GrGLboolean flag);
159     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDisableProc)(GrGLenum cap);
160     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDisableVertexAttribArrayProc)(GrGLuint index);
161     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawArraysProc)(GrGLenum mode, GrGLint first, GrGLsizei count);
162     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawBufferProc)(GrGLenum mode);
163     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawBuffersProc)(GrGLsizei n, const GrGLenum* bufs);
164     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawElementsProc)(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices);
165     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLEnableProc)(GrGLenum cap);
166     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLEnableVertexAttribArrayProc)(GrGLuint index);
167     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLEndQueryProc)(GrGLenum target);
168     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLFinishProc)();
169     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLFlushProc)();
170     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLFrontFaceProc)(GrGLenum mode);
171     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGenBuffersProc)(GrGLsizei n, GrGLuint* buffers);
172     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGenQueriesProc)(GrGLsizei n, GrGLuint *ids);
173     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGenTexturesProc)(GrGLsizei n, GrGLuint* textures);
174     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetBufferParameterivProc)(GrGLenum target, GrGLenum pname, GrGLint* params);
175     typedef GrGLenum (GR_GL_FUNCTION_TYPE *GrGLGetErrorProc)();
176     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetIntegervProc)(GrGLenum pname, GrGLint* params);
177     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetProgramInfoLogProc)(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, char* infolog);
178     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetProgramivProc)(GrGLuint program, GrGLenum pname, GrGLint* params);
179     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetQueryivProc)(GrGLenum GLtarget, GrGLenum pname, GrGLint *params);
180     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetQueryObjecti64vProc)(GrGLuint id, GrGLenum pname, GrGLint64 *params);
181     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetQueryObjectivProc)(GrGLuint id, GrGLenum pname, GrGLint *params);
182     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetQueryObjectui64vProc)(GrGLuint id, GrGLenum pname, GrGLuint64 *params);
183     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetQueryObjectuivProc)(GrGLuint id, GrGLenum pname, GrGLuint *params);
184     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetShaderInfoLogProc)(GrGLuint shader, GrGLsizei bufsize, GrGLsizei* length, char* infolog);
185     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetShaderivProc)(GrGLuint shader, GrGLenum pname, GrGLint* params);
186     typedef const GrGLubyte* (GR_GL_FUNCTION_TYPE *GrGLGetStringProc)(GrGLenum name);
187     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetTexLevelParameterivProc)(GrGLenum target, GrGLint level, GrGLenum pname, GrGLint* params);
188     typedef GrGLint (GR_GL_FUNCTION_TYPE *GrGLGetUniformLocationProc)(GrGLuint program, const char* name);
189     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLLineWidthProc)(GrGLfloat width);
190     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLLinkProgramProc)(GrGLuint program);
191     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLPixelStoreiProc)(GrGLenum pname, GrGLint param);
192     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLQueryCounterProc)(GrGLuint id, GrGLenum target);
193     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLReadBufferProc)(GrGLenum src);
194     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLReadPixelsProc)(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels);
195     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLScissorProc)(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
196     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLShaderSourceProc)(GrGLuint shader, GrGLsizei count, const char** str, const GrGLint* length);
197     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLStencilFuncProc)(GrGLenum func, GrGLint ref, GrGLuint mask);
198     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLStencilFuncSeparateProc)(GrGLenum face, GrGLenum func, GrGLint ref, GrGLuint mask);
199     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLStencilMaskProc)(GrGLuint mask);
200     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLStencilMaskSeparateProc)(GrGLenum face, GrGLuint mask);
201     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLStencilOpProc)(GrGLenum fail, GrGLenum zfail, GrGLenum zpass);
202     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLStencilOpSeparateProc)(GrGLenum face, GrGLenum fail, GrGLenum zfail, GrGLenum zpass);
203     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLTexImage2DProc)(GrGLenum target, GrGLint level, GrGLint internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLenum format, GrGLenum type, const GrGLvoid* pixels);
204     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLTexParameteriProc)(GrGLenum target, GrGLenum pname, GrGLint param);
205     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLTexStorage2DProc)(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
206     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLTexSubImage2DProc)(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels);
207     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform1fProc)(GrGLint location, GrGLfloat v0);
208     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform1iProc)(GrGLint location, GrGLint v0);
209     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform1fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
210     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform1ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
211     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform2fProc)(GrGLint location, GrGLfloat v0, GrGLfloat v1);
212     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform2iProc)(GrGLint location, GrGLint v0, GrGLint v1);
213     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform2fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
214     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform2ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
215     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform3fProc)(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2);
216     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform3iProc)(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2);
217     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform3fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
218     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform3ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
219     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform4fProc)(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2, GrGLfloat v3);
220     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform4iProc)(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2, GrGLint v3);
221     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform4fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
222     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniform4ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
223     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniformMatrix2fvProc)(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
224     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniformMatrix3fvProc)(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
225     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUniformMatrix4fvProc)(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
226     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLUseProgramProc)(GrGLuint program);
227     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLVertexAttrib4fvProc)(GrGLuint indx, const GrGLfloat* values);
228     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLVertexAttribPointerProc)(GrGLuint indx, GrGLint size, GrGLenum type, GrGLboolean normalized, GrGLsizei stride, const GrGLvoid* ptr);
229     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLViewportProc)(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
230 
231     // FBO Extension Functions
232     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBindFramebufferProc)(GrGLenum target, GrGLuint framebuffer);
233     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBindRenderbufferProc)(GrGLenum target, GrGLuint renderbuffer);
234     typedef GrGLenum (GR_GL_FUNCTION_TYPE *GrGLCheckFramebufferStatusProc)(GrGLenum target);
235     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDeleteFramebuffersProc)(GrGLsizei n, const GrGLuint *framebuffers);
236     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDeleteRenderbuffersProc)(GrGLsizei n, const GrGLuint *renderbuffers);
237     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLFramebufferRenderbufferProc)(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer);
238     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLFramebufferTexture2DProc)(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level);
239     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGenFramebuffersProc)(GrGLsizei n, GrGLuint *framebuffers);
240     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGenRenderbuffersProc)(GrGLsizei n, GrGLuint *renderbuffers);
241     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetFramebufferAttachmentParameterivProc)(GrGLenum target, GrGLenum attachment, GrGLenum pname, GrGLint* params);
242     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLGetRenderbufferParameterivProc)(GrGLenum target, GrGLenum pname, GrGLint* params);
243     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLRenderbufferStorageProc)(GrGLenum target, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
244 
245     // Multisampling Extension Functions
246     // same prototype for ARB_FBO, EXT_FBO, GL 3.0, & Apple ES extension
247     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLRenderbufferStorageMultisampleProc)(GrGLenum target, GrGLsizei samples, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
248     // desktop: ext_fbo_blit, arb_fbo, gl 3.0
249     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBlitFramebufferProc)(GrGLint srcX0, GrGLint srcY0, GrGLint srcX1, GrGLint srcY1, GrGLint dstX0, GrGLint dstY0, GrGLint dstX1, GrGLint dstY1, GrGLbitfield mask, GrGLenum filter);
250     // apple's es extension
251     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLResolveMultisampleFramebufferProc)();
252 
253     // Buffer mapping (extension in ES).
254     typedef GrGLvoid* (GR_GL_FUNCTION_TYPE *GrGLMapBufferProc)(GrGLenum target, GrGLenum access);
255     typedef GrGLboolean (GR_GL_FUNCTION_TYPE *GrGLUnmapBufferProc)(GrGLenum target);
256 
257     // Dual source blending
258     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLBindFragDataLocationIndexedProc)(GrGLuint program, GrGLuint colorNumber, GrGLuint index, const GrGLchar * name);
259 }  // extern "C"
260 
261 #if GR_GL_PER_GL_FUNC_CALLBACK
262 typedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*);
263 typedef intptr_t GrGLInterfaceCallbackData;
264 #endif
265 
266 
267 enum GrGLCapability {
268     kProbe_GrGLCapability = -1
269 };
270 
271 /*
272  * The following interface exports the OpenGL entry points used by the system.
273  * Use of OpenGL calls is disallowed.  All calls should be invoked through
274  * the global instance of this struct, defined above.
275  *
276  * IMPORTANT NOTE: The OpenGL entry points exposed here include both core GL
277  * functions, and extensions.  The system assumes that the address of the
278  * extension pointer will be valid across contexts.
279  */
280 struct GR_API GrGLInterface : public GrRefCnt {
281 
282     GrGLInterface();
283 
284     // Validates that the GrGLInterface supports a binding. This means that
285     // the GrGLinterface advertises the binding in fBindingsExported and all
286     // the necessary function pointers have been initialized.
287     bool validate(GrGLBinding binding) const;
288 
289     // Indicator variable specifying the type of GL implementation
290     // exported:  GLES{1|2} or Desktop.
291     GrGLBinding fBindingsExported;
292 
293     GrGLActiveTextureProc fActiveTexture;
294     GrGLAttachShaderProc fAttachShader;
295     GrGLBeginQueryProc fBeginQuery;
296     GrGLBindAttribLocationProc fBindAttribLocation;
297     GrGLBindBufferProc fBindBuffer;
298     GrGLBindFragDataLocationProc fBindFragDataLocation;
299     GrGLBindTextureProc fBindTexture;
300     GrGLBlendColorProc fBlendColor;
301     GrGLBlendFuncProc fBlendFunc;
302     GrGLBufferDataProc fBufferData;
303     GrGLBufferSubDataProc fBufferSubData;
304     GrGLClearProc fClear;
305     GrGLClearColorProc fClearColor;
306     GrGLClearStencilProc fClearStencil;
307     GrGLColorMaskProc fColorMask;
308     GrGLColorPointerProc fColorPointer;
309     GrGLCompileShaderProc fCompileShader;
310     GrGLCompressedTexImage2DProc fCompressedTexImage2D;
311     GrGLCreateProgramProc fCreateProgram;
312     GrGLCreateShaderProc fCreateShader;
313     GrGLCullFaceProc fCullFace;
314     GrGLDeleteBuffersProc fDeleteBuffers;
315     GrGLDeleteProgramProc fDeleteProgram;
316     GrGLDeleteQueriesProc fDeleteQueries;
317     GrGLDeleteShaderProc fDeleteShader;
318     GrGLDeleteTexturesProc fDeleteTextures;
319     GrGLDepthMaskProc fDepthMask;
320     GrGLDisableProc fDisable;
321     GrGLDisableVertexAttribArrayProc fDisableVertexAttribArray;
322     GrGLDrawArraysProc fDrawArrays;
323     GrGLDrawBufferProc fDrawBuffer;
324     GrGLDrawBuffersProc fDrawBuffers;
325     GrGLDrawElementsProc fDrawElements;
326     GrGLEnableProc fEnable;
327     GrGLEnableVertexAttribArrayProc fEnableVertexAttribArray;
328     GrGLEndQueryProc fEndQuery;
329     GrGLFinishProc fFinish;
330     GrGLFlushProc fFlush;
331     GrGLFrontFaceProc fFrontFace;
332     GrGLGenBuffersProc fGenBuffers;
333     GrGLGenQueriesProc fGenQueries;
334     GrGLGenTexturesProc fGenTextures;
335     GrGLGetBufferParameterivProc fGetBufferParameteriv;
336     GrGLGetErrorProc fGetError;
337     GrGLGetIntegervProc fGetIntegerv;
338     GrGLGetQueryObjecti64vProc fGetQueryObjecti64v;
339     GrGLGetQueryObjectivProc fGetQueryObjectiv;
340     GrGLGetQueryObjectui64vProc fGetQueryObjectui64v;
341     GrGLGetQueryObjectuivProc fGetQueryObjectuiv;
342     GrGLGetQueryivProc fGetQueryiv;
343     GrGLGetProgramInfoLogProc fGetProgramInfoLog;
344     GrGLGetProgramivProc fGetProgramiv;
345     GrGLGetShaderInfoLogProc fGetShaderInfoLog;
346     GrGLGetShaderivProc fGetShaderiv;
347     GrGLGetStringProc fGetString;
348     GrGLGetTexLevelParameterivProc fGetTexLevelParameteriv;
349     GrGLGetUniformLocationProc fGetUniformLocation;
350     GrGLLineWidthProc fLineWidth;
351     GrGLLinkProgramProc fLinkProgram;
352     GrGLPixelStoreiProc fPixelStorei;
353     GrGLQueryCounterProc fQueryCounter;
354     GrGLReadBufferProc fReadBuffer;
355     GrGLReadPixelsProc fReadPixels;
356     GrGLScissorProc fScissor;
357     GrGLShaderSourceProc fShaderSource;
358     GrGLStencilFuncProc fStencilFunc;
359     GrGLStencilFuncSeparateProc fStencilFuncSeparate;
360     GrGLStencilMaskProc fStencilMask;
361     GrGLStencilMaskSeparateProc fStencilMaskSeparate;
362     GrGLStencilOpProc fStencilOp;
363     GrGLStencilOpSeparateProc fStencilOpSeparate;
364     GrGLTexImage2DProc fTexImage2D;
365     GrGLTexParameteriProc fTexParameteri;
366     GrGLTexSubImage2DProc fTexSubImage2D;
367     GrGLTexStorage2DProc fTexStorage2D;
368     GrGLUniform1fProc fUniform1f;
369     GrGLUniform1iProc fUniform1i;
370     GrGLUniform1fvProc fUniform1fv;
371     GrGLUniform1ivProc fUniform1iv;
372     GrGLUniform2fProc fUniform2f;
373     GrGLUniform2iProc fUniform2i;
374     GrGLUniform2fvProc  fUniform2fv;
375     GrGLUniform2ivProc fUniform2iv;
376     GrGLUniform3fProc fUniform3f;
377     GrGLUniform3iProc fUniform3i;
378     GrGLUniform3fvProc fUniform3fv;
379     GrGLUniform3ivProc fUniform3iv;
380     GrGLUniform4fProc fUniform4f;
381     GrGLUniform4iProc fUniform4i;
382     GrGLUniform4fvProc fUniform4fv;
383     GrGLUniform4ivProc fUniform4iv;
384     GrGLUniformMatrix2fvProc fUniformMatrix2fv;
385     GrGLUniformMatrix3fvProc fUniformMatrix3fv;
386     GrGLUniformMatrix4fvProc fUniformMatrix4fv;
387     GrGLUseProgramProc fUseProgram;
388     GrGLVertexAttrib4fvProc fVertexAttrib4fv;
389     GrGLVertexAttribPointerProc fVertexAttribPointer;
390     GrGLViewportProc fViewport;
391 
392     // FBO Extension Functions
393     GrGLBindFramebufferProc fBindFramebuffer;
394     GrGLBindRenderbufferProc fBindRenderbuffer;
395     GrGLCheckFramebufferStatusProc fCheckFramebufferStatus;
396     GrGLDeleteFramebuffersProc fDeleteFramebuffers;
397     GrGLDeleteRenderbuffersProc fDeleteRenderbuffers;
398     GrGLFramebufferRenderbufferProc fFramebufferRenderbuffer;
399     GrGLFramebufferTexture2DProc fFramebufferTexture2D;
400     GrGLGenFramebuffersProc fGenFramebuffers;
401     GrGLGenRenderbuffersProc fGenRenderbuffers;
402     GrGLGetFramebufferAttachmentParameterivProc fGetFramebufferAttachmentParameteriv;
403     GrGLGetRenderbufferParameterivProc fGetRenderbufferParameteriv;
404     GrGLRenderbufferStorageProc fRenderbufferStorage;
405 
406     // Multisampling Extension Functions
407     // same prototype for ARB_FBO, EXT_FBO, GL 3.0, & Apple ES extension
408     GrGLRenderbufferStorageMultisampleProc fRenderbufferStorageMultisample;
409     // desktop: ext_fbo_blit, arb_fbo, gl 3.0
410     GrGLBlitFramebufferProc fBlitFramebuffer;
411     // apple's es extension
412     GrGLResolveMultisampleFramebufferProc fResolveMultisampleFramebuffer;
413 
414     // Buffer mapping (extension in ES).
415     GrGLMapBufferProc fMapBuffer;
416     GrGLUnmapBufferProc fUnmapBuffer;
417 
418     // Dual Source Blending
419     GrGLBindFragDataLocationIndexedProc fBindFragDataLocationIndexed;
420 
421     // Per-GL func callback
422 #if GR_GL_PER_GL_FUNC_CALLBACK
423     GrGLInterfaceCallbackProc fCallback;
424     GrGLInterfaceCallbackData fCallbackData;
425 #endif
426 
427 };
428 
429 #endif
430