diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/include/gpu/gl/GrGLInterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/include/gpu/gl/GrGLInterface.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,368 @@ +/* + * 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" + +//////////////////////////////////////////////////////////////////////////////// + +/** + * 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::Create. If NULL is + * passed to Create then a "default" GL interface is created. If the default is + * also NULL GrContext creation will fail. + * + * The default interface is returned by GrGLDefaultInterface. This function's + * implementation is platform-specific. Several have been provided, along with + * an implementation that simply returns NULL. + * + * By defining GR_GL_PER_GL_CALL_IFACE_CALLBACK to 1 the client can specify a + * callback function that will be called prior to each GL function call. See + * comments in GrGLConfig.h + */ + +struct GrGLInterface; + +const GrGLInterface* GrGLDefaultInterface(); + +/** + * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows, + * GLX on linux, AGL on Mac). The interface is only valid for the GL context + * that is current when the interface is created. + */ +const GrGLInterface* GrGLCreateNativeInterface(); + +#if SK_MESA +/** + * Creates a GrGLInterface for an OSMesa context. + */ +const GrGLInterface* GrGLCreateMesaInterface(); +#endif + +#if SK_ANGLE +/** + * Creates a GrGLInterface for an ANGLE context. + */ +const GrGLInterface* GrGLCreateANGLEInterface(); +#endif + +/** + * Creates a null GrGLInterface that doesn't draw anything. Used for measuring + * CPU overhead. + */ +const SK_API GrGLInterface* GrGLCreateNullInterface(); + +/** + * Creates a debugging GrGLInterface that doesn't draw anything. Used for + * finding memory leaks and invalid memory accesses. + */ +const GrGLInterface* GrGLCreateDebugInterface(); + +#if GR_GL_PER_GL_FUNC_CALLBACK +typedef void (*GrGLInterfaceCallbackProc)(const GrGLInterface*); +typedef intptr_t GrGLInterfaceCallbackData; +#endif + +/** Function that returns a new interface identical to "interface" but without support for + GL_NV_path_rendering. */ +const GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface*); + +/** Function that returns a new interface identical to "interface" but with support for + test version of GL_EXT_debug_marker. */ +const GrGLInterface* GrGLInterfaceAddTestDebugMarker(const GrGLInterface*, + GrGLInsertEventMarkerProc insertEventMarkerFn, + GrGLPushGroupMarkerProc pushGroupMarkerFn, + GrGLPopGroupMarkerProc popGroupMarkerFn); + +/** + * 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: + // simple wrapper class that exists only to initialize a pointer to NULL + template class GLPtr { + public: + GLPtr() : fPtr(NULL) {} + GLPtr operator=(FNPTR_TYPE ptr) { fPtr = ptr; return *this; } + operator FNPTR_TYPE() const { return fPtr; } + private: + FNPTR_TYPE fPtr; + }; + + // This is a temporary workaround to keep Chromium's GrGLInterface factories compiling until + // they're updated to use the Functions struct. + template class GLPtrAlias { + public: + GLPtrAlias(GLPtr* base) : fBase(base) {} + void operator=(FNPTR_TYPE ptr) { *fBase = ptr; } + private: + GLPtr* fBase; + }; + + typedef SkRefCnt INHERITED; + +public: + SK_DECLARE_INST_COUNT(GrGLInterface) + + GrGLInterface(); + + static GrGLInterface* NewClone(const 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 { + GLPtr fActiveTexture; + GLPtr fAttachShader; + GLPtr fBeginQuery; + GLPtr fBindAttribLocation; + GLPtr fBindBuffer; + GLPtr fBindFragDataLocation; + GLPtr fBindFragDataLocationIndexed; + GLPtr fBindFramebuffer; + GLPtr fBindRenderbuffer; + GLPtr fBindTexture; + GLPtr fBindVertexArray; + GLPtr fBlendColor; + GLPtr fBlendFunc; + GLPtr fBlitFramebuffer; + GLPtr fBufferData; + GLPtr fBufferSubData; + GLPtr fCheckFramebufferStatus; + GLPtr fClear; + GLPtr fClearColor; + GLPtr fClearStencil; + GLPtr fColorMask; + GLPtr fCompileShader; + GLPtr fCompressedTexImage2D; + GLPtr fCopyTexSubImage2D; + GLPtr fCreateProgram; + GLPtr fCreateShader; + GLPtr fCullFace; + GLPtr fDeleteBuffers; + GLPtr fDeleteFramebuffers; + GLPtr fDeleteProgram; + GLPtr fDeleteQueries; + GLPtr fDeleteRenderbuffers; + GLPtr fDeleteShader; + GLPtr fDeleteTextures; + GLPtr fDeleteVertexArrays; + GLPtr fDepthMask; + GLPtr fDisable; + GLPtr fDisableVertexAttribArray; + GLPtr fDrawArrays; + GLPtr fDrawBuffer; + GLPtr fDrawBuffers; + GLPtr fDrawElements; + GLPtr fEnable; + GLPtr fEnableVertexAttribArray; + GLPtr fEndQuery; + GLPtr fFinish; + GLPtr fFlush; + GLPtr fFramebufferRenderbuffer; + GLPtr fFramebufferTexture2D; + GLPtr fFramebufferTexture2DMultisample; + GLPtr fFrontFace; + GLPtr fGenBuffers; + GLPtr fGenFramebuffers; + GLPtr fGenerateMipmap; + GLPtr fGenQueries; + GLPtr fGenRenderbuffers; + GLPtr fGenTextures; + GLPtr fGenVertexArrays; + GLPtr fGetBufferParameteriv; + GLPtr fGetError; + GLPtr fGetFramebufferAttachmentParameteriv; + GLPtr fGetIntegerv; + GLPtr fGetQueryObjecti64v; + GLPtr fGetQueryObjectiv; + GLPtr fGetQueryObjectui64v; + GLPtr fGetQueryObjectuiv; + GLPtr fGetQueryiv; + GLPtr fGetProgramInfoLog; + GLPtr fGetProgramiv; + GLPtr fGetRenderbufferParameteriv; + GLPtr fGetShaderInfoLog; + GLPtr fGetShaderiv; + GLPtr fGetString; + GLPtr fGetStringi; + GLPtr fGetTexLevelParameteriv; + GLPtr fGetUniformLocation; + GLPtr fInsertEventMarker; + GLPtr fLineWidth; + GLPtr fLinkProgram; + GLPtr fLoadIdentity; + GLPtr fLoadMatrixf; + GLPtr fMapBuffer; + GLPtr fMatrixMode; + GLPtr fPixelStorei; + GLPtr fPopGroupMarker; + GLPtr fPushGroupMarker; + GLPtr fQueryCounter; + GLPtr fReadBuffer; + GLPtr fReadPixels; + GLPtr 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 + GLPtr fRenderbufferStorageMultisampleES2EXT; + // GL_APPLE_framebuffer_multisample + GLPtr 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+. + GLPtr fRenderbufferStorageMultisample; + + // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension. + GLPtr fBindUniformLocation; + + GLPtr fResolveMultisampleFramebuffer; + GLPtr fScissor; + GLPtr fShaderSource; + GLPtr fStencilFunc; + GLPtr fStencilFuncSeparate; + GLPtr fStencilMask; + GLPtr fStencilMaskSeparate; + GLPtr fStencilOp; + GLPtr fStencilOpSeparate; + GLPtr fTexGenfv; + GLPtr fTexGeni; + GLPtr fTexImage2D; + GLPtr fTexParameteri; + GLPtr fTexParameteriv; + GLPtr fTexSubImage2D; + GLPtr fTexStorage2D; + GLPtr fDiscardFramebuffer; + GLPtr fUniform1f; + GLPtr fUniform1i; + GLPtr fUniform1fv; + GLPtr fUniform1iv; + GLPtr fUniform2f; + GLPtr fUniform2i; + GLPtr fUniform2fv; + GLPtr fUniform2iv; + GLPtr fUniform3f; + GLPtr fUniform3i; + GLPtr fUniform3fv; + GLPtr fUniform3iv; + GLPtr fUniform4f; + GLPtr fUniform4i; + GLPtr fUniform4fv; + GLPtr fUniform4iv; + GLPtr fUniformMatrix2fv; + GLPtr fUniformMatrix3fv; + GLPtr fUniformMatrix4fv; + GLPtr fUnmapBuffer; + GLPtr fUseProgram; + GLPtr fVertexAttrib4fv; + GLPtr fVertexAttribPointer; + GLPtr fViewport; + + // Experimental: Functions for GL_NV_path_rendering. These will be + // alphabetized with the above functions once this is fully supported + // (and functions we are unlikely to use will possibly be omitted). + GLPtr fPathCommands; + GLPtr fPathCoords; + GLPtr fPathSubCommands; + GLPtr fPathSubCoords; + GLPtr fPathString; + GLPtr fPathGlyphs; + GLPtr fPathGlyphRange; + GLPtr fWeightPaths; + GLPtr fCopyPath; + GLPtr fInterpolatePaths; + GLPtr fTransformPath; + GLPtr fPathParameteriv; + GLPtr fPathParameteri; + GLPtr fPathParameterfv; + GLPtr fPathParameterf; + GLPtr fPathDashArray; + GLPtr fGenPaths; + GLPtr fDeletePaths; + GLPtr fIsPath; + GLPtr fPathStencilFunc; + GLPtr fPathStencilDepthOffset; + GLPtr fStencilFillPath; + GLPtr fStencilStrokePath; + GLPtr fStencilFillPathInstanced; + GLPtr fStencilStrokePathInstanced; + GLPtr fPathCoverDepthFunc; + GLPtr fPathColorGen; + GLPtr fPathTexGen; + GLPtr fPathFogGen; + GLPtr fCoverFillPath; + GLPtr fCoverStrokePath; + GLPtr fCoverFillPathInstanced; + GLPtr fCoverStrokePathInstanced; + GLPtr fGetPathParameteriv; + GLPtr fGetPathParameterfv; + GLPtr fGetPathCommands; + GLPtr fGetPathCoords; + GLPtr fGetPathDashArray; + GLPtr fGetPathMetrics; + GLPtr fGetPathMetricRange; + GLPtr fGetPathSpacing; + GLPtr fGetPathColorGeniv; + GLPtr fGetPathColorGenfv; + GLPtr fGetPathTexGeniv; + GLPtr fGetPathTexGenfv; + GLPtr fIsPointInFillPath; + GLPtr fIsPointInStrokePath; + GLPtr fGetPathLength; + GLPtr fPointAlongPath; + } fFunctions; + + // Per-GL func callback +#if GR_GL_PER_GL_FUNC_CALLBACK + GrGLInterfaceCallbackProc fCallback; + GrGLInterfaceCallbackData fCallbackData; +#endif +}; + +#endif