X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glxwrap.c;h=4d16e4d6a1b86c093bbad6f4d8b1f35ff337e0f8;hb=7f48ed429b393b28cb6362af5dcddd9bb27c3901;hp=51b5faf58f83f8017c822d7d287f7eb72dbb12d0;hpb=1f4014b53a4dc77768f3998a6fd3b67024431fa3;p=fips diff --git a/glxwrap.c b/glxwrap.c index 51b5faf..4d16e4d 100644 --- a/glxwrap.c +++ b/glxwrap.c @@ -19,18 +19,16 @@ * THE SOFTWARE. */ -#include -#include - -#include +#include "fips.h" #include #include #include -#include #include +#include "dlwrap.h" + typedef void (* fips_glXSwapBuffers_t)(Display *dpy, GLXDrawable drawable); static void * @@ -40,7 +38,7 @@ lookup (const char *name) static void *libgl_handle = NULL; if (! libgl_handle) { - libgl_handle = dlopen (libgl_filename, RTLD_NOW); + libgl_handle = dlwrap_real_dlopen (libgl_filename, RTLD_NOW | RTLD_DEEPBIND); if (! libgl_handle) { fprintf (stderr, "Error: Failed to dlopen %s\n", libgl_filename); @@ -48,7 +46,7 @@ lookup (const char *name) } } - return dlsym (libgl_handle, name); + return dlwrap_real_dlsym (libgl_handle, name); } static void @@ -94,3 +92,30 @@ glXSwapBuffers (Display *dpy, GLXDrawable drawable) printf("FPS: %.3f\n", fps); } } + + +typedef __GLXextFuncPtr (* fips_glXGetProcAddressARB_t)(const GLubyte *func); +__GLXextFuncPtr +glXGetProcAddressARB (const GLubyte *func) +{ + __GLXextFuncPtr ptr; + static fips_glXGetProcAddressARB_t real_glXGetProcAddressARB = NULL; + const char *name = "glXGetProcAddressARB"; + + if (! real_glXGetProcAddressARB) { + real_glXGetProcAddressARB = (fips_glXGetProcAddressARB_t) lookup (name); + if (! real_glXGetProcAddressARB) { + fprintf (stderr, "Error: Failed to find function %s.\n", + name); + return NULL; + } + } + + /* If our library has this symbol, that's what we want to give. */ + ptr = dlwrap_real_dlsym (NULL, (const char *) func); + if (ptr) + return ptr; + + /* Otherwise, just defer to the real glXGetProcAddressARB. */ + return real_glXGetProcAddressARB (func); +}