#include <GL/gl.h>
#include <GL/glx.h>
-#include <sys/time.h>
-
#include "dlwrap.h"
-typedef void (* fips_glXSwapBuffers_t)(Display *dpy, GLXDrawable drawable);
-
-static void *
-lookup (const char *name)
-{
- 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
-call_glXSwapBuffers (Display *dpy, GLXDrawable drawable)
-{
- 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);
-}
+#include "glwrap.h"
void
glXSwapBuffers (Display *dpy, GLXDrawable drawable)
{
- static int initialized = 0;
- static int frames;
- static struct timeval tv_start, tv_now;
-
- if (! initialized) {
- frames = 0;
- gettimeofday (&tv_start, NULL);
- initialized = 1;
- }
-
- call_glXSwapBuffers (dpy, drawable);
-
- frames++;
- if (frames % 60 == 0) {
- double fps;
- gettimeofday (&tv_now, NULL);
+ GLWRAP_DEFER (glXSwapBuffers, dpy, drawable);
- fps = (double) frames / (tv_now.tv_sec - tv_start.tv_sec +
- (tv_now.tv_usec - tv_start.tv_usec) / 1.0e6);
-
- printf("FPS: %.3f\n", fps);
- }
+ glwrap_end_frame ();
}
{
__GLXextFuncPtr ptr;
static fips_glXGetProcAddressARB_t real_glXGetProcAddressARB = NULL;
- const char *name = "glXGetProcAddressARB";
+ char *name = "glXGetProcAddressARB";
if (! real_glXGetProcAddressARB) {
- real_glXGetProcAddressARB = (fips_glXGetProcAddressARB_t) lookup (name);
+ real_glXGetProcAddressARB = glwrap_lookup (name);
if (! real_glXGetProcAddressARB) {
fprintf (stderr, "Error: Failed to find function %s.\n",
name);