X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glxwrap.c;h=d7670a79a28a1e3bf90bc3b6cc8b53d08bb1f486;hb=499af6e2043af80750f5b2a2866ebb430e085851;hp=e4252d3942405d1209a6a529956d88092dfc44f9;hpb=c457e83d57b257f1f3aa7c39bbc0c60d127cc189;p=fips diff --git a/glxwrap.c b/glxwrap.c index e4252d3..d7670a7 100644 --- a/glxwrap.c +++ b/glxwrap.c @@ -21,79 +21,20 @@ #include "fips.h" -#include - #include #include #include -#include - -#include #include "dlwrap.h" - -typedef void (* fips_glXSwapBuffers_t)(Display *dpy, GLXDrawable drawable); - -static void * -lookup (const char *name) -{ - const char *libgl_filename = "libGL.so.1"; - static void *libgl_handle = NULL; - - if (! libgl_handle) { - libgl_handle = dlwrap_real_dlopen (libgl_filename, RTLD_NOW | RTLD_DEEPBIND); - if (! libgl_handle) { - fprintf (stderr, "Error: Failed to dlopen %s\n", - libgl_filename); - exit (1); - } - } - - return dlwrap_real_dlsym (libgl_handle, name); -} - -static void -call_glXSwapBuffers (Display *dpy, GLXDrawable drawable) -{ - static fips_glXSwapBuffers_t real_glXSwapBuffers = NULL; - const char *name = "glXSwapBuffers"; - - if (! real_glXSwapBuffers) { - real_glXSwapBuffers = (fips_glXSwapBuffers_t) lookup (name); - if (! real_glXSwapBuffers) { - fprintf (stderr, "Error: Failed to find function %s.\n", - name); - return; - } - } - real_glXSwapBuffers (dpy, drawable); -} +#include "glwrap.h" +#include "metrics.h" void glXSwapBuffers (Display *dpy, GLXDrawable drawable) { - static int initialized = 0; - static int frames; - static struct timeval tv_start, tv_now; - - if (! initialized) { - frames = 0; - gettimeofday (&tv_start, NULL); - initialized = 1; - } - - call_glXSwapBuffers (dpy, drawable); - - frames++; - if (frames % 60 == 0) { - double fps; - gettimeofday (&tv_now, NULL); + GLWRAP_DEFER (glXSwapBuffers, dpy, drawable); - fps = (double) frames / (tv_now.tv_sec - tv_start.tv_sec + - (tv_now.tv_usec - tv_start.tv_usec) / 1.0e6); - - printf("FPS: %.3f\n", fps); - } + metrics_end_frame (); } @@ -101,11 +42,12 @@ 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"; + char *name = "glXGetProcAddressARB"; if (! real_glXGetProcAddressARB) { - real_glXGetProcAddressARB = (fips_glXGetProcAddressARB_t) lookup (name); + real_glXGetProcAddressARB = glwrap_lookup (name); if (! real_glXGetProcAddressARB) { fprintf (stderr, "Error: Failed to find function %s.\n", name); @@ -113,8 +55,11 @@ glXGetProcAddressARB (const GLubyte *func) } } - if (strcmp ((const char *)func, "glXSwapBuffers") == 0) - return (__GLXextFuncPtr) glXSwapBuffers; - else - return real_glXGetProcAddressARB (func); + /* 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); }