| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrGLInterface_DEFINED |
| #define GrGLInterface_DEFINED |
| |
| #include "GrGLFunctions.h" |
| #include "GrGLExtensions.h" |
| #include "SkRefCnt.h" |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| typedef void(*GrGLFuncPtr)(); |
| struct GrGLInterface; |
| |
| |
| /** |
| * Rather than depend on platform-specific GL headers and libraries, we require |
| * the client to provide a struct of GL function pointers. This struct can be |
| * specified per-GrContext as a parameter to GrContext::MakeGL. If no interface is |
| * passed to MakeGL then a default GL interface is created using GrGLMakeNativeInterface(). |
| * If this returns nullptr then GrContext::MakeGL() will fail. |
| * |
| * The implementation of GrGLMakeNativeInterface is platform-specific. Several |
| * implementations have been provided (for GLX, WGL, EGL, etc), along with an |
| * implementation that simply returns nullptr. Clients should select the most |
| * appropriate one to build. |
| */ |
| SK_API sk_sp<const GrGLInterface> GrGLMakeNativeInterface(); |
| // Deprecated alternative to GrGLMakeNativeInterface(). |
| SK_API const GrGLInterface* GrGLCreateNativeInterface(); |
| |
| /** |
| * Creates a null GrGLInterface that doesn't draw anything. Used for measuring |
| * CPU overhead. TODO: We would like to move this to tools/gpu/gl/null but currently |
| * Chromium is using it in its unit tests. |
| */ |
| const SK_API GrGLInterface* GrGLCreateNullInterface(bool enableNVPR = false); |
| |
| /** |
| * GrContext uses the following interface to make all calls into OpenGL. When a |
| * GrContext is created it is given a GrGLInterface. The interface's function |
| * pointers must be valid for the OpenGL context associated with the GrContext. |
| * On some platforms, such as Windows, function pointers for OpenGL extensions |
| * may vary between OpenGL contexts. So the caller must be careful to use a |
| * GrGLInterface initialized for the correct context. All functions that should |
| * be available based on the OpenGL's version and extension string must be |
| * non-NULL or GrContext creation will fail. This can be tested with the |
| * validate() method when the OpenGL context has been made current. |
| */ |
| struct SK_API GrGLInterface : public SkRefCnt { |
| private: |
| typedef SkRefCnt INHERITED; |
| |
| public: |
| GrGLInterface(); |
| |
| // Validates that the GrGLInterface supports its advertised standard. This means the necessary |
| // function pointers have been initialized for both the GL version and any advertised |
| // extensions. |
| bool validate() const; |
| |
| // Indicates the type of GL implementation |
| union { |
| GrGLStandard fStandard; |
| GrGLStandard fBindingsExported; // Legacy name, will be remove when Chromium is updated. |
| }; |
| |
| GrGLExtensions fExtensions; |
| |
| bool hasExtension(const char ext[]) const { return fExtensions.has(ext); } |
| |
| /** |
| * The function pointers are in a struct so that we can have a compiler generated assignment |
| * operator. |
| */ |
| struct Functions { |
| GrGLFunction<GrGLActiveTextureProc> fActiveTexture; |
| GrGLFunction<GrGLAttachShaderProc> fAttachShader; |
| GrGLFunction<GrGLBeginQueryProc> fBeginQuery; |
| GrGLFunction<GrGLBindAttribLocationProc> fBindAttribLocation; |
| GrGLFunction<GrGLBindBufferProc> fBindBuffer; |
| GrGLFunction<GrGLBindFragDataLocationProc> fBindFragDataLocation; |
| GrGLFunction<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed; |
| GrGLFunction<GrGLBindFramebufferProc> fBindFramebuffer; |
| GrGLFunction<GrGLBindRenderbufferProc> fBindRenderbuffer; |
| GrGLFunction<GrGLBindTextureProc> fBindTexture; |
| GrGLFunction<GrGLBindVertexArrayProc> fBindVertexArray; |
| GrGLFunction<GrGLBlendBarrierProc> fBlendBarrier; |
| GrGLFunction<GrGLBlendColorProc> fBlendColor; |
| GrGLFunction<GrGLBlendEquationProc> fBlendEquation; |
| GrGLFunction<GrGLBlendFuncProc> fBlendFunc; |
| GrGLFunction<GrGLBlitFramebufferProc> fBlitFramebuffer; |
| GrGLFunction<GrGLBufferDataProc> fBufferData; |
| GrGLFunction<GrGLBufferSubDataProc> fBufferSubData; |
| GrGLFunction<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus; |
| GrGLFunction<GrGLClearProc> fClear; |
| GrGLFunction<GrGLClearColorProc> fClearColor; |
| GrGLFunction<GrGLClearStencilProc> fClearStencil; |
| GrGLFunction<GrGLClearTexImageProc> fClearTexImage; |
| GrGLFunction<GrGLClearTexSubImageProc> fClearTexSubImage; |
| GrGLFunction<GrGLColorMaskProc> fColorMask; |
| GrGLFunction<GrGLCompileShaderProc> fCompileShader; |
| GrGLFunction<GrGLCompressedTexImage2DProc> fCompressedTexImage2D; |
| GrGLFunction<GrGLCompressedTexSubImage2DProc> fCompressedTexSubImage2D; |
| GrGLFunction<GrGLCopyTexSubImage2DProc> fCopyTexSubImage2D; |
| GrGLFunction<GrGLCreateProgramProc> fCreateProgram; |
| GrGLFunction<GrGLCreateShaderProc> fCreateShader; |
| GrGLFunction<GrGLCullFaceProc> fCullFace; |
| GrGLFunction<GrGLDeleteBuffersProc> fDeleteBuffers; |
| GrGLFunction<GrGLDeleteFramebuffersProc> fDeleteFramebuffers; |
| GrGLFunction<GrGLDeleteProgramProc> fDeleteProgram; |
| GrGLFunction<GrGLDeleteQueriesProc> fDeleteQueries; |
| GrGLFunction<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers; |
| GrGLFunction<GrGLDeleteShaderProc> fDeleteShader; |
| GrGLFunction<GrGLDeleteTexturesProc> fDeleteTextures; |
| GrGLFunction<GrGLDeleteVertexArraysProc> fDeleteVertexArrays; |
| GrGLFunction<GrGLDepthMaskProc> fDepthMask; |
| GrGLFunction<GrGLDisableProc> fDisable; |
| GrGLFunction<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray; |
| GrGLFunction<GrGLDrawArraysProc> fDrawArrays; |
| GrGLFunction<GrGLDrawArraysIndirectProc> fDrawArraysIndirect; |
| GrGLFunction<GrGLDrawArraysInstancedProc> fDrawArraysInstanced; |
| GrGLFunction<GrGLDrawBufferProc> fDrawBuffer; |
| GrGLFunction<GrGLDrawBuffersProc> fDrawBuffers; |
| GrGLFunction<GrGLDrawElementsProc> fDrawElements; |
| GrGLFunction<GrGLDrawElementsIndirectProc> fDrawElementsIndirect; |
| GrGLFunction<GrGLDrawElementsInstancedProc> fDrawElementsInstanced; |
| GrGLFunction<GrGLDrawRangeElementsProc> fDrawRangeElements; |
| GrGLFunction<GrGLEnableProc> fEnable; |
| GrGLFunction<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray; |
| GrGLFunction<GrGLEndQueryProc> fEndQuery; |
| GrGLFunction<GrGLFinishProc> fFinish; |
| GrGLFunction<GrGLFlushProc> fFlush; |
| GrGLFunction<GrGLFlushMappedBufferRangeProc> fFlushMappedBufferRange; |
| GrGLFunction<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer; |
| GrGLFunction<GrGLFramebufferTexture2DProc> fFramebufferTexture2D; |
| GrGLFunction<GrGLFramebufferTexture2DMultisampleProc> fFramebufferTexture2DMultisample; |
| GrGLFunction<GrGLFrontFaceProc> fFrontFace; |
| GrGLFunction<GrGLGenBuffersProc> fGenBuffers; |
| GrGLFunction<GrGLGenFramebuffersProc> fGenFramebuffers; |
| GrGLFunction<GrGLGenerateMipmapProc> fGenerateMipmap; |
| GrGLFunction<GrGLGenQueriesProc> fGenQueries; |
| GrGLFunction<GrGLGenRenderbuffersProc> fGenRenderbuffers; |
| GrGLFunction<GrGLGenTexturesProc> fGenTextures; |
| GrGLFunction<GrGLGenVertexArraysProc> fGenVertexArrays; |
| GrGLFunction<GrGLGetBufferParameterivProc> fGetBufferParameteriv; |
| GrGLFunction<GrGLGetErrorProc> fGetError; |
| GrGLFunction<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv; |
| GrGLFunction<GrGLGetIntegervProc> fGetIntegerv; |
| GrGLFunction<GrGLGetMultisamplefvProc> fGetMultisamplefv; |
| GrGLFunction<GrGLGetProgramBinaryProc> fGetProgramBinary; |
| GrGLFunction<GrGLGetProgramInfoLogProc> fGetProgramInfoLog; |
| GrGLFunction<GrGLGetProgramivProc> fGetProgramiv; |
| GrGLFunction<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v; |
| GrGLFunction<GrGLGetQueryObjectivProc> fGetQueryObjectiv; |
| GrGLFunction<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v; |
| GrGLFunction<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv; |
| GrGLFunction<GrGLGetQueryivProc> fGetQueryiv; |
| GrGLFunction<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv; |
| GrGLFunction<GrGLGetShaderInfoLogProc> fGetShaderInfoLog; |
| GrGLFunction<GrGLGetShaderivProc> fGetShaderiv; |
| GrGLFunction<GrGLGetShaderPrecisionFormatProc> fGetShaderPrecisionFormat; |
| GrGLFunction<GrGLGetStringProc> fGetString; |
| GrGLFunction<GrGLGetStringiProc> fGetStringi; |
| GrGLFunction<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv; |
| GrGLFunction<GrGLGetUniformLocationProc> fGetUniformLocation; |
| GrGLFunction<GrGLInsertEventMarkerProc> fInsertEventMarker; |
| GrGLFunction<GrGLInvalidateBufferDataProc> fInvalidateBufferData; |
| GrGLFunction<GrGLInvalidateBufferSubDataProc> fInvalidateBufferSubData; |
| GrGLFunction<GrGLInvalidateFramebufferProc> fInvalidateFramebuffer; |
| GrGLFunction<GrGLInvalidateSubFramebufferProc> fInvalidateSubFramebuffer; |
| GrGLFunction<GrGLInvalidateTexImageProc> fInvalidateTexImage; |
| GrGLFunction<GrGLInvalidateTexSubImageProc> fInvalidateTexSubImage; |
| GrGLFunction<GrGLIsTextureProc> fIsTexture; |
| GrGLFunction<GrGLLineWidthProc> fLineWidth; |
| GrGLFunction<GrGLLinkProgramProc> fLinkProgram; |
| GrGLFunction<GrGLProgramBinaryProc> fProgramBinary; |
| GrGLFunction<GrGLProgramParameteriProc> fProgramParameteri; |
| GrGLFunction<GrGLMapBufferProc> fMapBuffer; |
| GrGLFunction<GrGLMapBufferRangeProc> fMapBufferRange; |
| GrGLFunction<GrGLMapBufferSubDataProc> fMapBufferSubData; |
| GrGLFunction<GrGLMapTexSubImage2DProc> fMapTexSubImage2D; |
| GrGLFunction<GrGLMultiDrawArraysIndirectProc> fMultiDrawArraysIndirect; |
| GrGLFunction<GrGLMultiDrawElementsIndirectProc> fMultiDrawElementsIndirect; |
| GrGLFunction<GrGLPixelStoreiProc> fPixelStorei; |
| GrGLFunction<GrGLPolygonModeProc> fPolygonMode; |
| GrGLFunction<GrGLPopGroupMarkerProc> fPopGroupMarker; |
| GrGLFunction<GrGLPushGroupMarkerProc> fPushGroupMarker; |
| GrGLFunction<GrGLQueryCounterProc> fQueryCounter; |
| GrGLFunction<GrGLRasterSamplesProc> fRasterSamples; |
| GrGLFunction<GrGLReadBufferProc> fReadBuffer; |
| GrGLFunction<GrGLReadPixelsProc> fReadPixels; |
| GrGLFunction<GrGLRenderbufferStorageProc> fRenderbufferStorage; |
| |
| // On OpenGL ES there are multiple incompatible extensions that add support for MSAA |
| // and ES3 adds MSAA support to the standard. On an ES3 driver we may still use the |
| // older extensions for performance reasons or due to ES3 driver bugs. We want the function |
| // that creates the GrGLInterface to provide all available functions and internally |
| // we will select among them. They all have a method called glRenderbufferStorageMultisample*. |
| // So we have separate function pointers for GL_IMG/EXT_multisampled_to_texture, |
| // GL_CHROMIUM/ANGLE_framebuffer_multisample/ES3, and GL_APPLE_framebuffer_multisample |
| // variations. |
| // |
| // If a driver supports multiple GL_ARB_framebuffer_multisample-style extensions then we will |
| // assume the function pointers for the standard (or equivalent GL_ARB) version have |
| // been preferred over GL_EXT, GL_CHROMIUM, or GL_ANGLE variations that have reduced |
| // functionality. |
| |
| // GL_EXT_multisampled_render_to_texture (preferred) or GL_IMG_multisampled_render_to_texture |
| GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2EXT; |
| // GL_APPLE_framebuffer_multisample |
| GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2APPLE; |
| |
| // This is used to store the pointer for GL_ARB/EXT/ANGLE/CHROMIUM_framebuffer_multisample or |
| // the standard function in ES3+ or GL 3.0+. |
| GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample; |
| |
| // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension. |
| GrGLFunction<GrGLBindUniformLocationProc> fBindUniformLocation; |
| |
| GrGLFunction<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer; |
| GrGLFunction<GrGLScissorProc> fScissor; |
| GrGLFunction<GrGLShaderSourceProc> fShaderSource; |
| GrGLFunction<GrGLStencilFuncProc> fStencilFunc; |
| GrGLFunction<GrGLStencilFuncSeparateProc> fStencilFuncSeparate; |
| GrGLFunction<GrGLStencilMaskProc> fStencilMask; |
| GrGLFunction<GrGLStencilMaskSeparateProc> fStencilMaskSeparate; |
| GrGLFunction<GrGLStencilOpProc> fStencilOp; |
| GrGLFunction<GrGLStencilOpSeparateProc> fStencilOpSeparate; |
| GrGLFunction<GrGLTexBufferProc> fTexBuffer; |
| GrGLFunction<GrGLTexBufferRangeProc> fTexBufferRange; |
| GrGLFunction<GrGLTexImage2DProc> fTexImage2D; |
| GrGLFunction<GrGLTexParameteriProc> fTexParameteri; |
| GrGLFunction<GrGLTexParameterivProc> fTexParameteriv; |
| GrGLFunction<GrGLTexSubImage2DProc> fTexSubImage2D; |
| GrGLFunction<GrGLTexStorage2DProc> fTexStorage2D; |
| GrGLFunction<GrGLTextureBarrierProc> fTextureBarrier; |
| GrGLFunction<GrGLDiscardFramebufferProc> fDiscardFramebuffer; |
| GrGLFunction<GrGLUniform1fProc> fUniform1f; |
| GrGLFunction<GrGLUniform1iProc> fUniform1i; |
| GrGLFunction<GrGLUniform1fvProc> fUniform1fv; |
| GrGLFunction<GrGLUniform1ivProc> fUniform1iv; |
| GrGLFunction<GrGLUniform2fProc> fUniform2f; |
| GrGLFunction<GrGLUniform2iProc> fUniform2i; |
| GrGLFunction<GrGLUniform2fvProc> fUniform2fv; |
| GrGLFunction<GrGLUniform2ivProc> fUniform2iv; |
| GrGLFunction<GrGLUniform3fProc> fUniform3f; |
| GrGLFunction<GrGLUniform3iProc> fUniform3i; |
| GrGLFunction<GrGLUniform3fvProc> fUniform3fv; |
| GrGLFunction<GrGLUniform3ivProc> fUniform3iv; |
| GrGLFunction<GrGLUniform4fProc> fUniform4f; |
| GrGLFunction<GrGLUniform4iProc> fUniform4i; |
| GrGLFunction<GrGLUniform4fvProc> fUniform4fv; |
| GrGLFunction<GrGLUniform4ivProc> fUniform4iv; |
| GrGLFunction<GrGLUniformMatrix2fvProc> fUniformMatrix2fv; |
| GrGLFunction<GrGLUniformMatrix3fvProc> fUniformMatrix3fv; |
| GrGLFunction<GrGLUniformMatrix4fvProc> fUniformMatrix4fv; |
| GrGLFunction<GrGLUnmapBufferProc> fUnmapBuffer; |
| GrGLFunction<GrGLUnmapBufferSubDataProc> fUnmapBufferSubData; |
| GrGLFunction<GrGLUnmapTexSubImage2DProc> fUnmapTexSubImage2D; |
| GrGLFunction<GrGLUseProgramProc> fUseProgram; |
| GrGLFunction<GrGLVertexAttrib1fProc> fVertexAttrib1f; |
| GrGLFunction<GrGLVertexAttrib2fvProc> fVertexAttrib2fv; |
| GrGLFunction<GrGLVertexAttrib3fvProc> fVertexAttrib3fv; |
| GrGLFunction<GrGLVertexAttrib4fvProc> fVertexAttrib4fv; |
| GrGLFunction<GrGLVertexAttribDivisorProc> fVertexAttribDivisor; |
| GrGLFunction<GrGLVertexAttribIPointerProc> fVertexAttribIPointer; |
| GrGLFunction<GrGLVertexAttribPointerProc> fVertexAttribPointer; |
| GrGLFunction<GrGLViewportProc> fViewport; |
| |
| /* GL_NV_path_rendering */ |
| GrGLFunction<GrGLMatrixLoadfProc> fMatrixLoadf; |
| GrGLFunction<GrGLMatrixLoadIdentityProc> fMatrixLoadIdentity; |
| GrGLFunction<GrGLGetProgramResourceLocationProc> fGetProgramResourceLocation; |
| GrGLFunction<GrGLPathCommandsProc> fPathCommands; |
| GrGLFunction<GrGLPathParameteriProc> fPathParameteri; |
| GrGLFunction<GrGLPathParameterfProc> fPathParameterf; |
| GrGLFunction<GrGLGenPathsProc> fGenPaths; |
| GrGLFunction<GrGLDeletePathsProc> fDeletePaths; |
| GrGLFunction<GrGLIsPathProc> fIsPath; |
| GrGLFunction<GrGLPathStencilFuncProc> fPathStencilFunc; |
| GrGLFunction<GrGLStencilFillPathProc> fStencilFillPath; |
| GrGLFunction<GrGLStencilStrokePathProc> fStencilStrokePath; |
| GrGLFunction<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced; |
| GrGLFunction<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced; |
| GrGLFunction<GrGLCoverFillPathProc> fCoverFillPath; |
| GrGLFunction<GrGLCoverStrokePathProc> fCoverStrokePath; |
| GrGLFunction<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced; |
| GrGLFunction<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced; |
| // NV_path_rendering v1.2 |
| GrGLFunction<GrGLStencilThenCoverFillPathProc> fStencilThenCoverFillPath; |
| GrGLFunction<GrGLStencilThenCoverStrokePathProc> fStencilThenCoverStrokePath; |
| GrGLFunction<GrGLStencilThenCoverFillPathInstancedProc> fStencilThenCoverFillPathInstanced; |
| GrGLFunction<GrGLStencilThenCoverStrokePathInstancedProc> fStencilThenCoverStrokePathInstanced; |
| // NV_path_rendering v1.3 |
| GrGLFunction<GrGLProgramPathFragmentInputGenProc> fProgramPathFragmentInputGen; |
| // CHROMIUM_path_rendering |
| GrGLFunction<GrGLBindFragmentInputLocationProc> fBindFragmentInputLocation; |
| |
| /* NV_framebuffer_mixed_samples */ |
| GrGLFunction<GrGLCoverageModulationProc> fCoverageModulation; |
| |
| /* ARB_sample_shading */ |
| GrGLFunction<GrGLMinSampleShadingProc> fMinSampleShading; |
| |
| /* ARB_sync */ |
| GrGLFunction<GrGLFenceSyncProc> fFenceSync; |
| GrGLFunction<GrGLIsSyncProc> fIsSync; |
| GrGLFunction<GrGLClientWaitSyncProc> fClientWaitSync; |
| GrGLFunction<GrGLWaitSyncProc> fWaitSync; |
| GrGLFunction<GrGLDeleteSyncProc> fDeleteSync; |
| |
| /* ARB_internalforamt_query */ |
| GrGLFunction<GrGLGetInternalformativProc> fGetInternalformativ; |
| |
| /* KHR_debug */ |
| GrGLFunction<GrGLDebugMessageControlProc> fDebugMessageControl; |
| GrGLFunction<GrGLDebugMessageInsertProc> fDebugMessageInsert; |
| GrGLFunction<GrGLDebugMessageCallbackProc> fDebugMessageCallback; |
| GrGLFunction<GrGLGetDebugMessageLogProc> fGetDebugMessageLog; |
| GrGLFunction<GrGLPushDebugGroupProc> fPushDebugGroup; |
| GrGLFunction<GrGLPopDebugGroupProc> fPopDebugGroup; |
| GrGLFunction<GrGLObjectLabelProc> fObjectLabel; |
| |
| /* EXT_window_rectangles */ |
| GrGLFunction<GrGLWindowRectanglesProc> fWindowRectangles; |
| |
| /* EGL functions */ |
| GrGLFunction<GrEGLCreateImageProc> fEGLCreateImage; |
| GrGLFunction<GrEGLDestroyImageProc> fEGLDestroyImage; |
| } fFunctions; |
| |
| // This exists for internal testing. |
| virtual void abandon() const {} |
| }; |
| |
| #endif |