Quartz driver OpenGL updates:
Driver can now open whatever library is specified in SDL_GL_LoadLibrary()
call (previously, it ignored this parameter), and uses the default system
library when NULL is specified.
Also, library is loaded once in SDL_GL_LoadLibrary() and not every call to
SDL_GL_GetProcAddress().
--- a/src/video/quartz/SDL_QuartzGL.m Tue Nov 22 07:10:07 2005 +0000
+++ b/src/video/quartz/SDL_QuartzGL.m Tue Nov 22 08:21:39 2005 +0000
@@ -168,32 +168,61 @@
/* SDL OpenGL functions */
int QZ_GL_LoadLibrary (_THIS, const char *location) {
- this->gl_config.driver_loaded = 1;
- return 0;
+ CFURLRef bundleURL;
+ CFStringRef cfstr;
+
+ if ( gl_context != NULL ) {
+ SDL_SetError("OpenGL context already created");
+ return -1;
+ }
+
+ if (opengl_bundle != NULL)
+ CFRelease(opengl_bundle);
+
+ opengl_bundle = NULL;
+ this->gl_config.driver_loaded = 0;
+
+ if (location == NULL)
+ location = "/System/Library/Frameworks/OpenGL.framework";
+
+ cfstr = CFStringCreateWithCString(kCFAllocatorDefault, location,
+ kCFStringEncodingUTF8);
+ if (cfstr == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+
+ bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,
+ cfstr, kCFURLPOSIXPathStyle, true);
+
+ CFRelease(cfstr);
+
+ if (bundleURL == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+
+ opengl_bundle = CFBundleCreate (kCFAllocatorDefault, bundleURL);
+
+ CFRelease(bundleURL);
+
+ if (opengl_bundle != NULL) {
+ this->gl_config.driver_loaded = 1;
+ return 0;
+ }
+
+ /* not exactly descriptive, but okay... */
+ SDL_SetError("Could not load OpenGL library");
+ return -1;
}
void* QZ_GL_GetProcAddress (_THIS, const char *proc) {
-
- /* We may want to cache the bundleRef at some point */
- CFBundleRef bundle;
- CFURLRef bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,
- CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true);
-
- CFStringRef functionName = CFStringCreateWithCString
+ CFStringRef funcName = CFStringCreateWithCString
(kCFAllocatorDefault, proc, kCFStringEncodingASCII);
- void *function;
-
- bundle = CFBundleCreate (kCFAllocatorDefault, bundleURL);
- assert (bundle != NULL);
-
- function = CFBundleGetFunctionPointerForName (bundle, functionName);
-
- CFRelease ( bundleURL );
- CFRelease ( functionName );
- CFRelease ( bundle );
-
- return function;
+ void *func = CFBundleGetFunctionPointerForName(opengl_bundle, funcName);
+ CFRelease (funcName);
+ return func;
}
int QZ_GL_GetAttribute (_THIS, SDL_GLattr attrib, int* value) {
--- a/src/video/quartz/SDL_QuartzVideo.h Tue Nov 22 07:10:07 2005 +0000
+++ b/src/video/quartz/SDL_QuartzVideo.h Tue Nov 22 08:21:39 2005 +0000
@@ -117,6 +117,7 @@
Sint16 yuv_width, yuv_height;
CGrafPtr yuv_port;
+ CFBundleRef opengl_bundle; /* dynamically loaded OpenGL library. */
} SDL_PrivateVideoData;
#define _THIS SDL_VideoDevice *this
@@ -154,6 +155,7 @@
#define current_buffer (this->hidden->current_buffer)
#define quit_thread (this->hidden->quit_thread)
#define system_version (this->hidden->system_version)
+#define opengl_bundle (this->hidden->opengl_bundle)
/* grab states - the input is in one of these states */
enum {
--- a/src/video/quartz/SDL_QuartzVideo.m Tue Nov 22 07:10:07 2005 +0000
+++ b/src/video/quartz/SDL_QuartzVideo.m Tue Nov 22 08:21:39 2005 +0000
@@ -1489,6 +1489,12 @@
QZ_UnsetVideoMode (this);
CGPaletteRelease (palette);
+
+ if (opengl_bundle) {
+ CFRelease(opengl_bundle);
+ opengl_bundle = NULL;
+ }
+ this->gl_config.driver_loaded = 0;
}
#if 0 /* Not used (apparently, it's really slow) */