]> git.cworth.org Git - glaze/commitdiff
Add GLAZE_WRAPPER variable to specify library with OpenGL wrapper functions
authorCarl Worth <cworth@cworth.org>
Mon, 29 Jul 2013 21:25:55 +0000 (14:25 -0700)
committerCarl Worth <cworth@cworth.org>
Mon, 29 Jul 2013 21:25:55 +0000 (14:25 -0700)
The GLAZE_WRAPPER environment variable should point to a library which
has symbols for some subset of the OpenGL API. For all such symbols,
Glaze will resolve its ifunc symbols to the wrapper functions. For all
functions not having symbols in the GLAZE_WRAPPER library, Glaze will
resolve its ifunc symbols to the functions in the GLAZE_LIBGL library.

glaze.c

diff --git a/glaze.c b/glaze.c
index af2aade6cbe0f2312cfb00368b3ab240b826f9e1..0c2eada8d458ea1ca672a1e9a90df365032909ce 100644 (file)
--- a/glaze.c
+++ b/glaze.c
@@ -26,6 +26,7 @@
 #include <stdlib.h>
 
 void *libgl_handle;
+void *wrapper_handle;
 
 static void
 open_libgl_handle (void)
@@ -48,6 +49,27 @@ open_libgl_handle (void)
        }
 }
 
+static void
+open_wrapper_handle (void)
+{
+       const char *path;
+
+       if (wrapper_handle)
+               return;
+
+       path = getenv ("GLAZE_WRAPPER");
+       if (path == NULL) {
+               fprintf (stderr, "GLAZE_WRAPPER unset. Please set to path of real libGL.so under glaze.\n");
+               exit (1);
+       }
+
+       wrapper_handle = dlopen (path, RTLD_LAZY);
+       if (wrapper_handle == NULL) {
+               fprintf (stderr, "Error: Failed to dlopen %s\n", path);
+               exit (1);
+       }
+}
+
 static void
 glaze_init (void) __attribute__((constructor));
 
@@ -55,11 +77,19 @@ static void
 glaze_init (void)
 {
        open_libgl_handle ();
+       open_wrapper_handle ();
 }
 
 static void *
 resolve (const char *name)
 {
+       void *symbol;
+
+       /* The wrapper gets first choice on all symbols. */
+       symbol = dlsym (wrapper_handle, name);
+       if (symbol)
+               return symbol;
+
        return dlsym (libgl_handle, name);
 }