From ec4f898bce58755f9f72e0f95dbfaa8e7cbbaa26 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 9 Dec 2014 10:37:09 +0000 Subject: [PATCH] Moved local Extensions objects to GL2Extensions git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14582 16af8721-9629-0410-8352-f15c8da7e697 --- include/osg/BlendColor | 48 ------------------------- include/osg/BlendEquation | 19 +--------- include/osg/Capability | 9 ----- include/osg/GL2Extensions | 20 ++++++++++- src/osg/BlendColor.cpp | 72 ++------------------------------------ src/osg/BlendEquation.cpp | 28 +-------------- src/osg/BlendEquationi.cpp | 2 +- src/osg/Capability.cpp | 11 ++---- src/osg/GL2Extensions.cpp | 31 +++++++++++++++- 9 files changed, 57 insertions(+), 183 deletions(-) diff --git a/include/osg/BlendColor b/include/osg/BlendColor index f3932bb09..0c86bc1fc 100644 --- a/include/osg/BlendColor +++ b/include/osg/BlendColor @@ -20,7 +20,6 @@ #include - namespace osg { /** Encapsulates OpenGL blend/transparency state. */ @@ -66,53 +65,6 @@ class OSG_EXPORT BlendColor : public StateAttribute virtual void apply(State& state) const; - - - - /** Encapsulates queries of extension availability, obtains extension - * function pointers, and provides convenience wrappers for - * calling extension functions. */ - class OSG_EXPORT Extensions : public osg::Referenced - { - public: - Extensions(unsigned int contextID); - - Extensions(const Extensions& rhs); - - void lowestCommonDenominator(const Extensions& rhs); - - void setupGLExtensions(unsigned int contextID); - - void setBlendColorSupported(bool flag) { _isBlendColorSupported=flag; } - bool isBlendColorSupported() const { return _isBlendColorSupported; } - - void glBlendColor(GLclampf red , GLclampf green , GLclampf blue , GLclampf alpha) const; - - protected: - - ~Extensions() {} - - - typedef void (GL_APIENTRY * GLBlendColorProc) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); - bool _isBlendColorSupported; - GLBlendColorProc _glBlendColor; - - }; - - /** Returns the Extensions object for the given context. - * If createIfNotInitalized is true and the Extensions object doesn't - * exist, getExtensions() creates it on the given context. - * Returns NULL if createIfNotInitalized is false and the Extensions - * object doesn't exist. */ - static Extensions* getExtensions(unsigned int contextID,bool createIfNotInitalized); - - /** setExtensions() allows users to override the extensions across graphics contexts. - * Typically used when you have different extensions supported across graphics pipes, - * but need to ensure that they all use the same low common denominator extensions. */ - static void setExtensions(unsigned int contextID,Extensions* extensions); - - - protected : virtual ~BlendColor(); diff --git a/include/osg/BlendEquation b/include/osg/BlendEquation index 612dfd85f..2a37582ef 100644 --- a/include/osg/BlendEquation +++ b/include/osg/BlendEquation @@ -98,24 +98,7 @@ class OSG_EXPORT BlendEquation : public StateAttribute virtual void apply(State& state) const; - /** Encapsulates queries of extension availability, obtains extension function pointers. */ - struct OSG_EXPORT Extensions : public osg::Referenced - { - Extensions(unsigned int contextID); - - bool isBlendEquationSupported; - bool isBlendEquationSeparateSupported; - bool isSGIXMinMaxSupported; - bool isLogicOpSupported; - - void (GL_APIENTRY * glBlendEquation)(GLenum mode); - void (GL_APIENTRY * glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha); - - void (GL_APIENTRY * glBlendEquationi)(GLuint buf, GLenum mode); - void (GL_APIENTRY * glBlendEquationSeparatei)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); - }; - - protected : +protected : virtual ~BlendEquation(); diff --git a/include/osg/Capability b/include/osg/Capability index a195b1040..fbad6eaa6 100644 --- a/include/osg/Capability +++ b/include/osg/Capability @@ -103,15 +103,6 @@ class OSG_EXPORT Capabilityi : public osg::Capability /** Get the renderbuffer index of the Enablei. */ unsigned int getIndex() const { return _index; } - /** Encapsulates queries of extension availability, obtains extension function pointers. */ - struct OSG_EXPORT Extensions : public osg::Referenced - { - Extensions(unsigned int contextID); - - void (GL_APIENTRY * glEnablei) (GLenum capability, GLuint buf); - void (GL_APIENTRY * glDisablei) (GLenum capability, GLuint buf); - }; - protected: virtual ~Capabilityi(); diff --git a/include/osg/GL2Extensions b/include/osg/GL2Extensions index 41a65ffdf..f2a0520b9 100644 --- a/include/osg/GL2Extensions +++ b/include/osg/GL2Extensions @@ -598,7 +598,6 @@ class OSG_EXPORT GL2Extensions : public osg::Referenced bool isRectangleSupported; bool isCubeMapSupported; - void (GL_APIENTRY * glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha); void (GL_APIENTRY * glDrawBuffers)(GLsizei n, const GLenum *bufs); void (GL_APIENTRY * glStencilOpSeparate)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); void (GL_APIENTRY * glStencilFuncSeparate)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); @@ -912,6 +911,25 @@ class OSG_EXPORT GL2Extensions : public osg::Referenced GLint maxLayerCount; GLint max2DSize; + + // Blending + bool isBlendColorSupported; + bool isBlendEquationSupported; + bool isBlendEquationSeparateSupported; + bool isSGIXMinMaxSupported; + bool isLogicOpSupported; + + void (GL_APIENTRY * glBlendColor) (GLclampf red , GLclampf green , GLclampf blue , GLclampf alpha); + void (GL_APIENTRY * glBlendEquation)(GLenum mode); + void (GL_APIENTRY * glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha); + void (GL_APIENTRY * glBlendEquationi)(GLuint buf, GLenum mode); + void (GL_APIENTRY * glBlendEquationSeparatei)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); + + + // glEnablei/glDisabeli + void (GL_APIENTRY * glEnablei) (GLenum capability, GLuint buf); + void (GL_APIENTRY * glDisablei) (GLenum capability, GLuint buf); + }; } diff --git a/src/osg/BlendColor.cpp b/src/osg/BlendColor.cpp index 2b0a52148..879266311 100644 --- a/src/osg/BlendColor.cpp +++ b/src/osg/BlendColor.cpp @@ -35,78 +35,12 @@ BlendColor::~BlendColor() void BlendColor::apply(State& state) const { - // get the contextID (user defined ID of 0 upwards) for the - // current OpenGL context. - const unsigned int contextID = state.getContextID(); - - const Extensions* extensions = getExtensions(contextID,true); - - if (!extensions->isBlendColorSupported()) + const GL2Extensions* extensions = state.get(); + if (!extensions->isBlendColorSupported) { OSG_WARN<<"Warning: BlendColor::apply(..) failed, BlendColor is not support by OpenGL driver."<glBlendColor(_constantColor[0], _constantColor[1], - _constantColor[2], _constantColor[3]); + extensions->glBlendColor(_constantColor[0], _constantColor[1], _constantColor[2], _constantColor[3]); } - - - - - -typedef buffered_value< ref_ptr > BufferedExtensions; -static BufferedExtensions s_extensions; - -BlendColor::Extensions* BlendColor::getExtensions(unsigned int contextID,bool createIfNotInitalized) -{ - if (!s_extensions[contextID] && createIfNotInitalized) s_extensions[contextID] = new Extensions(contextID); - return s_extensions[contextID].get(); -} - -void BlendColor::setExtensions(unsigned int contextID,Extensions* extensions) -{ - s_extensions[contextID] = extensions; -} - - -BlendColor::Extensions::Extensions(unsigned int contextID) -{ - setupGLExtensions(contextID); -} - -BlendColor::Extensions::Extensions(const Extensions& rhs): - Referenced() -{ - _isBlendColorSupported = rhs._isBlendColorSupported; - _glBlendColor = rhs._glBlendColor; -} - -void BlendColor::Extensions::lowestCommonDenominator(const Extensions& rhs) -{ - if (!rhs._isBlendColorSupported) _isBlendColorSupported = false; - if (!rhs._glBlendColor) _glBlendColor = 0; -} - -void BlendColor::Extensions::setupGLExtensions(unsigned int contextID) -{ - _isBlendColorSupported = OSG_GLES2_FEATURES || OSG_GL3_FEATURES || - isGLExtensionSupported(contextID,"GL_EXT_blend_color") || - strncmp((const char*)glGetString(GL_VERSION),"1.2",3)>=0; - - setGLExtensionFuncPtr(_glBlendColor, "glBlendColor", "glBlendColorEXT"); -} - -void BlendColor::Extensions::glBlendColor(GLclampf red , GLclampf green , GLclampf blue , GLclampf alpha) const -{ - if (_glBlendColor) - { - _glBlendColor(red, green, blue, alpha); - } - else - { - OSG_WARN<<"Error: glBlendColor not supported by OpenGL driver"<= 0; - - - isBlendEquationSeparateSupported = bultInSupport || - isGLExtensionSupported(contextID, "GL_EXT_blend_equation_separate") || - strncmp((const char*)glGetString(GL_VERSION), "2.0", 3) >= 0; - - - isSGIXMinMaxSupported = isGLExtensionSupported(contextID, "GL_SGIX_blend_alpha_minmax"); - isLogicOpSupported = isGLExtensionSupported(contextID, "GL_EXT_blend_logic_op"); - - setGLExtensionFuncPtr(glBlendEquation, "glBlendEquation", "glBlendEquationEXT"); - setGLExtensionFuncPtr(glBlendEquationSeparate, "glBlendEquationSeparate", "glBlendEquationSeparateEXT"); - - setGLExtensionFuncPtr(glBlendEquationi, "glBlendEquationi", "glBlendEquationiARB"); - setGLExtensionFuncPtr(glBlendEquationSeparatei, "glBlendEquationSeparatei", "glBlendEquationSeparateiARB"); -} - BlendEquation::BlendEquation(): _equationRGB(FUNC_ADD), _equationAlpha(FUNC_ADD) @@ -69,7 +43,7 @@ BlendEquation::~BlendEquation() void BlendEquation::apply(State& state) const { - const Extensions* extensions = state.get(); + const GL2Extensions* extensions = state.get(); if (!extensions->isBlendEquationSupported) { diff --git a/src/osg/BlendEquationi.cpp b/src/osg/BlendEquationi.cpp index b4ae40dd8..e656d18d1 100644 --- a/src/osg/BlendEquationi.cpp +++ b/src/osg/BlendEquationi.cpp @@ -28,7 +28,7 @@ BlendEquationi::~BlendEquationi() void BlendEquationi::apply(State& state) const { - const Extensions* extensions = state.get(); + const GL2Extensions* extensions = state.get(); if (_equationRGB == _equationAlpha) { if (extensions->glBlendEquationi) diff --git a/src/osg/Capability.cpp b/src/osg/Capability.cpp index 1a6bee7c4..761b181c6 100644 --- a/src/osg/Capability.cpp +++ b/src/osg/Capability.cpp @@ -27,13 +27,6 @@ Capability::~Capability() { } - -Capabilityi::Extensions::Extensions(unsigned int contextID) -{ - setGLExtensionFuncPtr(glEnablei, "glEnablei"); - setGLExtensionFuncPtr(glDisablei, "glDisablei"); -} - Capabilityi::Capabilityi(): _index(0) { @@ -45,7 +38,7 @@ Capabilityi::~Capabilityi() void Enablei::apply(State& state) const { - const Extensions* extensions = state.get(); + const GL2Extensions* extensions = state.get(); if (extensions->glEnablei) { OSG_NOTICE<<"extensions->glEnablei("<<_capability<<", "<<_index<<")"<(); + const GL2Extensions* extensions = state.get(); if (extensions->glDisablei) { OSG_NOTICE<<"extensions->glDisablei("<<_capability<<", "<<_index<<")"<=0; + + setGLExtensionFuncPtr(glBlendColor, "glBlendColor", "glBlendColorEXT"); + + bool bultInSupport = OSG_GLES2_FEATURES || OSG_GL3_FEATURES; + isBlendEquationSupported = bultInSupport || + isGLExtensionSupported(contextID, "GL_EXT_blend_equation") || + strncmp((const char*)glGetString(GL_VERSION), "1.2", 3) >= 0; + + + isBlendEquationSeparateSupported = bultInSupport || + isGLExtensionSupported(contextID, "GL_EXT_blend_equation_separate") || + strncmp((const char*)glGetString(GL_VERSION), "2.0", 3) >= 0; + + + isSGIXMinMaxSupported = isGLExtensionSupported(contextID, "GL_SGIX_blend_alpha_minmax"); + isLogicOpSupported = isGLExtensionSupported(contextID, "GL_EXT_blend_logic_op"); + + setGLExtensionFuncPtr(glBlendEquation, "glBlendEquation", "glBlendEquationEXT"); + setGLExtensionFuncPtr(glBlendEquationSeparate, "glBlendEquationSeparate", "glBlendEquationSeparateEXT"); + + setGLExtensionFuncPtr(glBlendEquationi, "glBlendEquationi", "glBlendEquationiARB"); + setGLExtensionFuncPtr(glBlendEquationSeparatei, "glBlendEquationSeparatei", "glBlendEquationSeparateiARB"); + + // glEnablei/glDisabli + setGLExtensionFuncPtr(glEnablei, "glEnablei"); + setGLExtensionFuncPtr(glDisablei, "glDisablei"); }