• 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 #ifndef GrGLInterface_DEFINED
11 #define GrGLInterface_DEFINED
12 
13 #include "GrGLFunctions.h"
14 #include "GrRefCnt.h"
15 
16 ////////////////////////////////////////////////////////////////////////////////
17 
18 /**
19  * Classifies GL contexts (currently as Desktop vs. ES2). This is a bitfield.
20  * A GrGLInterface (defined below) may support multiple bindings.
21  */
22 enum GrGLBinding {
23     kNone_GrGLBinding = 0x0,
24 
25     kDesktop_GrGLBinding = 0x01,
26     kES2_GrGLBinding = 0x02,
27 
28     // for iteration of GrGLBindings
29     kFirstGrGLBinding = kDesktop_GrGLBinding,
30     kLastGrGLBinding = kES2_GrGLBinding
31 };
32 
33 ////////////////////////////////////////////////////////////////////////////////
34 
35 /**
36  * Rather than depend on platform-specific GL headers and libraries, we require
37  * the client to provide a struct of GL function pointers. This struct can be
38  * specified per-GrContext as a parameter to GrContext::Create. If NULL is
39  * passed to Create then the "default" GL interface is used. If the default is
40  * also NULL GrContext creation will fail.
41  *
42  * The default interface is returned by GrGLDefaultInterface. This function's
43  * implementation is platform-specific. Several have been provided, along with
44  * an implementation that simply returns NULL. It is implementation-specific
45  * whether the same GrGLInterface is returned or whether a new one is created
46  * at each call. Some platforms may not be able to use a single GrGLInterface
47  * because extension function ptrs vary across contexts. Note that GrGLInterface
48  * is ref-counted. So if the same object is returned by multiple calls to
49  * GrGLDefaultInterface, each should bump the ref count.
50  *
51  * By defining GR_GL_PER_GL_CALL_IFACE_CALLBACK to 1 the client can specify a
52  * callback function that will be called prior to each GL function call. See
53  * comments in GrGLConfig.h
54  */
55 
56 struct GrGLInterface;
57 
58 const GrGLInterface* GrGLDefaultInterface();
59 
60 /**
61  * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows,
62  * GLX on linux, AGL on Mac). On platforms that have context-specific function
63  * pointers for GL extensions (e.g. windows) the returned interface is only
64  * valid for the context that was current at creation.
65  */
66 const GrGLInterface* GrGLCreateNativeInterface();
67 
68 #if SK_MESA
69 /**
70  * Creates a GrGLInterface for an OSMesa context.
71  */
72 const GrGLInterface* GrGLCreateMesaInterface();
73 #endif
74 
75 #if SK_ANGLE
76 /**
77  * Creates a GrGLInterface for an ANGLE context.
78  */
79 const GrGLInterface* GrGLCreateANGLEInterface();
80 #endif
81 
82 /**
83  * Creates a null GrGLInterface that doesn't draw anything. Used for measuring
84  * CPU overhead.
85  */
86 const GrGLInterface* GrGLCreateNullInterface();
87 
88 /**
89  * Creates a debugging GrGLInterface that doesn't draw anything. Used for
90  * finding memory leaks and invalid memory accesses.
91  */
92 const GrGLInterface* GrGLCreateDebugInterface();
93 
94 #if GR_GL_PER_GL_FUNC_CALLBACK
95 typedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*);
96 typedef intptr_t GrGLInterfaceCallbackData;
97 #endif
98 
99 /*
100  * GrContext uses the following interface to make all calls into OpenGL. When a
101  * GrContext is created it is given a GrGLInterface. The interface's function
102  * pointers must be valid for the OpenGL context associated with the GrContext.
103  * On some platforms, such as Windows, function pointers for OpenGL extensions
104  * may vary between OpenGL contexts. So the caller must be careful to use a
105  * GrGLInterface initialized for the correct context. All functions that should
106  * be available based on the OpenGL's version and extension string must be
107  * non-NULL or GrContext creation will fail. This can be tested with the
108  * validate() method when the OpenGL context has been made current.
109  */
110 struct GR_API GrGLInterface : public GrRefCnt {
111 private:
112     // simple wrapper class that exists only to initialize a pointer to NULL
113     template <typename FNPTR_TYPE> class GLPtr {
114     public:
GLPtrGrGLInterface115         GLPtr() : fPtr(NULL) {}
116         GLPtr operator =(FNPTR_TYPE ptr) { fPtr = ptr; return *this; }
FNPTR_TYPEGrGLInterface117         operator FNPTR_TYPE() const { return fPtr; }
118     private:
119         FNPTR_TYPE fPtr;
120     };
121 
122     typedef GrRefCnt INHERITED;
123 
124 public:
125     SK_DECLARE_INST_COUNT(GrGLInterface)
126 
127     GrGLInterface();
128 
129     // Validates that the GrGLInterface supports a binding. This means that
130     // the GrGLinterface advertises the binding in fBindingsExported and all
131     // the necessary function pointers have been initialized. The interface is
132     // validated for the current OpenGL context.
133     bool validate(GrGLBinding binding) const;
134 
135     // Indicator variable specifying the type of GL implementation
136     // exported:  GLES2 and/or Desktop.
137     GrGLBinding fBindingsExported;
138 
139     GLPtr<GrGLActiveTextureProc> fActiveTexture;
140     GLPtr<GrGLAttachShaderProc> fAttachShader;
141     GLPtr<GrGLBeginQueryProc> fBeginQuery;
142     GLPtr<GrGLBindAttribLocationProc> fBindAttribLocation;
143     GLPtr<GrGLBindBufferProc> fBindBuffer;
144     GLPtr<GrGLBindFragDataLocationProc> fBindFragDataLocation;
145     GLPtr<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed;
146     GLPtr<GrGLBindFramebufferProc> fBindFramebuffer;
147     GLPtr<GrGLBindRenderbufferProc> fBindRenderbuffer;
148     GLPtr<GrGLBindTextureProc> fBindTexture;
149     GLPtr<GrGLBlendColorProc> fBlendColor;
150     GLPtr<GrGLBlendFuncProc> fBlendFunc;
151     GLPtr<GrGLBlitFramebufferProc> fBlitFramebuffer;
152     GLPtr<GrGLBufferDataProc> fBufferData;
153     GLPtr<GrGLBufferSubDataProc> fBufferSubData;
154     GLPtr<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus;
155     GLPtr<GrGLClearProc> fClear;
156     GLPtr<GrGLClearColorProc> fClearColor;
157     GLPtr<GrGLClearStencilProc> fClearStencil;
158     GLPtr<GrGLColorMaskProc> fColorMask;
159     GLPtr<GrGLCompileShaderProc> fCompileShader;
160     GLPtr<GrGLCompressedTexImage2DProc> fCompressedTexImage2D;
161     GLPtr<GrGLCreateProgramProc> fCreateProgram;
162     GLPtr<GrGLCreateShaderProc> fCreateShader;
163     GLPtr<GrGLCullFaceProc> fCullFace;
164     GLPtr<GrGLDeleteBuffersProc> fDeleteBuffers;
165     GLPtr<GrGLDeleteFramebuffersProc> fDeleteFramebuffers;
166     GLPtr<GrGLDeleteProgramProc> fDeleteProgram;
167     GLPtr<GrGLDeleteQueriesProc> fDeleteQueries;
168     GLPtr<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers;
169     GLPtr<GrGLDeleteShaderProc> fDeleteShader;
170     GLPtr<GrGLDeleteTexturesProc> fDeleteTextures;
171     GLPtr<GrGLDepthMaskProc> fDepthMask;
172     GLPtr<GrGLDisableProc> fDisable;
173     GLPtr<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray;
174     GLPtr<GrGLDrawArraysProc> fDrawArrays;
175     GLPtr<GrGLDrawBufferProc> fDrawBuffer;
176     GLPtr<GrGLDrawBuffersProc> fDrawBuffers;
177     GLPtr<GrGLDrawElementsProc> fDrawElements;
178     GLPtr<GrGLEnableProc> fEnable;
179     GLPtr<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray;
180     GLPtr<GrGLEndQueryProc> fEndQuery;
181     GLPtr<GrGLFinishProc> fFinish;
182     GLPtr<GrGLFlushProc> fFlush;
183     GLPtr<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer;
184     GLPtr<GrGLFramebufferTexture2DProc> fFramebufferTexture2D;
185     GLPtr<GrGLFrontFaceProc> fFrontFace;
186     GLPtr<GrGLGenBuffersProc> fGenBuffers;
187     GLPtr<GrGLGenFramebuffersProc> fGenFramebuffers;
188     GLPtr<GrGLGenQueriesProc> fGenQueries;
189     GLPtr<GrGLGenRenderbuffersProc> fGenRenderbuffers;
190     GLPtr<GrGLGenTexturesProc> fGenTextures;
191     GLPtr<GrGLGetBufferParameterivProc> fGetBufferParameteriv;
192     GLPtr<GrGLGetErrorProc> fGetError;
193     GLPtr<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv;
194     GLPtr<GrGLGetIntegervProc> fGetIntegerv;
195     GLPtr<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v;
196     GLPtr<GrGLGetQueryObjectivProc> fGetQueryObjectiv;
197     GLPtr<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v;
198     GLPtr<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv;
199     GLPtr<GrGLGetQueryivProc> fGetQueryiv;
200     GLPtr<GrGLGetProgramInfoLogProc> fGetProgramInfoLog;
201     GLPtr<GrGLGetProgramivProc> fGetProgramiv;
202     GLPtr<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv;
203     GLPtr<GrGLGetShaderInfoLogProc> fGetShaderInfoLog;
204     GLPtr<GrGLGetShaderivProc> fGetShaderiv;
205     GLPtr<GrGLGetStringProc> fGetString;
206     GLPtr<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv;
207     GLPtr<GrGLGetUniformLocationProc> fGetUniformLocation;
208     GLPtr<GrGLLineWidthProc> fLineWidth;
209     GLPtr<GrGLLinkProgramProc> fLinkProgram;
210     GLPtr<GrGLMapBufferProc> fMapBuffer;
211     GLPtr<GrGLPixelStoreiProc> fPixelStorei;
212     GLPtr<GrGLQueryCounterProc> fQueryCounter;
213     GLPtr<GrGLReadBufferProc> fReadBuffer;
214     GLPtr<GrGLReadPixelsProc> fReadPixels;
215     GLPtr<GrGLRenderbufferStorageProc> fRenderbufferStorage;
216     GLPtr<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample;
217     GLPtr<GrGLRenderbufferStorageMultisampleCoverageProc> fRenderbufferStorageMultisampleCoverage;
218     GLPtr<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer;
219     GLPtr<GrGLScissorProc> fScissor;
220     GLPtr<GrGLShaderSourceProc> fShaderSource;
221     GLPtr<GrGLStencilFuncProc> fStencilFunc;
222     GLPtr<GrGLStencilFuncSeparateProc> fStencilFuncSeparate;
223     GLPtr<GrGLStencilMaskProc> fStencilMask;
224     GLPtr<GrGLStencilMaskSeparateProc> fStencilMaskSeparate;
225     GLPtr<GrGLStencilOpProc> fStencilOp;
226     GLPtr<GrGLStencilOpSeparateProc> fStencilOpSeparate;
227     GLPtr<GrGLTexImage2DProc> fTexImage2D;
228     GLPtr<GrGLTexParameteriProc> fTexParameteri;
229     GLPtr<GrGLTexParameterivProc> fTexParameteriv;
230     GLPtr<GrGLTexSubImage2DProc> fTexSubImage2D;
231     GLPtr<GrGLTexStorage2DProc> fTexStorage2D;
232     GLPtr<GrGLUniform1fProc> fUniform1f;
233     GLPtr<GrGLUniform1iProc> fUniform1i;
234     GLPtr<GrGLUniform1fvProc> fUniform1fv;
235     GLPtr<GrGLUniform1ivProc> fUniform1iv;
236     GLPtr<GrGLUniform2fProc> fUniform2f;
237     GLPtr<GrGLUniform2iProc> fUniform2i;
238     GLPtr<GrGLUniform2fvProc> fUniform2fv;
239     GLPtr<GrGLUniform2ivProc> fUniform2iv;
240     GLPtr<GrGLUniform3fProc> fUniform3f;
241     GLPtr<GrGLUniform3iProc> fUniform3i;
242     GLPtr<GrGLUniform3fvProc> fUniform3fv;
243     GLPtr<GrGLUniform3ivProc> fUniform3iv;
244     GLPtr<GrGLUniform4fProc> fUniform4f;
245     GLPtr<GrGLUniform4iProc> fUniform4i;
246     GLPtr<GrGLUniform4fvProc> fUniform4fv;
247     GLPtr<GrGLUniform4ivProc> fUniform4iv;
248     GLPtr<GrGLUniformMatrix2fvProc> fUniformMatrix2fv;
249     GLPtr<GrGLUniformMatrix3fvProc> fUniformMatrix3fv;
250     GLPtr<GrGLUniformMatrix4fvProc> fUniformMatrix4fv;
251     GLPtr<GrGLUnmapBufferProc> fUnmapBuffer;
252     GLPtr<GrGLUseProgramProc> fUseProgram;
253     GLPtr<GrGLVertexAttrib4fvProc> fVertexAttrib4fv;
254     GLPtr<GrGLVertexAttribPointerProc> fVertexAttribPointer;
255     GLPtr<GrGLViewportProc> fViewport;
256 
257     // Experimental: Functions for GL_NV_path_rendering. These will be
258     // alphabetized with the above functions once this is fully supported
259     // (and functions we are unlikely to use will possibly be omitted).
260     GLPtr<GrGLMatrixModeProc> fMatrixMode;
261     GLPtr<GrGLLoadIdentityProc> fLoadIdentity;
262     GLPtr<GrGLLoadMatrixfProc> fLoadMatrixf;
263     GLPtr<GrGLPathCommandsProc> fPathCommands;
264     GLPtr<GrGLPathCoordsProc> fPathCoords;
265     GLPtr<GrGLPathSubCommandsProc> fPathSubCommands;
266     GLPtr<GrGLPathSubCoordsProc> fPathSubCoords;
267     GLPtr<GrGLPathStringProc> fPathString;
268     GLPtr<GrGLPathGlyphsProc> fPathGlyphs;
269     GLPtr<GrGLPathGlyphRangeProc> fPathGlyphRange;
270     GLPtr<GrGLWeightPathsProc> fWeightPaths;
271     GLPtr<GrGLCopyPathProc> fCopyPath;
272     GLPtr<GrGLInterpolatePathsProc> fInterpolatePaths;
273     GLPtr<GrGLTransformPathProc> fTransformPath;
274     GLPtr<GrGLPathParameterivProc> fPathParameteriv;
275     GLPtr<GrGLPathParameteriProc> fPathParameteri;
276     GLPtr<GrGLPathParameterfvProc> fPathParameterfv;
277     GLPtr<GrGLPathParameterfProc> fPathParameterf;
278     GLPtr<GrGLPathDashArrayProc> fPathDashArray;
279     GLPtr<GrGLGenPathsProc> fGenPaths;
280     GLPtr<GrGLDeletePathsProc> fDeletePaths;
281     GLPtr<GrGLIsPathProc> fIsPath;
282     GLPtr<GrGLPathStencilFuncProc> fPathStencilFunc;
283     GLPtr<GrGLPathStencilDepthOffsetProc> fPathStencilDepthOffset;
284     GLPtr<GrGLStencilFillPathProc> fStencilFillPath;
285     GLPtr<GrGLStencilStrokePathProc> fStencilStrokePath;
286     GLPtr<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced;
287     GLPtr<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced;
288     GLPtr<GrGLPathCoverDepthFuncProc> fPathCoverDepthFunc;
289     GLPtr<GrGLPathColorGenProc> fPathColorGen;
290     GLPtr<GrGLPathTexGenProc> fPathTexGen;
291     GLPtr<GrGLPathFogGenProc> fPathFogGen;
292     GLPtr<GrGLCoverFillPathProc> fCoverFillPath;
293     GLPtr<GrGLCoverStrokePathProc> fCoverStrokePath;
294     GLPtr<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced;
295     GLPtr<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced;
296     GLPtr<GrGLGetPathParameterivProc> fGetPathParameteriv;
297     GLPtr<GrGLGetPathParameterfvProc> fGetPathParameterfv;
298     GLPtr<GrGLGetPathCommandsProc> fGetPathCommands;
299     GLPtr<GrGLGetPathCoordsProc> fGetPathCoords;
300     GLPtr<GrGLGetPathDashArrayProc> fGetPathDashArray;
301     GLPtr<GrGLGetPathMetricsProc> fGetPathMetrics;
302     GLPtr<GrGLGetPathMetricRangeProc> fGetPathMetricRange;
303     GLPtr<GrGLGetPathSpacingProc> fGetPathSpacing;
304     GLPtr<GrGLGetPathColorGenivProc> fGetPathColorGeniv;
305     GLPtr<GrGLGetPathColorGenfvProc> fGetPathColorGenfv;
306     GLPtr<GrGLGetPathTexGenivProc> fGetPathTexGeniv;
307     GLPtr<GrGLGetPathTexGenfvProc> fGetPathTexGenfv;
308     GLPtr<GrGLIsPointInFillPathProc> fIsPointInFillPath;
309     GLPtr<GrGLIsPointInStrokePathProc> fIsPointInStrokePath;
310     GLPtr<GrGLGetPathLengthProc> fGetPathLength;
311     GLPtr<GrGLPointAlongPathProc> fPointAlongPath;
312 
313     // Per-GL func callback
314 #if GR_GL_PER_GL_FUNC_CALLBACK
315     GrGLInterfaceCallbackProc fCallback;
316     GrGLInterfaceCallbackData fCallbackData;
317 #endif
318 
319 };
320 
321 #endif
322