X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glxwrap.c;h=9ebe799c70aea1f5678d0c3283ecd4162aa67d98;hb=44b4f7ecdfb8c538aa7616d2ea718f7465446388;hp=51b5faf58f83f8017c822d7d287f7eb72dbb12d0;hpb=802014dde0c3b25a48a4c6e5b09d20f52fb94324;p=fips diff --git a/glxwrap.c b/glxwrap.c index 51b5faf..9ebe799 100644 --- a/glxwrap.c +++ b/glxwrap.c @@ -22,6 +22,8 @@ #include #include +#include + #include #include @@ -31,6 +33,8 @@ #include +#include "dlwrap.h" + typedef void (* fips_glXSwapBuffers_t)(Display *dpy, GLXDrawable drawable); static void * @@ -40,7 +44,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 +52,7 @@ lookup (const char *name) } } - return dlsym (libgl_handle, name); + return dlwrap_real_dlsym (libgl_handle, name); } static void @@ -94,3 +98,26 @@ glXSwapBuffers (Display *dpy, GLXDrawable drawable) printf("FPS: %.3f\n", fps); } } + + +typedef __GLXextFuncPtr (* fips_glXGetProcAddressARB_t)(const GLubyte *func); +__GLXextFuncPtr +glXGetProcAddressARB (const GLubyte *func) +{ + 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 (strcmp ((const char *)func, "glXSwapBuffers") == 0) + return (__GLXextFuncPtr) glXSwapBuffers; + else + return real_glXGetProcAddressARB (func); +}