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