OpenSceneGraph/include/osg/GLExtensions

108 lines
3.5 KiB
Plaintext
Raw Normal View History

2002-07-17 04:07:32 +08:00
//C++ header - Open Scene Graph - Copyright (C) 1998-2002 Robert Osfield
//Distributed under the terms of the GNU Library General Public License (LGPL)
//as published by the Free Software Foundation.
2001-09-20 05:19:47 +08:00
#ifndef OSG_GLEXTENSIONS
#define OSG_GLEXTENSIONS 1
#include <osg/Export>
#if defined(WIN32)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#elif defined(__DARWIN_OSX__)
#include <string>
#include <mach-o/dyld.h>
#else
#include <dlfcn.h>
#endif
2001-09-20 05:19:47 +08:00
namespace osg {
/** return true if OpenGL "extension" is supported.
* note: Must only called within a valid OpenGL context,
* undefined behavior may occur otherwise.
2001-09-20 05:19:47 +08:00
*/
SG_EXPORT extern const bool isGLExtensionSupported(const char *extension);
/** return the address of the specified OpenGL function.
* return NULL if function not supported by OpenGL library.
* Note, glGLExtensionFuncPtr is declared inline so that the code
* is compiled localy to the calling code. This should get by Windows
* dumb implementation of having different GL function ptr's for each
* library when links to it.
2001-09-20 05:19:47 +08:00
*/
inline void* getGLExtensionFuncPtr(const char *funcName)
{
#if defined(WIN32)
return wglGetProcAddress(funcName);
#elif defined(__DARWIN_OSX__)
std::string temp( "_" );
temp += funcName; // Mac OS X prepends an underscore on function names
if ( NSIsSymbolNameDefined( temp.c_str() ) )
{
NSSymbol symbol = NSLookupAndBindSymbol( temp.c_str() );
return NSAddressOfSymbol( symbol );
} else
return NULL;
#else // all other unixes
// Note: although we use shl_load() etc. for Plugins on HP-UX, it's
// not neccessary here since we only used them because library
// intialization was not taking place with dlopen() which renders
// Plugins useless on HP-UX.
static void *lib = dlopen("libGL.so", RTLD_LAZY);
if (lib)
return dlsym(lib, funcName);
else
return NULL;
#endif
}
2001-09-20 05:19:47 +08:00
/** return the address of the specified OpenGL function, if not found then
* check a second function name, if this fails then return NULL as function is
* not supported by OpenGL library. This is usual for checking something
* like glActiveTexture (which is in OGL1.3) or glActiveTextureARB.
*/
inline void* getGLExtensionFuncPtr(const char *funcName,const char *fallbackFuncName)
{
void* ptr = getGLExtensionFuncPtr(funcName);
if (ptr) return ptr;
return getGLExtensionFuncPtr(fallbackFuncName);
}
/** return true if OpenGL "extension" is supported.
* note: Must only called within a valid OpenGL context,
* undefined behavior may occur otherwise.
*/
SG_EXPORT extern const bool isGLUExtensionSupported(const char *extension);
inline void* getGLUExtensionFuncPtr(const char *funcName)
{
#if defined(WIN32)
return wglGetProcAddress(funcName);
#elif defined(__DARWIN_OSX__)
std::string temp( "_" );
temp += funcName; // Mac OS X prepends an underscore on function names
if ( NSIsSymbolNameDefined( temp.c_str() ) )
{
NSSymbol symbol = NSLookupAndBindSymbol( temp.c_str() );
return NSAddressOfSymbol( symbol );
} else
return NULL;
#else // all other unixes
// Note: although we use shl_load() etc. for Plugins on HP-UX, it's
// not neccessary here since we only used them because library
// intialization was not taking place with dlopen() which renders
// Plugins useless on HP-UX.
static void *lib = dlopen("libGLU.so", RTLD_LAZY);
if (lib)
return dlsym(lib, funcName);
else
return NULL;
#endif
}
}
2001-09-20 05:19:47 +08:00
#endif