From 1ed37d8858a14c160cbd04ef6e38b0acade66a76 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Mon, 23 Sep 2013 07:08:38 -0700 Subject: [PATCH] Switch to Glaze to implement glfps With Glaze, things are comparably as easy as using LD_PRELOAD, yet we still get the robustness of working with applications using dlsym or GetProcAddress, (as well as the robustness of having a real libGL.so for the application to use rather than an LD_PRELOAD which can confuse some applications). --- Makefile | 6 ++-- glfps-test | 4 +-- glfps.c | 82 ++---------------------------------------------------- 3 files changed, 8 insertions(+), 84 deletions(-) diff --git a/Makefile b/Makefile index 5ebf41b..52feeb2 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,17 @@ CC ?= gcc CFLAGS ?= -g -Wall -Wextra -Wmissing-declarations +GLAZE_FLAGS = $(shell pkg-config --cflags --libs glaze) +GLAZE_32_FLAGS = $(shell pkg-config --cflags --libs glaze-32) TARGETS=libglfps.so libglfps-32.so all: $(TARGETS) libglfps.so: glfps.c - $(CC) $(CFLAGS) -fPIC -shared -Wl,-Bsymbolic -o $@ $< + $(CC) $(CFLAGS) $(GLAZE_FLAGS) -fPIC -shared -Wl,-Bsymbolic -o $@ $< libglfps-32.so: glfps.c - $(CC) $(CFLAGS) -m32 -fPIC -shared -Wl,-Bsymbolic -o $@ $< + $(CC) $(CFLAGS) $(GLAZE_32_FLAGS) -m32 -fPIC -shared -Wl,-Bsymbolic -o $@ $< clean: rm -f $(TARGETS) diff --git a/glfps-test b/glfps-test index f424686..30600c6 100755 --- a/glfps-test +++ b/glfps-test @@ -17,7 +17,7 @@ test () tests=$((tests + 1)) - if ${FIPS_TEST_DIR}/${script} | grep -q "^glfps"; then + if glaze --wrapper=libglfps.so ${FIPS_TEST_DIR}/${script} | grep -q "^glfps"; then printf "PASS\n" else printf "FAIL\n" @@ -29,8 +29,6 @@ echo "Testing glfps with programs using different window-system interfaces to" echo "OpenGL, different linking mechanisms, and different symbol-lookup." echo "" -export LD_PRELOAD=./libglfps.so - printf " Window sys. Link-mode Lookup\n" printf " ----------- ------------- -----------------\n" diff --git a/glfps.c b/glfps.c index 6c9cd49..dca09dd 100644 --- a/glfps.c +++ b/glfps.c @@ -11,6 +11,8 @@ #include #include +#include + /* How many frames between reports. */ #define REPORT_FREQ 60 @@ -36,88 +38,10 @@ on_each_frame (void) count++; } -static void *do_real_dlsym (void *handle, const char *symbol); - -static typeof(&glXSwapBuffers) real_glXSwapBuffers; - void glXSwapBuffers (Display *dpy, GLXDrawable drawable) { - if (real_glXSwapBuffers == NULL) - real_glXSwapBuffers = do_real_dlsym (RTLD_NEXT, "glXSwapBuffers"); - on_each_frame (); - real_glXSwapBuffers (dpy, drawable); -} - -static typeof(&glXGetProcAddressARB) real_glXGetProcAddressARB; - -void -(*glXGetProcAddressARB (const GLubyte *func))(void) -{ - if (strcmp((char *) func, "glXSwapBuffers") == 0) - return (void*) glXSwapBuffers; - - if (real_glXGetProcAddressARB == NULL) - real_glXGetProcAddressARB = do_real_dlsym (RTLD_NEXT, "glXGetProcAddressARB"); - - return real_glXGetProcAddressARB (func); -} - -static typeof(&glXGetProcAddress) real_glXGetProcAddress; - -void -(*glXGetProcAddress (const GLubyte *func))(void) -{ - if (strcmp((char *) func, "glXSwapBuffers") == 0) - return (void*) glXSwapBuffers; - - if (real_glXGetProcAddress == NULL) - real_glXGetProcAddress = do_real_dlsym (RTLD_NEXT, "glXGetProcAddress"); - - return real_glXGetProcAddress (func); -} - -/* We rely on an internal symbol within glibc in order to be able to - * get a handle on the real dlsym function, (we can't call dlsym to - * find the address of dlsym itself of course). */ -void * __libc_dlsym(void *, const char *); - -static void * -do_real_dlsym (void *handle, const char *symbol) -{ - static typeof(&dlsym) real_dlsym = NULL; - - if (real_dlsym == NULL) { - void *libdl_handle = dlopen ("libdl.so.2", RTLD_LAZY); - real_dlsym = __libc_dlsym(libdl_handle, "dlsym"); - } - - return real_dlsym (handle, symbol); -} - -void * -dlsym (void *handle, const char *symbol) -{ - void *ret; - - ret = do_real_dlsym (handle, symbol); - - if (strcmp (symbol, "glXSwapBuffers") == 0) { - real_glXSwapBuffers = ret; - return &glXSwapBuffers; - } - - if (strcmp (symbol, "glXGetProcAddressARB") == 0) { - real_glXGetProcAddressARB = ret; - return &glXGetProcAddressARB; - } - - if (strcmp (symbol, "glXGetProcAddress") == 0) { - real_glXGetProcAddress = ret; - return &glXGetProcAddress; - } - - return ret; + GLAZE_DEFER (glXSwapBuffers, dpy, drawable); } -- 2.43.0