bool osg::isGLExtensionOrVersionSupported(unsigned int contextID, const char *extension, float requiredGLVersion) { ExtensionSet& extensionSet = s_glExtensionSetList[contextID]; std::string& rendererString = s_glRendererList[contextID]; // first check to see if GL version number of recent enough. bool result = requiredGLVersion <= osg::getGLVersionNumber(); if (!result) { // if not already set up, initialize all the per graphic context values. if (!s_glInitializedList[contextID]) { s_glInitializedList[contextID] = 1; // set up the renderer const GLubyte* renderer = glGetString(GL_RENDERER); rendererString = renderer ? (const char*)renderer : ""; // get the extension list from OpenGL. GLint numExt = 0; #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) if( osg::getGLVersionNumber() >= 3.0 ) { // OpenGL 3.0 adds the concept of indexed strings and // deprecates calls to glGetString( GL_EXTENSIONS ), which // will now generate GL_INVALID_ENUM. // Get extensions using new indexed string interface. typedef const GLubyte * GL_APIENTRY PFNGLGETSTRINGIPROC( GLenum, GLuint ); PFNGLGETSTRINGIPROC* glGetStringi = 0; setGLExtensionFuncPtr( glGetStringi, "glGetStringi"); if( glGetStringi != NULL ) { # ifndef GL_NUM_EXTENSIONS # define GL_NUM_EXTENSIONS 0x821D # endif glGetIntegerv( GL_NUM_EXTENSIONS, &numExt ); int idx; for( idx=0; idx<numExt; idx++ ) { extensionSet.insert( std::string( (char*)( glGetStringi( GL_EXTENSIONS, idx ) ) ) ); } } else { OSG_WARN << "isGLExtensionOrVersionSupported: Can't obtain glGetStringi function pointer." << std::endl; } } #endif // No extensions found so far, so try with glGetString if (numExt == 0) { // Get extensions using GL1/2 interface. const char* extensions = (const char*)glGetString(GL_EXTENSIONS); if (extensions==NULL) return false; // insert the ' ' delimiated extensions words into the extensionSet. const char *startOfWord = extensions; const char *endOfWord; while ((endOfWord = strchr(startOfWord,' '))!=NULL) { extensionSet.insert(std::string(startOfWord,endOfWord)); startOfWord = endOfWord+1; } if (*startOfWord!=0) extensionSet.insert(std::string(startOfWord)); } #if defined(WIN32) && (defined(OSG_GL1_AVAILABLE) || defined(OSG_GL2_AVAILABLE) || defined(OSG_GL3_AVAILABLE)) // add WGL extensions to the list typedef const char* WINAPI WGLGETEXTENSIONSSTRINGARB(HDC); WGLGETEXTENSIONSSTRINGARB* wglGetExtensionsStringARB = 0; setGLExtensionFuncPtr(wglGetExtensionsStringARB, "wglGetExtensionsStringARB"); typedef const char* WINAPI WGLGETEXTENSIONSSTRINGEXT(); WGLGETEXTENSIONSSTRINGEXT* wglGetExtensionsStringEXT = 0; setGLExtensionFuncPtr(wglGetExtensionsStringEXT, "wglGetExtensionsStringEXT"); const char* wglextensions = 0; if (wglGetExtensionsStringARB) { HDC dc = wglGetCurrentDC(); wglextensions = wglGetExtensionsStringARB(dc); } else if (wglGetExtensionsStringEXT) { wglextensions = wglGetExtensionsStringEXT(); } if (wglextensions) { const char* startOfWord = wglextensions; const char* endOfWord; while ((endOfWord = strchr(startOfWord, ' '))) { extensionSet.insert(std::string(startOfWord, endOfWord)); startOfWord = endOfWord+1; } if (*startOfWord != 0) extensionSet.insert(std::string(startOfWord)); } #endif OSG_NOTIFY(INFO)<<"OpenGL extensions supported by installed OpenGL drivers are:"<<std::endl; for(ExtensionSet::iterator itr=extensionSet.begin(); itr!=extensionSet.end(); ++itr) { OSG_NOTIFY(INFO)<<" "<<*itr<<std::endl; } } // true if extension found in extensionSet. result = extensionSet.find(extension)!=extensionSet.end(); }
bool osg::isGLExtensionSupported(unsigned int contextID, const char *extension) { ExtensionSet& extensionSet = s_glExtensionSetList[contextID]; std::string& rendererString = s_glRendererList[contextID]; // if not already set up, initialize all the per graphic context values. if (!s_glInitializedList[contextID]) { s_glInitializedList[contextID] = 1; // set up the renderer const GLubyte* renderer = glGetString(GL_RENDERER); rendererString = renderer ? (const char*)renderer : ""; // get the extension list from OpenGL. const char* extensions = (const char*)glGetString(GL_EXTENSIONS); if (extensions==NULL) return false; // insert the ' ' delimiated extensions words into the extensionSet. const char *startOfWord = extensions; const char *endOfWord; while ((endOfWord = strchr(startOfWord,' '))!=NULL) { extensionSet.insert(std::string(startOfWord,endOfWord)); startOfWord = endOfWord+1; } if (*startOfWord!=0) extensionSet.insert(std::string(startOfWord)); #if defined(WIN32) // add WGL extensions to the list typedef const char* WINAPI WGLGETEXTENSIONSSTRINGARB(HDC); WGLGETEXTENSIONSSTRINGARB* wglGetExtensionsStringARB = (WGLGETEXTENSIONSSTRINGARB*)getGLExtensionFuncPtr("wglGetExtensionsStringARB"); typedef const char* WINAPI WGLGETEXTENSIONSSTRINGEXT(); WGLGETEXTENSIONSSTRINGEXT* wglGetExtensionsStringEXT = (WGLGETEXTENSIONSSTRINGEXT*)getGLExtensionFuncPtr("wglGetExtensionsStringEXT"); const char* wglextensions = 0; if (wglGetExtensionsStringARB) { HDC dc = wglGetCurrentDC(); wglextensions = wglGetExtensionsStringARB(dc); } else if (wglGetExtensionsStringEXT) { wglextensions = wglGetExtensionsStringEXT(); } if (wglextensions) { const char* startOfWord = wglextensions; const char* endOfWord; while ((endOfWord = strchr(startOfWord, ' '))) { extensionSet.insert(std::string(startOfWord, endOfWord)); startOfWord = endOfWord+1; } if (*startOfWord != 0) extensionSet.insert(std::string(startOfWord)); } #endif osg::notify(INFO)<<"OpenGL extensions supported by installed OpenGL drivers are:"<<std::endl; for(ExtensionSet::iterator itr=extensionSet.begin(); itr!=extensionSet.end(); ++itr) { osg::notify(INFO)<<" "<<*itr<<std::endl; } }