X-Git-Url: https://git.cworth.org/git?p=fips;a=blobdiff_plain;f=glxwrap.c;h=9a28d7d0f231cb395b818ceadee564e1a3767cca;hp=80ccf1afdb6ed7148b81f1a04a30cd628b58b4da;hb=2760598732e9c373f3331d7d125b580a224bbbe3;hpb=8468b2b9d524832211f8e20791a1459003a563ff diff --git a/glxwrap.c b/glxwrap.c index 80ccf1a..9a28d7d 100644 --- a/glxwrap.c +++ b/glxwrap.c @@ -21,97 +21,94 @@ #include "fips.h" +#include "fips-dispatch.h" + #include #include #include -#include - #include "dlwrap.h" +#include "glwrap.h" +#include "metrics.h" + +void +glXSwapBuffers (Display *dpy, GLXDrawable drawable) +{ + GLWRAP_DEFER (glXSwapBuffers, dpy, drawable); -typedef void (* fips_glXSwapBuffers_t)(Display *dpy, GLXDrawable drawable); + metrics_counter_stop (); -static void * -lookup (const char *name) + metrics_end_frame (); + + metrics_counter_start (); +} + +/* glXGetProcAddressARB is a function which accepts a string and + * returns a generic function pointer (which nominally accepts void and + * has void return type). Of course, the user is expected to cast the + * returned function pointer to a function pointer of the expected + * type. + */ +void (*glXGetProcAddressARB (const GLubyte *func))(void) { - 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 *libfips_handle = NULL; + void *ret; + + if (libfips_handle == NULL) + libfips_handle = dlwrap_dlopen_libfips (); + + /* If our library has this symbol, that's what we want to give. */ + ret = dlwrap_real_dlsym (libfips_handle, (const char *) func); + if (ret) + return ret; + + /* Otherwise, just defer to the real glXGetProcAddressARB. */ + GLWRAP_DEFER_WITH_RETURN (ret, glXGetProcAddressARB, func); + + return ret; } -static void -call_glXSwapBuffers (Display *dpy, GLXDrawable drawable) +void (*glXGetProcAddress (const GLubyte *func))(void) { - 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); -} + /* This comment must not be removed. It ensures that the + * glXGetProcAddress function ends up in our exported symbol + * list even though there's not otherwise any code saying: + * + * GLWRAP_DEFER_WITH_RETURN (ret, glXGetProcAddress, func); + */ + return glXGetProcAddressARB(func); +} -void -glXSwapBuffers (Display *dpy, GLXDrawable drawable) +Bool +glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx) { - static int initialized = 0; - static int frames; - static struct timeval tv_start, tv_now; + Bool ret; - if (! initialized) { - frames = 0; - gettimeofday (&tv_start, NULL); - initialized = 1; - } + fips_dispatch_init (FIPS_API_GLX); - call_glXSwapBuffers (dpy, drawable); + GLWRAP_DEFER_WITH_RETURN (ret, glXMakeCurrent, dpy, drawable, ctx); - frames++; - if (frames % 60 == 0) { - double fps; - gettimeofday (&tv_now, NULL); + metrics_info_init (); - fps = (double) frames / (tv_now.tv_sec - tv_start.tv_sec + - (tv_now.tv_usec - tv_start.tv_usec) / 1.0e6); + metrics_set_current_op (METRICS_OP_SHADER + 0); + metrics_counter_start (); - printf("FPS: %.3f\n", fps); - } + return ret; } - -typedef __GLXextFuncPtr (* fips_glXGetProcAddressARB_t)(const GLubyte *func); -__GLXextFuncPtr -glXGetProcAddressARB (const GLubyte *func) +Bool +glXMakeContextCurrent (Display *dpy, GLXDrawable drawable, GLXDrawable read, GLXContext ctx) { - 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); + Bool ret; + + fips_dispatch_init (FIPS_API_GLX); + + GLWRAP_DEFER_WITH_RETURN (ret, glXMakeContextCurrent, dpy, drawable, read, ctx); + + metrics_info_init (); + + metrics_set_current_op (METRICS_OP_SHADER + 0); + metrics_counter_start (); + + return ret; }