Quartz driver OpenGL updates:
authorRyan C. Gordon <icculus@icculus.org>
Tue, 22 Nov 2005 08:21:39 +0000
changeset 1181 49d3efec6651
parent 1180 bdcb8bb4c831
child 1182 e8e8dcb68e7a
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().
src/video/quartz/SDL_QuartzGL.m
src/video/quartz/SDL_QuartzVideo.h
src/video/quartz/SDL_QuartzVideo.m
--- 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) */