MOved SampleMaski::Extensions into osg::GL2Extensions

git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14577 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
Robert Osfield 2014-12-07 17:31:49 +00:00
parent 9b03b3f8ce
commit bc424bc54f
5 changed files with 36 additions and 178 deletions

View File

@ -43,21 +43,21 @@
void create_specular_highlights(osg::Node *node) void create_specular_highlights(osg::Node *node)
{ {
osg::StateSet *ss = node->getOrCreateStateSet(); osg::StateSet *ss = node->getOrCreateStateSet();
// create and setup the texture object // create and setup the texture object
osg::TextureCubeMap *tcm = new osg::TextureCubeMap; osg::TextureCubeMap *tcm = new osg::TextureCubeMap;
tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP); tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP);
tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP); tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP);
tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP); tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP);
tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR); tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
// generate the six highlight map images (light direction = [1, 1, -1]) // generate the six highlight map images (light direction = [1, 1, -1])
osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator( osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator(
osg::Vec3(1, 1, -1), // light direction osg::Vec3(1, 1, -1), // light direction
osg::Vec4(1, 0.9f, 0.8f, 1), // light color osg::Vec4(1, 0.9f, 0.8f, 1), // light color
8); // specular exponent 8); // specular exponent
mapgen->generateMap(); mapgen->generateMap();
// assign the six images to the texture object // assign the six images to the texture object
@ -77,7 +77,7 @@ void create_specular_highlights(osg::Node *node)
ss->setTextureAttributeAndModes(0, tg, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); ss->setTextureAttributeAndModes(0, tg, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
// use TexEnvCombine to add the highlights to the original lighting // use TexEnvCombine to add the highlights to the original lighting
osg::TexEnvCombine *te = new osg::TexEnvCombine; osg::TexEnvCombine *te = new osg::TexEnvCombine;
te->setCombine_RGB(osg::TexEnvCombine::ADD); te->setCombine_RGB(osg::TexEnvCombine::ADD);
te->setSource0_RGB(osg::TexEnvCombine::TEXTURE); te->setSource0_RGB(osg::TexEnvCombine::TEXTURE);
te->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR); te->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR);
@ -93,7 +93,7 @@ int main(int argc, char *argv[])
// construct the viewer. // construct the viewer.
osgViewer::Viewer viewer; osgViewer::Viewer viewer;
// load the nodes from the commandline arguments. // load the nodes from the commandline arguments.
osg::Node* rootnode = osgDB::readNodeFiles(arguments); osg::Node* rootnode = osgDB::readNodeFiles(arguments);
@ -108,32 +108,16 @@ int main(int argc, char *argv[])
// create specular highlights // create specular highlights
create_specular_highlights(rootnode); create_specular_highlights(rootnode);
// run optimization over the scene graph // run optimization over the scene graph
osgUtil::Optimizer optimzer; osgUtil::Optimizer optimzer;
optimzer.optimize(rootnode); optimzer.optimize(rootnode);
// add a viewport to the viewer and attach the scene graph. // add a viewport to the viewer and attach the scene graph.
viewer.setSceneData(rootnode); viewer.setSceneData(rootnode);
// create the windows and run the threads. // create the windows and run the threads.
viewer.realize(); viewer.realize();
// now check to see if texture cube map is supported.
for(unsigned int contextID = 0;
contextID<osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts();
++contextID)
{
osg::TextureCubeMap::Extensions* tcmExt = osg::TextureCubeMap::getExtensions(contextID,false);
if (tcmExt)
{
if (!tcmExt->isCubeMapSupported())
{
std::cout<<"Warning: texture_cube_map not supported by OpenGL drivers, unable to run application."<<std::endl;
return 1;
}
}
}
return viewer.run(); return viewer.run();
} }

View File

@ -805,33 +805,8 @@ class OSG_EXPORT GL2Extensions : public osg::Referenced
void (GL_APIENTRY * glMultiTexCoord2dv) (GLenum target,const GLdouble* coord); void (GL_APIENTRY * glMultiTexCoord2dv) (GLenum target,const GLdouble* coord);
void (GL_APIENTRY * glMultiTexCoord3dv) (GLenum target,const GLdouble* coord); void (GL_APIENTRY * glMultiTexCoord3dv) (GLenum target,const GLdouble* coord);
void (GL_APIENTRY * glMultiTexCoord4dv) (GLenum target,const GLdouble* coord); void (GL_APIENTRY * glMultiTexCoord4dv) (GLenum target,const GLdouble* coord);
#if 0
void (GL_APIENTRY * glVertexAttrib1s) (unsigned int index, GLshort s);
void (GL_APIENTRY * glVertexAttrib1f) (unsigned int index, GLfloat f);
void (GL_APIENTRY * glVertexAttrib1d) (unsigned int index, GLdouble f);
void (GL_APIENTRY * glVertexAttrib2fv) (unsigned int index, const GLfloat * v);
void (GL_APIENTRY * glVertexAttrib3fv) (unsigned int index, const GLfloat * v);
void (GL_APIENTRY * glVertexAttrib4fv) (unsigned int index, const GLfloat * v);
void (GL_APIENTRY * glVertexAttrib2dv) (unsigned int index, const GLdouble * v);
void (GL_APIENTRY * glVertexAttrib3dv) (unsigned int index, const GLdouble * v);
void (GL_APIENTRY * glVertexAttrib4dv) (unsigned int index, const GLdouble * v);
void (GL_APIENTRY * glVertexAttrib4ubv) (unsigned int index, const GLubyte * v);
void (GL_APIENTRY * glVertexAttrib4Nubv) (unsigned int index, const GLubyte * v);
void (GL_APIENTRY * glGenBuffers) (GLsizei n, GLuint *buffers);
void (GL_APIENTRY * glBindBuffer (GLenum target, GLuint buffer);
void (GL_APIENTRY * glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
void (GL_APIENTRY * glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
void (GL_APIENTRY * glDeleteBuffers (GLsizei n, const GLuint *buffers);
GLboolean (GL_APIENTRY * glIsBuffer (GLuint buffer);
void (GL_APIENTRY * glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
GLvoid* (GL_APIENTRY * glMapBuffer (GLenum target, GLenum access);
GLboolean (GL_APIENTRY * glUnmapBuffer (GLenum target);
void (GL_APIENTRY * glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
void (GL_APIENTRY * glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params);
#endif
// Occlusion Query extensions
void (GL_APIENTRY * glGenOcclusionQueries) ( GLsizei n, GLuint *ids ); void (GL_APIENTRY * glGenOcclusionQueries) ( GLsizei n, GLuint *ids );
void (GL_APIENTRY * glDeleteOcclusionQueries) ( GLsizei n, const GLuint *ids ); void (GL_APIENTRY * glDeleteOcclusionQueries) ( GLsizei n, const GLuint *ids );
GLboolean (GL_APIENTRY * glIsOcclusionQuery) ( GLuint id ); GLboolean (GL_APIENTRY * glIsOcclusionQuery) ( GLuint id );
@ -852,6 +827,14 @@ class OSG_EXPORT GL2Extensions : public osg::Referenced
void (GL_APIENTRY * glGetQueryObjectui64v) (GLuint id, GLenum pname, GLuint64 *params); void (GL_APIENTRY * glGetQueryObjectui64v) (GLuint id, GLenum pname, GLuint64 *params);
void (GL_APIENTRY * glGetInteger64v) (GLenum pname, GLint64 *params); void (GL_APIENTRY * glGetInteger64v) (GLenum pname, GLint64 *params);
// SampleMaski functionality
bool isOpenGL32upported;
bool isTextureMultisampleSupported;
bool isSampleMaskiSupported;
void (GL_APIENTRY * glSampleMaski) (GLuint maskNumber, GLbitfield mask);
}; };
} }

View File

@ -18,7 +18,7 @@
namespace osg { namespace osg {
/** /**
* osg::SampleMaski does nothing if OpenGL 3.2 or ARB_texture_multisample are not available. * osg::SampleMaski does nothing if OpenGL 3.2 or ARB_texture_multisample are not available.
*/ */
class OSG_EXPORT SampleMaski : public StateAttribute class OSG_EXPORT SampleMaski : public StateAttribute
@ -34,54 +34,13 @@ class OSG_EXPORT SampleMaski : public StateAttribute
/** return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs.*/ /** return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs.*/
virtual int compare(const StateAttribute& sa) const; virtual int compare(const StateAttribute& sa) const;
inline void setMask(unsigned int mask, unsigned int maskNumber = 0u ) { _sampleMask[maskNumber] = mask; } inline void setMask(unsigned int mask, unsigned int maskNumber = 0u ) { _sampleMask[maskNumber] = mask; }
inline unsigned int getMask(unsigned int maskNumber = 0u) const { return _sampleMask[maskNumber]; } inline unsigned int getMask(unsigned int maskNumber = 0u) const { return _sampleMask[maskNumber]; }
virtual void apply(State& state) const; virtual void apply(State& state) const;
public:
/** Extensions class which encapsulates the querying of extensions and
* associated function pointers, and provide convenience wrappers to
* check for the extensions or use the associated 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);
bool isOpenGL32upported() const { return _isOpenGL32upported; }
bool isTextureMultisampleSupported() const { return _isTextureMultisampleSupported; }
bool isSampleMaskiSupported() const { return _isSampleMaskiSupported; }
void glSampleMaski(GLuint maskNumber, GLbitfield mask) const;
protected:
~Extensions() {}
bool _isOpenGL32upported;
bool _isTextureMultisampleSupported;
bool _isSampleMaskiSupported;
typedef void (GL_APIENTRY * SampleMaski) ( GLuint maskNumber, GLbitfield mask );
SampleMaski _glSampleMaski;
};
static Extensions* getExtensions(unsigned int contextID,bool createIfNotInitalized);
static void setExtensions(unsigned int contextID,Extensions* extensions);
protected: protected:
virtual ~SampleMaski(); virtual ~SampleMaski();

View File

@ -388,6 +388,15 @@ GL2Extensions::GL2Extensions(unsigned int contextID)
setGLExtensionFuncPtr(glQueryCounter, "glQueryCounter"); setGLExtensionFuncPtr(glQueryCounter, "glQueryCounter");
setGLExtensionFuncPtr(glGetInteger64v, "glGetInteger64v"); setGLExtensionFuncPtr(glGetInteger64v, "glGetInteger64v");
// SampleMaski functionality
isTextureMultisampleSupported = isGLExtensionSupported(contextID, "GL_ARB_texture_multisample");
isOpenGL32upported = getGLVersionNumber() >= 3.2;
// function pointers
setGLExtensionFuncPtr(glSampleMaski, "glSampleMaski");
// protect against buggy drivers (maybe not necessary)
isSampleMaskiSupported = glSampleMaski!=0;
} }

View File

@ -51,93 +51,16 @@ int SampleMaski::compare(const StateAttribute& sa) const
void SampleMaski::apply(State& state) const void SampleMaski::apply(State& state) const
{ {
// get "per-context" extensions // get "per-context" extensions
const unsigned int contextID = state.getContextID(); const GL2Extensions* extensions = state.get<GL2Extensions>();
const Extensions* extensions = getExtensions(contextID,true);
if ( (extensions->isTextureMultisampleSupported) || (extensions->isOpenGL32upported) || (extensions->isSampleMaskiSupported) )
if ( (extensions->isTextureMultisampleSupported()) || (extensions->isOpenGL32upported()) || (extensions->isSampleMaskiSupported()) )
{ {
extensions->glSampleMaski(0u, _sampleMask[0u]); extensions->glSampleMaski(0u, _sampleMask[0u]);
//For now we use only 32-bit Sample mask //For now we use only 32-bit Sample mask
// extensions->glSampleMaski(1u, _sampleMask[1u]); // extensions->glSampleMaski(1u, _sampleMask[1u]);
return; return;
} }
OSG_WARN << "SampleMaski failed as the required graphics capabilities were\n" OSG_WARN << "SampleMaski failed as the required graphics capabilities were not found. \n"
" not found (contextID " << contextID << "). OpenGL 3.2 or \n" "OpenGL 3.2 or ARB_texture_multisample extension is required." << std::endl;
" ARB_texture_multisample extension is required." << std::endl;
} }
typedef buffered_value< ref_ptr<SampleMaski::Extensions> > BufferedExtensions;
static BufferedExtensions s_extensions;
SampleMaski::Extensions* SampleMaski::getExtensions(unsigned int contextID,bool createIfNotInitalized)
{
if (!s_extensions[contextID] && createIfNotInitalized) s_extensions[contextID] = new Extensions(contextID);
return s_extensions[contextID].get();
}
void SampleMaski::setExtensions(unsigned int contextID,Extensions* extensions)
{
s_extensions[contextID] = extensions;
}
SampleMaski::Extensions::Extensions(unsigned int contextID)
{
setupGLExtensions(contextID);
}
SampleMaski::Extensions::Extensions(const Extensions& rhs):
Referenced()
{
_isTextureMultisampleSupported = rhs._isTextureMultisampleSupported;
_isOpenGL32upported = rhs._isOpenGL32upported;
_isSampleMaskiSupported = rhs._isSampleMaskiSupported;
_glSampleMaski = rhs._glSampleMaski;
}
void SampleMaski::Extensions::lowestCommonDenominator(const Extensions& rhs)
{
if (!rhs._isTextureMultisampleSupported) _isTextureMultisampleSupported = false;
if (!rhs._isOpenGL32upported) _isOpenGL32upported = false;
if (!rhs._isSampleMaskiSupported) _isSampleMaskiSupported = false;
if (!rhs._glSampleMaski) _glSampleMaski = NULL;
}
void SampleMaski::Extensions::setupGLExtensions(unsigned int contextID)
{
// extension support
_isTextureMultisampleSupported = isGLExtensionSupported(contextID, "GL_ARB_texture_multisample");
_isOpenGL32upported = getGLVersionNumber() >= 3.2;
// function pointers
setGLExtensionFuncPtr(_glSampleMaski, "glSampleMaski");
// protect against buggy drivers (maybe not necessary)
if (!_glSampleMaski) _isSampleMaskiSupported = false;
// notify
if( _isOpenGL32upported )
{
OSG_INFO << "SampleMaski is going to use OpenGL 3.2 API (contextID " << contextID << ")." << std::endl;
}
else if( _isTextureMultisampleSupported )
{
OSG_INFO << "SampleMaski is going to use GL_ARB_texture_multisample extension (contextID " << contextID << ")." << std::endl;
}
else
{
OSG_INFO << "SampleMaski did not found required graphics capabilities\n"
" (contextID " << contextID << "). OpenGL 3.2 or \n"
" GL_ARB_texture_multisample extension is required." << std::endl;
}
}
void SampleMaski::Extensions::glSampleMaski(GLuint maskNumber, GLbitfield mask) const
{
_glSampleMaski(maskNumber, mask);
}