diff options
author | Jeremy Huddleston <[email protected]> | 2011-06-15 00:27:55 -0700 |
---|---|---|
committer | Jeremy Huddleston <[email protected]> | 2011-06-20 16:54:58 -0700 |
commit | 559e4f8ebcb186b491d7d687ac43f22a62448fc1 (patch) | |
tree | 5bf792e38573f8d1a54d1c70c1c3427f692533e8 | |
parent | fbd7448977efd49afba322cbb0853e9981ec2d2d (diff) |
glx: Allow a context-specific fallback for glXGetProcAddress
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 <[email protected]>
-rw-r--r-- | src/glx/applegl_glx.c | 9 | ||||
-rw-r--r-- | src/glx/dri2_glx.c | 1 | ||||
-rw-r--r-- | src/glx/dri_glx.c | 1 | ||||
-rw-r--r-- | src/glx/drisw_glx.c | 1 | ||||
-rw-r--r-- | src/glx/glxclient.h | 2 | ||||
-rw-r--r-- | src/glx/glxcmds.c | 6 | ||||
-rw-r--r-- | src/glx/indirect_glx.c | 1 |
7 files changed, 20 insertions, 1 deletions
diff --git a/src/glx/applegl_glx.c b/src/glx/applegl_glx.c index 4bf4672cede..8766c88a136 100644 --- a/src/glx/applegl_glx.c +++ b/src/glx/applegl_glx.c @@ -34,10 +34,12 @@ #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 * diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index e7c18ffe1eb..80e4da30beb 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -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 diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c index d59784c6a4f..6f3b2b8900c 100644 --- a/src/glx/dri_glx.c +++ b/src/glx/dri_glx.c @@ -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 * diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 00756959320..07d495595a9 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -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 * diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 88a6edd097c..06415288165 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -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 diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index cd8bc97b192..e6816ea1f62 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -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; } diff --git a/src/glx/indirect_glx.c b/src/glx/indirect_glx.c index b4f16c72536..7b542dd159c 100644 --- a/src/glx/indirect_glx.c +++ b/src/glx/indirect_glx.c @@ -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 */ }; /** |