The code is cut-and-pasted from dri2_glx.c; we can't quite share it because we have to use different structures.
Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> Cc: Keith Packard <kei...@keithp.com> --- src/glx/dri3_glx.c | 35 ++++++++++++++++++++++++++++++++++- src/glx/dri3_priv.h | 6 +++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index e8e5c4a..183b2c0 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -1474,6 +1474,30 @@ static const __DRIextension *loader_extensions[] = { NULL }; +static void +show_fps(struct dri3_drawable *draw) +{ + const int interval = + ((struct dri3_screen *) draw->base.psc)->show_fps_interval; + struct timeval tv; + uint64_t current_time; + + gettimeofday(&tv, 0); + current_time = (uint64_t) tv.tv_sec * 1000000 + (uint64_t) tv.tv_usec; + + draw->frames++; + + if (draw->previous_time + interval * 1000000 <= current_time) { + if (draw->previous_time) { + fprintf(stderr, "libGL: FPS = %.1f\n", + ((uint64_t)draw->frames * 1000000) / + (double)(current_time - draw->previous_time)); + } + draw->frames = 0; + draw->previous_time = current_time; + } +} + /** dri3_swap_buffers * * Make the current back buffer visible using the present extension @@ -1568,6 +1592,10 @@ dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, (*psc->f->invalidate)(priv->driDrawable); + if (psc->show_fps_interval) { + show_fps(priv); + } + return ret; } @@ -1830,7 +1858,7 @@ dri3_create_screen(int screen, struct glx_display * priv) struct dri3_screen *psc; __GLXDRIscreen *psp; struct glx_config *configs = NULL, *visuals = NULL; - char *driverName, *deviceName; + char *driverName, *deviceName, *tmp; int i; psc = calloc(1, sizeof *psc); @@ -1969,6 +1997,11 @@ dri3_create_screen(int screen, struct glx_display * priv) free(driverName); free(deviceName); + tmp = getenv("LIBGL_SHOW_FPS"); + psc->show_fps_interval = tmp ? atoi(tmp) : 0; + if (psc->show_fps_interval < 0) + psc->show_fps_interval = 0; + return &psc->base; handle_error: diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h index bdfe224..2bd5a4d 100644 --- a/src/glx/dri3_priv.h +++ b/src/glx/dri3_priv.h @@ -138,7 +138,7 @@ struct dri3_screen { int fd; int is_different_gpu; - Bool show_fps; + int show_fps_interval; }; struct dri3_context @@ -198,6 +198,10 @@ struct dri3_drawable { xcb_present_event_t eid; xcb_gcontext_t gc; xcb_special_event_t *special_event; + + /* LIBGL_SHOW_FPS support */ + uint64_t previous_time; + unsigned frames; }; -- 2.1.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev