Kenneth Graunke <kenn...@whitecape.org> writes: > v2: Use the UST value provided in the PRESENT_COMPLETE_NOTIFY event > rather than gettimeofday(), which gives us the presentation time > instead of the time when SwapBuffers was called. Suggested by > Keith Packard. This relies on the fact that the X Present > implementation uses microseconds for UST. > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > Cc: Keith Packard <kei...@keithp.com> > Cc: Marek Olšák <marek.ol...@amd.com> > --- > src/glx/dri3_glx.c | 33 ++++++++++++++++++++++++++++++++- > src/glx/dri3_priv.h | 6 +++++- > 2 files changed, 37 insertions(+), 2 deletions(-) > > Is this what you had in mind, Keith? It seems to work fine as well, > and as long as we can rely on UST being in microseconds, it definitely > seems nicer.
Present doesn't actually define UST at this point, but I think we can just fix that; it seems useless to *not* define it, and microseconds seems like a fine resolution for this clock. Certainly anything using DRI3 will use microseconds as that's the kind of time stamps it uses. > diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c > index e8e5c4a..ff9c2f3 100644 > --- a/src/glx/dri3_glx.c > +++ b/src/glx/dri3_glx.c > @@ -361,12 +361,34 @@ dri3_create_drawable(struct glx_screen *base, XID > xDrawable, > return &pdraw->base; > } > > +static void > +show_fps(struct dri3_drawable *draw) > +{ > + const int interval = > + ((struct dri3_screen *) draw->base.psc)->show_fps_interval; > + > + draw->frames++; > + > + /* The Present extension uses microseconds for UST. */ > + if (draw->previous_ust + interval * 1000000 <= draw->ust) { Might want a cast here before the multiply, otherwise that gets done with only 32 bits. It probably doesn't matter because interval is likely to be small. > + if (draw->previous_ust) { > + fprintf(stderr, "libGL: FPS = %.1f\n", > + ((uint64_t)draw->frames * 1000000) / > + (double)(draw->ust - draw->previous_ust)); > + } > + draw->frames = 0; > + draw->previous_ust = draw->ust; > + } > +} > + > /* > * Process one Present event > */ > static void > dri3_handle_present_event(struct dri3_drawable *priv, > xcb_present_generic_event_t *ge) > { > + struct dri3_screen *psc = (struct dri3_screen *) priv->base.psc; > + > switch (ge->evtype) { > case XCB_PRESENT_CONFIGURE_NOTIFY: { > xcb_present_configure_notify_event_t *ce = (void *) ge; > @@ -400,6 +422,10 @@ dri3_handle_present_event(struct dri3_drawable *priv, > xcb_present_generic_event_ > } > priv->ust = ce->ust; > priv->msc = ce->msc; > + > + if (psc->show_fps_interval) { > + show_fps(priv); > + } This actually needs to be inside the COMPLETE_KIND_PIXMAP; this same event is delivered when the application gets the current MSC, and you don't want to count those. -- keith.pack...@intel.com
pgpvBPF1D0o1I.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev