[Mesa-dev] [PATCH] glx/dri3: Port LIBGL_SHOW_FPS=1 code from DRI2 to DRI3.

Marek Olšák maraeo at gmail.com
Tue Oct 28 07:54:33 PDT 2014


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Tue, Oct 28, 2014 at 8:09 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> 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 <kenneth at whitecape.org>
> Cc: Keith Packard <keithp at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list