1 /*
2  * Copyright 2011 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrGLInterface_DEFINED
9 #define GrGLInterface_DEFINED
10 
11 #include "GrGLFunctions.h"
12 #include "GrGLExtensions.h"
13 #include "SkRefCnt.h"
14 
15 ////////////////////////////////////////////////////////////////////////////////
16 
17 typedef void(*GrGLFuncPtr)();
18 struct GrGLInterface;
19 
20 
21 /**
22  * Rather than depend on platform-specific GL headers and libraries, we require
23  * the client to provide a struct of GL function pointers. This struct can be
24  * specified per-GrContext as a parameter to GrContext::MakeGL. If NULL is
25  * passed to MakeGL then a "native" GL interface is created. If the native is
26  * also NULL GrContext creation will fail.
27  *
28  * The default interface is returned by GrGLMakeNativeInterface. This function's
29  * implementation is platform-specific. Several have been provided
30  * (for GLX, WGL, EGL, etc), along with an implementation that simply returns
31  * NULL.
32  */
33 SK_API sk_sp<const GrGLInterface> GrGLMakeNativeInterface();
34 // Deprecated alternative to GrGLMakeNativeInterface().
35 SK_API const GrGLInterface* GrGLCreateNativeInterface();
36 
37 /**
38  * Creates a null GrGLInterface that doesn't draw anything. Used for measuring
39  * CPU overhead. TODO: We would like to move this to tools/gpu/gl/null but currently
40  * Chromium is using it in its unit tests.
41  */
42 const SK_API GrGLInterface* GrGLCreateNullInterface(bool enableNVPR = false);
43 
44 /**
45  * GrContext uses the following interface to make all calls into OpenGL. When a
46  * GrContext is created it is given a GrGLInterface. The interface's function
47  * pointers must be valid for the OpenGL context associated with the GrContext.
48  * On some platforms, such as Windows, function pointers for OpenGL extensions
49  * may vary between OpenGL contexts. So the caller must be careful to use a
50  * GrGLInterface initialized for the correct context. All functions that should
51  * be available based on the OpenGL's version and extension string must be
52  * non-NULL or GrContext creation will fail. This can be tested with the
53  * validate() method when the OpenGL context has been made current.
54  */
55 struct SK_API GrGLInterface : public SkRefCnt {
56 private:
57     typedef SkRefCnt INHERITED;
58 
59 public:
60     GrGLInterface();
61 
62     // Validates that the GrGLInterface supports its advertised standard. This means the necessary
63     // function pointers have been initialized for both the GL version and any advertised
64     // extensions.
65     bool validate() const;
66 
67     // Indicates the type of GL implementation
68     union {
69         GrGLStandard fStandard;
70         GrGLStandard fBindingsExported; // Legacy name, will be remove when Chromium is updated.
71     };
72 
73     GrGLExtensions fExtensions;
74 
hasExtensionGrGLInterface75     bool hasExtension(const char ext[]) const { return fExtensions.has(ext); }
76 
77     /**
78      * The function pointers are in a struct so that we can have a compiler generated assignment
79      * operator.
80      */
81     struct Functions {
82         GrGLFunction<GrGLActiveTextureProc> fActiveTexture;
83         GrGLFunction<GrGLAttachShaderProc> fAttachShader;
84         GrGLFunction<GrGLBeginQueryProc> fBeginQuery;
85         GrGLFunction<GrGLBindAttribLocationProc> fBindAttribLocation;
86         GrGLFunction<GrGLBindBufferProc> fBindBuffer;
87         GrGLFunction<GrGLBindFragDataLocationProc> fBindFragDataLocation;
88         GrGLFunction<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed;
89         GrGLFunction<GrGLBindFramebufferProc> fBindFramebuffer;
90         GrGLFunction<GrGLBindRenderbufferProc> fBindRenderbuffer;
91         GrGLFunction<GrGLBindTextureProc> fBindTexture;
92         GrGLFunction<GrGLBindVertexArrayProc> fBindVertexArray;
93         GrGLFunction<GrGLBlendBarrierProc> fBlendBarrier;
94         GrGLFunction<GrGLBlendColorProc> fBlendColor;
95         GrGLFunction<GrGLBlendEquationProc> fBlendEquation;
96         GrGLFunction<GrGLBlendFuncProc> fBlendFunc;
97         GrGLFunction<GrGLBlitFramebufferProc> fBlitFramebuffer;
98         GrGLFunction<GrGLBufferDataProc> fBufferData;
99         GrGLFunction<GrGLBufferSubDataProc> fBufferSubData;
100         GrGLFunction<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus;
101         GrGLFunction<GrGLClearProc> fClear;
102         GrGLFunction<GrGLClearColorProc> fClearColor;
103         GrGLFunction<GrGLClearStencilProc> fClearStencil;
104         GrGLFunction<GrGLClearTexImageProc> fClearTexImage;
105         GrGLFunction<GrGLClearTexSubImageProc> fClearTexSubImage;
106         GrGLFunction<GrGLColorMaskProc> fColorMask;
107         GrGLFunction<GrGLCompileShaderProc> fCompileShader;
108         GrGLFunction<GrGLCompressedTexImage2DProc> fCompressedTexImage2D;
109         GrGLFunction<GrGLCompressedTexSubImage2DProc> fCompressedTexSubImage2D;
110         GrGLFunction<GrGLCopyTexSubImage2DProc> fCopyTexSubImage2D;
111         GrGLFunction<GrGLCreateProgramProc> fCreateProgram;
112         GrGLFunction<GrGLCreateShaderProc> fCreateShader;
113         GrGLFunction<GrGLCullFaceProc> fCullFace;
114         GrGLFunction<GrGLDeleteBuffersProc> fDeleteBuffers;
115         GrGLFunction<GrGLDeleteFramebuffersProc> fDeleteFramebuffers;
116         GrGLFunction<GrGLDeleteProgramProc> fDeleteProgram;
117         GrGLFunction<GrGLDeleteQueriesProc> fDeleteQueries;
118         GrGLFunction<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers;
119         GrGLFunction<GrGLDeleteShaderProc> fDeleteShader;
120         GrGLFunction<GrGLDeleteTexturesProc> fDeleteTextures;
121         GrGLFunction<GrGLDeleteVertexArraysProc> fDeleteVertexArrays;
122         GrGLFunction<GrGLDepthMaskProc> fDepthMask;
123         GrGLFunction<GrGLDisableProc> fDisable;
124         GrGLFunction<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray;
125         GrGLFunction<GrGLDrawArraysProc> fDrawArrays;
126         GrGLFunction<GrGLDrawArraysIndirectProc> fDrawArraysIndirect;
127         GrGLFunction<GrGLDrawArraysInstancedProc> fDrawArraysInstanced;
128         GrGLFunction<GrGLDrawBufferProc> fDrawBuffer;
129         GrGLFunction<GrGLDrawBuffersProc> fDrawBuffers;
130         GrGLFunction<GrGLDrawElementsProc> fDrawElements;
131         GrGLFunction<GrGLDrawElementsIndirectProc> fDrawElementsIndirect;
132         GrGLFunction<GrGLDrawElementsInstancedProc> fDrawElementsInstanced;
133         GrGLFunction<GrGLDrawRangeElementsProc> fDrawRangeElements;
134         GrGLFunction<GrGLEnableProc> fEnable;
135         GrGLFunction<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray;
136         GrGLFunction<GrGLEndQueryProc> fEndQuery;
137         GrGLFunction<GrGLFinishProc> fFinish;
138         GrGLFunction<GrGLFlushProc> fFlush;
139         GrGLFunction<GrGLFlushMappedBufferRangeProc> fFlushMappedBufferRange;
140         GrGLFunction<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer;
141         GrGLFunction<GrGLFramebufferTexture2DProc> fFramebufferTexture2D;
142         GrGLFunction<GrGLFramebufferTexture2DMultisampleProc> fFramebufferTexture2DMultisample;
143         GrGLFunction<GrGLFrontFaceProc> fFrontFace;
144         GrGLFunction<GrGLGenBuffersProc> fGenBuffers;
145         GrGLFunction<GrGLGenFramebuffersProc> fGenFramebuffers;
146         GrGLFunction<GrGLGenerateMipmapProc> fGenerateMipmap;
147         GrGLFunction<GrGLGenQueriesProc> fGenQueries;
148         GrGLFunction<GrGLGenRenderbuffersProc> fGenRenderbuffers;
149         GrGLFunction<GrGLGenTexturesProc> fGenTextures;
150         GrGLFunction<GrGLGenVertexArraysProc> fGenVertexArrays;
151         GrGLFunction<GrGLGetBufferParameterivProc> fGetBufferParameteriv;
152         GrGLFunction<GrGLGetErrorProc> fGetError;
153         GrGLFunction<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv;
154         GrGLFunction<GrGLGetIntegervProc> fGetIntegerv;
155         GrGLFunction<GrGLGetMultisamplefvProc> fGetMultisamplefv;
156         GrGLFunction<GrGLGetProgramBinaryProc> fGetProgramBinary;
157         GrGLFunction<GrGLGetProgramInfoLogProc> fGetProgramInfoLog;
158         GrGLFunction<GrGLGetProgramivProc> fGetProgramiv;
159         GrGLFunction<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v;
160         GrGLFunction<GrGLGetQueryObjectivProc> fGetQueryObjectiv;
161         GrGLFunction<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v;
162         GrGLFunction<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv;
163         GrGLFunction<GrGLGetQueryivProc> fGetQueryiv;
164         GrGLFunction<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv;
165         GrGLFunction<GrGLGetShaderInfoLogProc> fGetShaderInfoLog;
166         GrGLFunction<GrGLGetShaderivProc> fGetShaderiv;
167         GrGLFunction<GrGLGetShaderPrecisionFormatProc> fGetShaderPrecisionFormat;
168         GrGLFunction<GrGLGetStringProc> fGetString;
169         GrGLFunction<GrGLGetStringiProc> fGetStringi;
170         GrGLFunction<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv;
171         GrGLFunction<GrGLGetUniformLocationProc> fGetUniformLocation;
172         GrGLFunction<GrGLInsertEventMarkerProc> fInsertEventMarker;
173         GrGLFunction<GrGLInvalidateBufferDataProc> fInvalidateBufferData;
174         GrGLFunction<GrGLInvalidateBufferSubDataProc> fInvalidateBufferSubData;
175         GrGLFunction<GrGLInvalidateFramebufferProc> fInvalidateFramebuffer;
176         GrGLFunction<GrGLInvalidateSubFramebufferProc> fInvalidateSubFramebuffer;
177         GrGLFunction<GrGLInvalidateTexImageProc> fInvalidateTexImage;
178         GrGLFunction<GrGLInvalidateTexSubImageProc> fInvalidateTexSubImage;
179         GrGLFunction<GrGLIsTextureProc> fIsTexture;
180         GrGLFunction<GrGLLineWidthProc> fLineWidth;
181         GrGLFunction<GrGLLinkProgramProc> fLinkProgram;
182         GrGLFunction<GrGLProgramBinaryProc> fProgramBinary;
183         GrGLFunction<GrGLProgramParameteriProc> fProgramParameteri;
184         GrGLFunction<GrGLMapBufferProc> fMapBuffer;
185         GrGLFunction<GrGLMapBufferRangeProc> fMapBufferRange;
186         GrGLFunction<GrGLMapBufferSubDataProc> fMapBufferSubData;
187         GrGLFunction<GrGLMapTexSubImage2DProc> fMapTexSubImage2D;
188         GrGLFunction<GrGLMultiDrawArraysIndirectProc> fMultiDrawArraysIndirect;
189         GrGLFunction<GrGLMultiDrawElementsIndirectProc> fMultiDrawElementsIndirect;
190         GrGLFunction<GrGLPixelStoreiProc> fPixelStorei;
191         GrGLFunction<GrGLPolygonModeProc> fPolygonMode;
192         GrGLFunction<GrGLPopGroupMarkerProc> fPopGroupMarker;
193         GrGLFunction<GrGLPushGroupMarkerProc> fPushGroupMarker;
194         GrGLFunction<GrGLQueryCounterProc> fQueryCounter;
195         GrGLFunction<GrGLRasterSamplesProc> fRasterSamples;
196         GrGLFunction<GrGLReadBufferProc> fReadBuffer;
197         GrGLFunction<GrGLReadPixelsProc> fReadPixels;
198         GrGLFunction<GrGLRenderbufferStorageProc> fRenderbufferStorage;
199 
200         //  On OpenGL ES there are multiple incompatible extensions that add support for MSAA
201         //  and ES3 adds MSAA support to the standard. On an ES3 driver we may still use the
202         //  older extensions for performance reasons or due to ES3 driver bugs. We want the function
203         //  that creates the GrGLInterface to provide all available functions and internally
204         //  we will select among them. They all have a method called glRenderbufferStorageMultisample*.
205         //  So we have separate function pointers for GL_IMG/EXT_multisampled_to_texture,
206         //  GL_CHROMIUM/ANGLE_framebuffer_multisample/ES3, and GL_APPLE_framebuffer_multisample
207         //  variations.
208         //
209         //  If a driver supports multiple GL_ARB_framebuffer_multisample-style extensions then we will
210         //  assume the function pointers for the standard (or equivalent GL_ARB) version have
211         //  been preferred over GL_EXT, GL_CHROMIUM, or GL_ANGLE variations that have reduced
212         //  functionality.
213 
214         //  GL_EXT_multisampled_render_to_texture (preferred) or GL_IMG_multisampled_render_to_texture
215         GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2EXT;
216         //  GL_APPLE_framebuffer_multisample
217         GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2APPLE;
218 
219         //  This is used to store the pointer for GL_ARB/EXT/ANGLE/CHROMIUM_framebuffer_multisample or
220         //  the standard function in ES3+ or GL 3.0+.
221         GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample;
222 
223         // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension.
224         GrGLFunction<GrGLBindUniformLocationProc> fBindUniformLocation;
225 
226         GrGLFunction<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer;
227         GrGLFunction<GrGLScissorProc> fScissor;
228         GrGLFunction<GrGLShaderSourceProc> fShaderSource;
229         GrGLFunction<GrGLStencilFuncProc> fStencilFunc;
230         GrGLFunction<GrGLStencilFuncSeparateProc> fStencilFuncSeparate;
231         GrGLFunction<GrGLStencilMaskProc> fStencilMask;
232         GrGLFunction<GrGLStencilMaskSeparateProc> fStencilMaskSeparate;
233         GrGLFunction<GrGLStencilOpProc> fStencilOp;
234         GrGLFunction<GrGLStencilOpSeparateProc> fStencilOpSeparate;
235         GrGLFunction<GrGLTexBufferProc> fTexBuffer;
236         GrGLFunction<GrGLTexBufferRangeProc> fTexBufferRange;
237         GrGLFunction<GrGLTexImage2DProc> fTexImage2D;
238         GrGLFunction<GrGLTexParameteriProc> fTexParameteri;
239         GrGLFunction<GrGLTexParameterivProc> fTexParameteriv;
240         GrGLFunction<GrGLTexSubImage2DProc> fTexSubImage2D;
241         GrGLFunction<GrGLTexStorage2DProc> fTexStorage2D;
242         GrGLFunction<GrGLTextureBarrierProc> fTextureBarrier;
243         GrGLFunction<GrGLDiscardFramebufferProc> fDiscardFramebuffer;
244         GrGLFunction<GrGLUniform1fProc> fUniform1f;
245         GrGLFunction<GrGLUniform1iProc> fUniform1i;
246         GrGLFunction<GrGLUniform1fvProc> fUniform1fv;
247         GrGLFunction<GrGLUniform1ivProc> fUniform1iv;
248         GrGLFunction<GrGLUniform2fProc> fUniform2f;
249         GrGLFunction<GrGLUniform2iProc> fUniform2i;
250         GrGLFunction<GrGLUniform2fvProc> fUniform2fv;
251         GrGLFunction<GrGLUniform2ivProc> fUniform2iv;
252         GrGLFunction<GrGLUniform3fProc> fUniform3f;
253         GrGLFunction<GrGLUniform3iProc> fUniform3i;
254         GrGLFunction<GrGLUniform3fvProc> fUniform3fv;
255         GrGLFunction<GrGLUniform3ivProc> fUniform3iv;
256         GrGLFunction<GrGLUniform4fProc> fUniform4f;
257         GrGLFunction<GrGLUniform4iProc> fUniform4i;
258         GrGLFunction<GrGLUniform4fvProc> fUniform4fv;
259         GrGLFunction<GrGLUniform4ivProc> fUniform4iv;
260         GrGLFunction<GrGLUniformMatrix2fvProc> fUniformMatrix2fv;
261         GrGLFunction<GrGLUniformMatrix3fvProc> fUniformMatrix3fv;
262         GrGLFunction<GrGLUniformMatrix4fvProc> fUniformMatrix4fv;
263         GrGLFunction<GrGLUnmapBufferProc> fUnmapBuffer;
264         GrGLFunction<GrGLUnmapBufferSubDataProc> fUnmapBufferSubData;
265         GrGLFunction<GrGLUnmapTexSubImage2DProc> fUnmapTexSubImage2D;
266         GrGLFunction<GrGLUseProgramProc> fUseProgram;
267         GrGLFunction<GrGLVertexAttrib1fProc> fVertexAttrib1f;
268         GrGLFunction<GrGLVertexAttrib2fvProc> fVertexAttrib2fv;
269         GrGLFunction<GrGLVertexAttrib3fvProc> fVertexAttrib3fv;
270         GrGLFunction<GrGLVertexAttrib4fvProc> fVertexAttrib4fv;
271         GrGLFunction<GrGLVertexAttribDivisorProc> fVertexAttribDivisor;
272         GrGLFunction<GrGLVertexAttribIPointerProc> fVertexAttribIPointer;
273         GrGLFunction<GrGLVertexAttribPointerProc> fVertexAttribPointer;
274         GrGLFunction<GrGLViewportProc> fViewport;
275 
276         /* GL_NV_path_rendering */
277         GrGLFunction<GrGLMatrixLoadfProc> fMatrixLoadf;
278         GrGLFunction<GrGLMatrixLoadIdentityProc> fMatrixLoadIdentity;
279         GrGLFunction<GrGLGetProgramResourceLocationProc> fGetProgramResourceLocation;
280         GrGLFunction<GrGLPathCommandsProc> fPathCommands;
281         GrGLFunction<GrGLPathParameteriProc> fPathParameteri;
282         GrGLFunction<GrGLPathParameterfProc> fPathParameterf;
283         GrGLFunction<GrGLGenPathsProc> fGenPaths;
284         GrGLFunction<GrGLDeletePathsProc> fDeletePaths;
285         GrGLFunction<GrGLIsPathProc> fIsPath;
286         GrGLFunction<GrGLPathStencilFuncProc> fPathStencilFunc;
287         GrGLFunction<GrGLStencilFillPathProc> fStencilFillPath;
288         GrGLFunction<GrGLStencilStrokePathProc> fStencilStrokePath;
289         GrGLFunction<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced;
290         GrGLFunction<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced;
291         GrGLFunction<GrGLCoverFillPathProc> fCoverFillPath;
292         GrGLFunction<GrGLCoverStrokePathProc> fCoverStrokePath;
293         GrGLFunction<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced;
294         GrGLFunction<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced;
295         // NV_path_rendering v1.2
296         GrGLFunction<GrGLStencilThenCoverFillPathProc> fStencilThenCoverFillPath;
297         GrGLFunction<GrGLStencilThenCoverStrokePathProc> fStencilThenCoverStrokePath;
298         GrGLFunction<GrGLStencilThenCoverFillPathInstancedProc> fStencilThenCoverFillPathInstanced;
299         GrGLFunction<GrGLStencilThenCoverStrokePathInstancedProc> fStencilThenCoverStrokePathInstanced;
300         // NV_path_rendering v1.3
301         GrGLFunction<GrGLProgramPathFragmentInputGenProc> fProgramPathFragmentInputGen;
302         // CHROMIUM_path_rendering
303         GrGLFunction<GrGLBindFragmentInputLocationProc> fBindFragmentInputLocation;
304 
305         /* NV_framebuffer_mixed_samples */
306         GrGLFunction<GrGLCoverageModulationProc> fCoverageModulation;
307 
308         /* ARB_sample_shading */
309         GrGLFunction<GrGLMinSampleShadingProc> fMinSampleShading;
310 
311         /* ARB_sync */
312         GrGLFunction<GrGLFenceSyncProc> fFenceSync;
313         GrGLFunction<GrGLIsSyncProc> fIsSync;
314         GrGLFunction<GrGLClientWaitSyncProc> fClientWaitSync;
315         GrGLFunction<GrGLWaitSyncProc> fWaitSync;
316         GrGLFunction<GrGLDeleteSyncProc> fDeleteSync;
317 
318         /* ARB_internalforamt_query */
319         GrGLFunction<GrGLGetInternalformativProc> fGetInternalformativ;
320 
321         /* KHR_debug */
322         GrGLFunction<GrGLDebugMessageControlProc> fDebugMessageControl;
323         GrGLFunction<GrGLDebugMessageInsertProc> fDebugMessageInsert;
324         GrGLFunction<GrGLDebugMessageCallbackProc> fDebugMessageCallback;
325         GrGLFunction<GrGLGetDebugMessageLogProc> fGetDebugMessageLog;
326         GrGLFunction<GrGLPushDebugGroupProc> fPushDebugGroup;
327         GrGLFunction<GrGLPopDebugGroupProc> fPopDebugGroup;
328         GrGLFunction<GrGLObjectLabelProc> fObjectLabel;
329 
330         /* EXT_window_rectangles */
331         GrGLFunction<GrGLWindowRectanglesProc> fWindowRectangles;
332 
333         /* EGL functions */
334         GrGLFunction<GrEGLCreateImageProc> fEGLCreateImage;
335         GrGLFunction<GrEGLDestroyImageProc> fEGLDestroyImage;
336     } fFunctions;
337 
338     // This exists for internal testing.
abandonGrGLInterface339     virtual void abandon() const {}
340 };
341 
342 #endif
343