summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJeremy Huddleston <[email protected]>2011-06-15 00:27:55 -0700
committerJeremy Huddleston <[email protected]>2011-06-20 16:54:58 -0700
commit559e4f8ebcb186b491d7d687ac43f22a62448fc1 (patch)
tree5bf792e38573f8d1a54d1c70c1c3427f692533e8 /src
parentfbd7448977efd49afba322cbb0853e9981ec2d2d (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]>
Diffstat (limited to 'src')
-rw-r--r--src/glx/applegl_glx.c9
-rw-r--r--src/glx/dri2_glx.c1
-rw-r--r--src/glx/dri_glx.c1
-rw-r--r--src/glx/drisw_glx.c1
-rw-r--r--src/glx/glxclient.h2
-rw-r--r--src/glx/glxcmds.c6
-rw-r--r--src/glx/indirect_glx.c1
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 */
};
/**