]> git.cworth.org Git - glaze/blobdiff - glaze.c
Add GLAZE_WRAPPER variable to specify library with OpenGL wrapper functions
[glaze] / 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);
 }