glx: Allow a context-specific fallback for glXGetProcAddress
authorJeremy Huddleston <jeremyhu@apple.com>
Wed, 15 Jun 2011 07:27:55 +0000 (00:27 -0700)
committerJeremy Huddleston <jeremyhu@apple.com>
Mon, 20 Jun 2011 23:54:58 +0000 (16:54 -0700)
In applegl, GLX advertises the same extensions provided by OpenGL.framework
even if such extensions are not provided by glapi.  This allows a client
to get access to such API.

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
src/glx/applegl_glx.c
src/glx/dri2_glx.c
src/glx/dri_glx.c
src/glx/drisw_glx.c
src/glx/glxclient.h
src/glx/glxcmds.c
src/glx/indirect_glx.c

index 4bf4672cede4a3eef84f9d2ea5f85b9d98eaea0b..8766c88a136ac1ddab7af5c6bed8645a31dc4fca 100644 (file)
 #if defined(GLX_USE_APPLEGL)
 
 #include <stdbool.h>
+#include <dlfcn.h>
 
 #include "glxclient.h"
 #include "apple_glx_context.h"
 #include "apple_glx.h"
+#include "apple_cgl.h"
 #include "glx_error.h"
 
 static void
@@ -82,6 +84,12 @@ applegl_wait_x(struct glx_context *gc)
    apple_glx_waitx(dpy, gc->driContext);
 }
 
+static void *
+applegl_get_proc_address(const char *symbol)
+{
+   return dlsym(apple_cgl_get_dl_handle(), symbol);
+}
+
 static const struct glx_context_vtable applegl_context_vtable = {
    applegl_destroy_context,
    applegl_bind_context,
@@ -91,6 +99,7 @@ static const struct glx_context_vtable applegl_context_vtable = {
    DRI_glXUseXFont,
    NULL, /* bind_tex_image, */
    NULL, /* release_tex_image, */
+   applegl_get_proc_address,
 };
 
 struct glx_context *
index e7c18ffe1eb98bb3c303a7038d6c94f7ae4a0d67..80e4da30bebe6e2b7e8783fc28e32cca47efe1bb 100644 (file)
@@ -767,6 +767,7 @@ static const struct glx_context_vtable dri2_context_vtable = {
    DRI_glXUseXFont,
    dri2_bind_tex_image,
    dri2_release_tex_image,
+   NULL, /* get_proc_address */
 };
 
 static void
index d59784c6a4f3b12dbf29fc58f2d5b26407fe563a..6f3b2b8900cd39cbd7ecd525ba4bce9630c744e2 100644 (file)
@@ -558,6 +558,7 @@ static const struct glx_context_vtable dri_context_vtable = {
    DRI_glXUseXFont,
    NULL,
    NULL,
+   NULL, /* get_proc_address */
 };
 
 static struct glx_context *
index 0075695932028ce2ef66be6c653c1967b4de0f73..07d495595a9654a771893db4763c62e1e2ed8c43 100644 (file)
@@ -296,6 +296,7 @@ static const struct glx_context_vtable drisw_context_vtable = {
    DRI_glXUseXFont,
    NULL,
    NULL,
+   NULL, /* get_proc_address */
 };
 
 static struct glx_context *
index 88a6edd097cc4f38885fdc8f386ded749250f103..06415288165c24a4776bd25d2fed08bdb8ca9ece 100644 (file)
@@ -224,7 +224,7 @@ struct glx_context_vtable {
                          GLXDrawable drawable,
                          int buffer, const int *attrib_list);
    void (*release_tex_image)(Display * dpy, GLXDrawable drawable, int buffer);
-   
+   void * (*get_proc_address)(const char *symbol);
 };
 
 extern void
index cd8bc97b1927407271ea980c3cb4b5dc2d767b5e..e6816ea1f625c6f5e277bcc5c74d15c9cff16139 100644 (file)
@@ -2521,6 +2521,12 @@ _X_EXPORT void (*glXGetProcAddressARB(const GLubyte * procName)) (void)
 #endif
       if (!f)
          f = (gl_function) _glapi_get_proc_address((const char *) procName);
+      if (!f) {
+         struct glx_context *gc = __glXGetCurrentContext();
+      
+         if (gc != NULL && gc->vtable->get_proc_address != NULL)
+            f = gc->vtable->get_proc_address((const char *) procName);
+      }
    }
    return f;
 }
index b4f16c72536e4d16934039b789f10c856dc364c9..7b542dd159c6696dde58b6cee43f7a9f82d994f6 100644 (file)
@@ -335,6 +335,7 @@ static const struct glx_context_vtable indirect_context_vtable = {
    indirect_use_x_font,
    indirect_bind_tex_image,
    indirect_release_tex_image,
+   NULL, /* get_proc_address */
 };
 
 /**