00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <string.h>
00026
00027 #include "extensions.hxx"
00028 #include <simgear/debug/logstream.hxx>
00029 #if !defined(WIN32)
00030 # include <dlfcn.h>
00031 #endif
00032
00033 bool SGSearchExtensionsString(const char *extString, const char *extName) {
00034
00035
00036
00037 const char *p, *end;
00038 int n, extNameLen;
00039
00040 if ((extString == NULL) || (extName == NULL))
00041 return false;
00042
00043 extNameLen = strlen(extName);
00044
00045 p=extString;
00046 end = p + strlen(p);
00047
00048 while (p < end) {
00049 n = strcspn(p, " ");
00050 if ((extNameLen == n) && (strncmp(extName, p, n) == 0))
00051 return GL_TRUE;
00052
00053 p += (n + 1);
00054 }
00055
00056 return GL_FALSE;
00057 }
00058
00059 bool SGIsOpenGLExtensionSupported(const char *extName) {
00060
00061
00062
00063
00064
00065
00066 return SGSearchExtensionsString((const char *)glGetString(GL_EXTENSIONS),extName);
00067 }
00068
00069 #ifdef __APPLE__
00070
00071 #include <CoreFoundation/CoreFoundation.h>
00072
00073 void* macosxGetGLProcAddress(const char *func) {
00074
00075
00076 static CFBundleRef bundle = 0;
00077
00078 if (!bundle) {
00079
00080 CFURLRef bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,
00081 CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true);
00082
00083 bundle = CFBundleCreate (kCFAllocatorDefault, bundleURL);
00084 CFRelease (bundleURL);
00085 }
00086
00087 if (!bundle)
00088 return 0;
00089
00090 CFStringRef functionName = CFStringCreateWithCString
00091 (kCFAllocatorDefault, func, kCFStringEncodingASCII);
00092
00093 void *function;
00094
00095 function = CFBundleGetFunctionPointerForName (bundle, functionName);
00096
00097 CFRelease (functionName);
00098
00099 return function;
00100 }
00101
00102 #elif !defined( WIN32 )
00103
00104 void *SGGetGLProcAddress(const char *func) {
00105 static void *libHandle = NULL;
00106 static void *(*glXGetProcAddressPtr)(const GLubyte*) = 0;
00107 void *fptr = NULL;
00108
00109
00110
00111
00112 dlerror();
00113
00114
00115
00116
00117
00118
00119
00120 if (libHandle == NULL) {
00121 libHandle = dlopen(NULL, RTLD_LAZY);
00122
00123 if (!libHandle) {
00124 #if defined (__FreeBSD__)
00125 const char *error = dlerror();
00126 #else
00127 char *error = dlerror();
00128 #endif
00129 if (error) {
00130 SG_LOG(SG_GENERAL, SG_INFO, error);
00131 return 0;
00132 }
00133 }
00134
00135 void* symbol = dlsym(libHandle, "glXGetProcAddress");
00136 if (!symbol)
00137 symbol = dlsym(libHandle, "glXGetProcAddressARB");
00138 glXGetProcAddressPtr = (void *(*)(const GLubyte*)) symbol;
00139 }
00140
00141
00142 if (glXGetProcAddressPtr) {
00143 fptr = glXGetProcAddressPtr((const GLubyte*)func);
00144
00145 } else if (libHandle != NULL) {
00146 fptr = dlsym(libHandle, func);
00147
00148 #if defined (__FreeBSD__)
00149 const char *error = dlerror();
00150 #else
00151 char *error = dlerror();
00152 #endif
00153 if (error)
00154 SG_LOG(SG_GENERAL, SG_INFO, error);
00155 }
00156
00157 return fptr;
00158 }
00159
00160 #endif
00161