diff options
author | Marek Olšák <[email protected]> | 2012-01-04 02:09:44 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-01-05 18:29:11 +0100 |
commit | f82d40d4b1aa60364c03c32578ecd675d4d86dcf (patch) | |
tree | 42ce4094cd7e77557561fe5f765f9473f0abe2b2 /src | |
parent | c77efc6bb63f7ff3f1ddf500e57beff5b317b9b1 (diff) |
glx/dri2: print FPS when env var LIBGL_SHOW_FPS is 1 (v2)
This is useful for apps which don't print FPS.
Only enabled in SwapBuffers.
v2: track state per drawable, use libGL prefix
Reviewed-by: Michel Dänzer <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/glx/dri2_glx.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 51d45c9a3b9..10b6f525ea2 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -43,6 +43,7 @@ #include <unistd.h> #include <sys/types.h> #include <sys/mman.h> +#include <sys/time.h> #include "xf86drm.h" #include "dri2.h" #include "dri_common.h" @@ -90,6 +91,8 @@ struct dri2_screen { void *driver; int fd; + + Bool show_fps; }; struct dri2_context @@ -108,6 +111,9 @@ struct dri2_drawable int have_back; int have_fake_front; int swap_interval; + + double previous_time; + unsigned frames; }; static const struct glx_context_vtable dri2_context_vtable; @@ -661,6 +667,26 @@ unsigned dri2GetSwapEventType(Display* dpy, XID drawable) return glx_dpy->codes->first_event + GLX_BufferSwapComplete; } +static void show_fps(struct dri2_drawable *draw) +{ + struct timeval tv; + double current_time; + + gettimeofday(&tv, 0); + current_time = (double)tv.tv_sec + (double)tv.tv_usec * 0.000001; + + draw->frames++; + + if (draw->previous_time + 1 < current_time) { + if (draw->previous_time) { + fprintf(stderr, "libGL: FPS = %.1f\n", + draw->frames / (current_time - draw->previous_time)); + } + draw->frames = 0; + draw->previous_time = current_time; + } +} + static int64_t dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, int64_t remainder) @@ -699,6 +725,10 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, #endif } + if (psc->show_fps) { + show_fps(priv); + } + /* Old servers don't send invalidate events */ if (!pdp->invalidateAvailable) dri2InvalidateBuffers(dpyPriv->dpy, pdraw->xDrawable); @@ -967,7 +997,7 @@ dri2CreateScreen(int screen, struct glx_display * priv) struct dri2_screen *psc; __GLXDRIscreen *psp; struct glx_config *configs = NULL, *visuals = NULL; - char *driverName, *deviceName; + char *driverName, *deviceName, *tmp; drm_magic_t magic; int i; @@ -1099,6 +1129,9 @@ dri2CreateScreen(int screen, struct glx_display * priv) Xfree(driverName); Xfree(deviceName); + tmp = getenv("LIBGL_SHOW_FPS"); + psc->show_fps = tmp && strcmp(tmp, "1") == 0; + return &psc->base; handle_error: |