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)
#include <sys/time.h>
#include <string.h>
+#include <glaze.h>
+
/* How many frames between reports. */
#define REPORT_FREQ 60
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);
}