diff --git a/include/osg/BlendEquation b/include/osg/BlendEquation index d0da4b087..83af8a7b3 100644 --- a/include/osg/BlendEquation +++ b/include/osg/BlendEquation @@ -97,57 +97,21 @@ class OSG_EXPORT BlendEquation : public StateAttribute inline Equation getEquationAlpha() const { return _equationAlpha; } 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 + + /** Encapsulates queries of extension availability, obtains extension function pointers. */ + struct OSG_EXPORT Extensions : public osg::Referenced { - public: - Extensions(unsigned int contextID); + Extensions(unsigned int contextID); - Extensions(const Extensions& rhs); + bool isBlendEquationSupported; + bool isBlendEquationSeparateSupported; + bool isSGIXMinMaxSupported; + bool isLogicOpSupported; - void lowestCommonDenominator(const Extensions& rhs); - - void setupGLExtensions(unsigned int contextID); - - bool isBlendEquationSupported() const { return _isBlendEquationSupported; } - bool isBlendEquationSeparateSupported() const { return _isBlendEquationSeparateSupported; } - bool isSGIXMinMaxSupported() const { return _isSGIXMinMaxSupported; } - bool isLogicOpSupported() const { return _isLogicOpSupported; } - - void glBlendEquation(GLenum mode) const; - void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) const; - - protected: - - ~Extensions() {} - - typedef void (GL_APIENTRY * GLBlendEquationProc)(GLenum mode); - typedef void (GL_APIENTRY * GLBlendEquationSeparateProc)(GLenum modeRGB, GLenum modeAlpha); - - bool _isBlendEquationSupported; - bool _isBlendEquationSeparateSupported; - bool _isSGIXMinMaxSupported; - bool _isLogicOpSupported; - - GLBlendEquationProc _glBlendEquation; - GLBlendEquationSeparateProc _glBlendEquationSeparate; + void (GL_APIENTRY * glBlendEquation)(GLenum mode); + void (GL_APIENTRY * glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha); }; - /** 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 ~BlendEquation(); diff --git a/include/osg/BlendFunc b/include/osg/BlendFunc index ec73cf8e9..a57e2e7d4 100644 --- a/include/osg/BlendFunc +++ b/include/osg/BlendFunc @@ -159,22 +159,13 @@ class OSG_EXPORT BlendFunc : 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. */ - struct Extensions : public osg::Referenced + /** Encapsulates queries of extension availability, obtains extension function pointers. */ + struct OSG_EXPORT Extensions : public osg::Referenced { - bool isBlendFuncSeparateSupported; + Extensions(unsigned int contextID); + + bool isBlendFuncSeparateSupported; void (GL_APIENTRY * glBlendFuncSeparate) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) ; - - Extensions(unsigned int contextID) - { - isBlendFuncSeparateSupported = OSG_GLES2_FEATURES || OSG_GL3_FEATURES || - osg::isGLExtensionSupported(contextID, "GL_EXT_blend_func_separate") || - strncmp((const char*)glGetString(GL_VERSION), "1.4", 3) >= 0; - - setGLExtensionFuncPtr(glBlendFuncSeparate, "glBlendFuncSeparate", "glBlendFuncSeparateEXT"); - } }; diff --git a/src/osg/BlendEquation.cpp b/src/osg/BlendEquation.cpp index efb2a4682..e328cd672 100644 --- a/src/osg/BlendEquation.cpp +++ b/src/osg/BlendEquation.cpp @@ -19,6 +19,29 @@ using namespace osg; + +// Set up extensions +BlendEquation::Extensions::Extensions(unsigned int contextID) +{ + + 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"); +} + BlendEquation::BlendEquation(): _equationRGB(FUNC_ADD), _equationAlpha(FUNC_ADD) @@ -43,37 +66,36 @@ BlendEquation::~BlendEquation() void BlendEquation::apply(State& state) const { + const Extensions* extensions = state.get(); - // 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->isBlendEquationSupported()) + if (!extensions->isBlendEquationSupported) { OSG_WARN<<"Warning: BlendEquation::apply(..) failed, BlendEquation is not support by OpenGL driver."<isSGIXMinMaxSupported()) + if((_equationRGB == ALPHA_MIN || _equationRGB == ALPHA_MAX) && !extensions->isSGIXMinMaxSupported) { OSG_WARN<<"Warning: BlendEquation::apply(..) failed, SGIX_blend_alpha_minmax extension is not supported by OpenGL driver." << std::endl; return; } - if(_equationRGB == LOGIC_OP && !extensions->isLogicOpSupported()) + if(_equationRGB == LOGIC_OP && !extensions->isLogicOpSupported) { OSG_WARN<<"Warning: BlendEquation::apply(..) failed, EXT_blend_logic_op extension is not supported by OpenGL driver." << std::endl; return; } if (_equationRGB == _equationAlpha) + { extensions->glBlendEquation(static_cast(_equationRGB)); + } else { - if (extensions->isBlendEquationSeparateSupported()) + if (extensions->isBlendEquationSeparateSupported) + { extensions->glBlendEquationSeparate(static_cast(_equationRGB), static_cast(_equationAlpha)); + } else { OSG_WARN<<"Warning: BlendEquation::apply(..) failed, EXT_blend_equation_separate extension is not supported by OpenGL driver." << std::endl; @@ -81,86 +103,3 @@ void BlendEquation::apply(State& state) const } } } - - -typedef buffered_value< ref_ptr > BufferedExtensions; -static BufferedExtensions s_extensions; - -BlendEquation::Extensions* BlendEquation::getExtensions(unsigned int contextID,bool createIfNotInitalized) -{ - if (!s_extensions[contextID] && createIfNotInitalized) s_extensions[contextID] = new Extensions(contextID); - return s_extensions[contextID].get(); -} - -void BlendEquation::setExtensions(unsigned int contextID,Extensions* extensions) -{ - s_extensions[contextID] = extensions; -} - - -BlendEquation::Extensions::Extensions(unsigned int contextID) -{ - setupGLExtensions(contextID); -} - -BlendEquation::Extensions::Extensions(const Extensions& rhs): - Referenced() -{ - _isBlendEquationSupported = rhs._isBlendEquationSupported; - _isBlendEquationSeparateSupported = rhs._isBlendEquationSeparateSupported; - _isSGIXMinMaxSupported = rhs._isSGIXMinMaxSupported; - _isLogicOpSupported = rhs._isLogicOpSupported; - _glBlendEquation = rhs._glBlendEquation; - _glBlendEquationSeparate = rhs._glBlendEquationSeparate; -} - -void BlendEquation::Extensions::lowestCommonDenominator(const Extensions& rhs) -{ - if (!rhs._isBlendEquationSupported) _isBlendEquationSupported = false; - if (!rhs._glBlendEquation) _glBlendEquation = 0; - if (!rhs._isBlendEquationSeparateSupported) _isBlendEquationSeparateSupported = false; - if (!rhs._glBlendEquationSeparate) _glBlendEquationSeparate = 0; -} - -void BlendEquation::Extensions::setupGLExtensions(unsigned int contextID) -{ - 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"); -} - -void BlendEquation::Extensions::glBlendEquation(GLenum mode) const -{ - if (_glBlendEquation) - { - _glBlendEquation(mode); - } - else - { - OSG_WARN<<"Error: glBlendEquation not supported by OpenGL driver"<= 0; + + setGLExtensionFuncPtr(glBlendFuncSeparate, "glBlendFuncSeparate", "glBlendFuncSeparateEXT"); +} + BlendFunc::BlendFunc(): _source_factor(SRC_ALPHA), _destination_factor(ONE_MINUS_SRC_ALPHA),