2005-04-15 05:41:28 +08:00
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield
2003-01-22 00:45:36 +08:00
*
* This library is open source and may be redistributed and / or modified under
* the terms of the OpenSceneGraph Public License ( OSGPL ) version 0.0 or
* ( at your option ) any later version . The full license is in LICENSE file
* included with this distribution , and on the openscenegraph . org website .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* OpenSceneGraph Public License for more details .
*/
2002-08-28 23:44:03 +08:00
# include <osg/GLExtensions>
2001-10-22 05:27:40 +08:00
# include <osg/GL>
2002-08-26 18:24:01 +08:00
# include <osg/GLU>
2001-10-22 05:27:40 +08:00
# include <osg/Notify>
2005-04-26 21:15:27 +08:00
# include <osg/buffered_value>
2001-09-20 05:19:47 +08:00
# include <stdlib.h>
# include <string.h>
# include <stdio.h>
# include <string>
# include <vector>
# include <set>
2005-04-26 21:15:27 +08:00
bool osg : : isGLExtensionSupported ( unsigned int contextID , const char * extension )
2001-09-20 05:19:47 +08:00
{
typedef std : : set < std : : string > ExtensionSet ;
2005-04-26 21:15:27 +08:00
static osg : : buffered_object < ExtensionSet > s_extensionSetList ;
static osg : : buffered_object < std : : string > s_rendererList ;
static osg : : buffered_value < int > s_initializedList ;
ExtensionSet & extensionSet = s_extensionSetList [ contextID ] ;
std : : string & rendererString = s_rendererList [ contextID ] ;
// if not already set up, initialize all the per graphic context values.
if ( ! s_initializedList [ contextID ] )
2001-09-20 05:19:47 +08:00
{
2005-04-26 21:15:27 +08:00
s_initializedList [ contextID ] = 1 ;
// set up the renderer
const GLubyte * renderer = glGetString ( GL_RENDERER ) ;
rendererString = renderer ? ( const char * ) renderer : " " ;
2001-09-20 05:19:47 +08:00
// get the extension list from OpenGL.
2005-04-26 21:15:27 +08:00
const char * extensions = ( const char * ) glGetString ( GL_EXTENSIONS ) ;
if ( extensions = = NULL ) return false ;
2001-09-20 05:19:47 +08:00
// insert the ' ' delimiated extensions words into the extensionSet.
2005-04-26 21:15:27 +08:00
const char * startOfWord = extensions ;
2001-09-20 05:19:47 +08:00
const char * endOfWord ;
while ( ( endOfWord = strchr ( startOfWord , ' ' ) ) ! = NULL )
{
2005-04-26 21:15:27 +08:00
extensionSet . insert ( std : : string ( startOfWord , endOfWord ) ) ;
2001-09-20 05:19:47 +08:00
startOfWord = endOfWord + 1 ;
}
2005-04-26 21:15:27 +08:00
if ( * startOfWord ! = 0 ) extensionSet . insert ( std : : string ( startOfWord ) ) ;
2001-09-20 05:19:47 +08:00
2001-12-15 07:18:28 +08:00
osg : : notify ( INFO ) < < " OpenGL extensions supported by installed OpenGL drivers are: " < < std : : endl ;
2005-04-26 21:15:27 +08:00
for ( ExtensionSet : : iterator itr = extensionSet . begin ( ) ;
itr ! = extensionSet . end ( ) ;
2001-09-20 05:19:47 +08:00
+ + itr )
{
2001-12-15 07:18:28 +08:00
osg : : notify ( INFO ) < < " " < < * itr < < std : : endl ;
2001-09-20 05:19:47 +08:00
}
}
// true if extension found in extensionSet.
2005-04-26 21:15:27 +08:00
bool result = extensionSet . find ( extension ) ! = extensionSet . end ( ) ;
2001-09-20 05:19:47 +08:00
2005-04-26 21:15:27 +08:00
// now see if extension is in the extension disabled list
2003-08-20 18:38:54 +08:00
bool extensionDisabled = false ;
if ( result )
{
const std : : string & disableString = getGLExtensionDisableString ( ) ;
if ( ! disableString . empty ( ) )
{
2005-04-26 21:15:27 +08:00
2003-08-20 18:38:54 +08:00
std : : string : : size_type pos = 0 ;
while ( pos ! = std : : string : : npos & & ( pos = disableString . find ( extension , pos ) ) ! = std : : string : : npos )
{
std : : string : : size_type previousColon = disableString . find_last_of ( ' : ' , pos ) ;
std : : string : : size_type previousSemiColon = disableString . find_last_of ( ' ; ' , pos ) ;
std : : string renderer = " " ;
if ( previousColon ! = std : : string : : npos )
{
if ( previousSemiColon = = std : : string : : npos ) renderer = disableString . substr ( 0 , previousColon ) ;
else if ( previousSemiColon < previousColon ) renderer = disableString . substr ( previousSemiColon + 1 , previousColon - previousSemiColon - 1 ) ;
}
if ( ! renderer . empty ( ) )
{
// remove leading spaces if they exist.
std : : string : : size_type leadingSpaces = renderer . find_first_not_of ( ' ' ) ;
if ( leadingSpaces = = std : : string : : npos ) renderer = " " ; // nothing but spaces
else if ( leadingSpaces ! = 0 ) renderer . erase ( 0 , leadingSpaces ) ;
// remove trailing spaces if they exist.
std : : string : : size_type trailingSpaces = renderer . find_last_not_of ( ' ' ) ;
if ( trailingSpaces ! = std : : string : : npos ) renderer . erase ( trailingSpaces + 1 , std : : string : : npos ) ;
}
if ( renderer . empty ( ) )
{
extensionDisabled = true ;
break ;
}
2005-04-26 21:15:27 +08:00
if ( rendererString . find ( renderer ) ! = std : : string : : npos )
2003-08-20 18:38:54 +08:00
{
extensionDisabled = true ;
break ;
}
// move the position in the disable string along so that the same extension is found multiple times
+ + pos ;
}
}
}
if ( result )
{
if ( ! extensionDisabled ) osg : : notify ( INFO ) < < " OpenGL extension ' " < < extension < < " ' is supported. " < < std : : endl ;
else osg : : notify ( INFO ) < < " OpenGL extension ' " < < extension < < " ' is supported by OpenGL \n driver but has been disabled by osg::getGLExtensionDisableString(). " < < std : : endl ;
}
2001-12-15 07:18:28 +08:00
else osg : : notify ( INFO ) < < " OpenGL extension ' " < < extension < < " ' is not supported. " < < std : : endl ;
2001-09-20 05:19:47 +08:00
2003-08-20 18:38:54 +08:00
return result & & ! extensionDisabled ;
}
void osg : : setGLExtensionDisableString ( const std : : string & disableString )
{
getGLExtensionDisableString ( ) = disableString ;
}
std : : string & osg : : getGLExtensionDisableString ( )
{
static const char * envVar = getenv ( " OSG_GL_EXTENSION_DISABLE " ) ;
static std : : string s_GLExtensionDisableString ( envVar ? envVar : " Nothing defined " ) ;
return s_GLExtensionDisableString ;
2001-09-20 05:19:47 +08:00
}
2002-08-26 18:24:01 +08:00
2003-08-20 18:38:54 +08:00
2005-04-26 21:15:27 +08:00
bool osg : : isGLUExtensionSupported ( unsigned int contextID , const char * extension )
2002-08-26 18:24:01 +08:00
{
typedef std : : set < std : : string > ExtensionSet ;
2005-04-26 21:15:27 +08:00
static osg : : buffered_object < ExtensionSet > s_extensionSetList ;
static osg : : buffered_object < std : : string > s_rendererList ;
static osg : : buffered_value < int > s_initializedList ;
ExtensionSet & extensionSet = s_extensionSetList [ contextID ] ;
std : : string & rendererString = s_rendererList [ contextID ] ;
// if not already set up, initialize all the per graphic context values.
if ( ! s_initializedList [ contextID ] )
2002-08-26 18:24:01 +08:00
{
2005-04-26 21:15:27 +08:00
s_initializedList [ contextID ] = 1 ;
// set up the renderer
const GLubyte * renderer = glGetString ( GL_RENDERER ) ;
rendererString = renderer ? ( const char * ) renderer : " " ;
2002-08-26 18:24:01 +08:00
// get the extension list from OpenGL.
2005-04-26 21:15:27 +08:00
const char * extensions = ( const char * ) gluGetString ( GLU_EXTENSIONS ) ;
if ( extensions = = NULL ) return false ;
2002-08-26 18:24:01 +08:00
// insert the ' ' delimiated extensions words into the extensionSet.
2005-04-26 21:15:27 +08:00
const char * startOfWord = extensions ;
2002-08-26 18:24:01 +08:00
const char * endOfWord ;
while ( ( endOfWord = strchr ( startOfWord , ' ' ) ) ! = NULL )
{
2005-04-26 21:15:27 +08:00
extensionSet . insert ( std : : string ( startOfWord , endOfWord ) ) ;
2002-08-26 18:24:01 +08:00
startOfWord = endOfWord + 1 ;
}
2005-04-26 21:15:27 +08:00
if ( * startOfWord ! = 0 ) extensionSet . insert ( std : : string ( startOfWord ) ) ;
2002-08-26 18:24:01 +08:00
osg : : notify ( INFO ) < < " OpenGL extensions supported by installed OpenGL drivers are: " < < std : : endl ;
2005-04-26 21:15:27 +08:00
for ( ExtensionSet : : iterator itr = extensionSet . begin ( ) ;
itr ! = extensionSet . end ( ) ;
2002-08-26 18:24:01 +08:00
+ + itr )
{
osg : : notify ( INFO ) < < " " < < * itr < < std : : endl ;
}
}
// true if extension found in extensionSet.
2005-04-26 21:15:27 +08:00
bool result = extensionSet . find ( extension ) ! = extensionSet . end ( ) ;
2002-08-26 18:24:01 +08:00
if ( result ) osg : : notify ( INFO ) < < " OpenGL utility library extension ' " < < extension < < " ' is supported. " < < std : : endl ;
else osg : : notify ( INFO ) < < " OpenGL utility library extension ' " < < extension < < " ' is not supported. " < < std : : endl ;
return result ;
}