[Mesa-dev] [PATCH] egl: dri2: Use present extension. (Was: Re: [RFC] egl: Add DRI3 support to the EGL backend.)

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Thu Nov 6 02:16:46 PST 2014


On ke, 2014-11-05 at 15:19 +0000, Emil Velikov wrote:
> Hi Joonas,
> 
> Does getting rid of the viewport hack give you any noticeable
> performance improvement?

Yes, it significantly reduces the CPU load when multiple glViewport
calls are made per frame (4x4 grid or so).

> Is there any interest in converting the
> egl_dri2 backend to dri3, rather than just copying over the present bits ?
> 

This could be one thing to do. But in the meanwhile, I would commit this
present extension patch so that the affected use cases get the
improvements.

Regards, Joonas

> On 05/11/14 11:14, Joonas Lahtinen wrote:
> > Hi,
> > 
> > Modified not refer to DRI3, just uses the present extension to get rid
> > of the excess buffer invalidations.
> > 
> > Regards, Joonas
> > 
> > From 257e2a8c750f9dcf868cce9da8632df3cae0fcec Mon Sep 17 00:00:00 2001
> > From: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> > Date: Wed, 5 Nov 2014 12:25:32 +0200
> > Subject: [PATCH] egl: dri2: Use present extension.
> > 
> > Present extension is used to avoid excess buffer invalidations, because
> > the XCB interface doesn't supply that information.
> > 
> > Signed-off-by: Daniel van der Wath <danielx.j.van.der.wath at intel.com>
> > Signed-off-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> > ---
> >  configure.ac                            |    5 +-
> >  src/egl/drivers/dri2/egl_dri2.c         |    2 +-
> >  src/egl/drivers/dri2/egl_dri2.h         |   24 ++-
> >  src/egl/drivers/dri2/platform_x11.c     |  247 ++++++++++++++++++++++++++++---
> >  src/mesa/drivers/dri/i965/brw_context.c |    9 +-
> >  5 files changed, 262 insertions(+), 25 deletions(-)
> > 
> > diff --git a/configure.ac b/configure.ac
> > index fc7d372..75d90c0 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -952,7 +952,8 @@ xyesno)
> >              fi
> >  
> >              if test x"$enable_dri" = xyes; then
> > -               dri_modules="$dri_modules xcb-dri2 >= $XCBDRI2_REQUIRED"
> > +               PKG_CHECK_MODULES([PRESENTPROTO], [presentproto >= $PRESENTPROTO_REQUIRED])
> > +               dri_modules="$dri_modules xcb-dri2 >= $XCBDRI2_REQUIRED xcb-present"
> Afaics you are not changing anything on the dri modules (or glx/dri2) to
> require the above changes. Perhaps you need to push the presentproto
> check in the x11 case below ?
> 
> >              fi
> >  
> >              if test x"$enable_dri3" = xyes; then
> > @@ -1564,7 +1565,7 @@ for plat in $egl_platforms; do
> >  		;;
> >  
> >  	x11)
> > -		PKG_CHECK_MODULES([XCB_DRI2], [x11-xcb xcb xcb-dri2 >= $XCBDRI2_REQUIRED xcb-xfixes])
> > +		PKG_CHECK_MODULES([XCB_DRI2], [x11-xcb xcb xcb-dri2 >= $XCBDRI2_REQUIRED xcb-xfixes xcb-present])
> >  		;;
> >  
> >  	drm)
> [snip]
> > diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
> > index f8c4b70..a1445b2 100644
> > --- a/src/egl/drivers/dri2/platform_x11.c
> > +++ b/src/egl/drivers/dri2/platform_x11.c
> > @@ -188,6 +188,205 @@ get_xcb_screen(xcb_screen_iterator_t iter, int screen)
> >      return NULL;
> >  }
> >  
> > +/*
> > + * Called by the XCB_PRESENT_COMPLETE_NOTIFY case.
> > + */
> > +static void
> > +dri2_update_num_back(struct dri2_egl_surface *priv)
> > +{
> > +   priv->num_back = 1;
> > +   if (priv->flipping)
> > +      priv->num_back++;
> > +   if (priv->base.SwapInterval == 0)
> > +      priv->num_back++;
> > +}
> > +
> This seems to be out of sync with dri3_glx. Don't you need something
> similar to commit f7a355556ef5fe23056299a77414f9ad8b5e5a1d ?
> 
> [snip]
> > +/**
> > + *
> > + * Process any present events that have been received from the X server
> > + *
> > + * From glx, we additionally invalidate the drawable here if there has a been a special event.
> > + */
> > +static void
> > +dri2_flush_present_events(struct dri2_egl_display *dri2_dpy, struct dri2_egl_surface *priv)
> > +{
> > +   xcb_connection_t     *c = dri2_dpy->conn;
> > +
> > +   /* Check to see if any configuration changes have occurred
> > +    * since we were last invoked
> > +    */
> > +   if (priv->special_event) {
> > +      xcb_generic_event_t    *ev;
> > +
> > +      while ((ev = xcb_poll_for_special_event(c, priv->special_event)) != NULL) {
> > +         xcb_present_generic_event_t *ge = (void *) ev;
> > +         dri2_handle_present_event(priv, ge);
> > +         _eglLog(_EGL_INFO, "DRI: Invalidating buffer 0x%x\n", priv->dri_drawable);
> > +         (*dri2_dpy->flush->invalidate)(priv->dri_drawable);
> Hmm why does one need to invalidate at this stage - I take that it's
> related to lack of fence objects ?
> 
> [snip]
> > diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> > index e1a994a..dbadd10 100644
> > --- a/src/mesa/drivers/dri/i965/brw_context.c
> > +++ b/src/mesa/drivers/dri/i965/brw_context.c
> > @@ -148,6 +148,9 @@ intel_viewport(struct gl_context *ctx)
> >     __DRIcontext *driContext = brw->driContext;
> >  
> >     if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) {
> > +      if (unlikely(INTEL_DEBUG & DEBUG_DRI))
> > +         fprintf(stderr, "invalidating drawables\n");
> > +
> >        dri2InvalidateDrawable(driContext->driDrawablePriv);
> >        dri2InvalidateDrawable(driContext->driReadablePriv);
> >     }
> > @@ -252,11 +255,9 @@ brw_init_driver_functions(struct brw_context *brw,
> >     _mesa_init_driver_functions(functions);
> >  
> >     /* GLX uses DRI2 invalidate events to handle window resizing.
> > -    * Unfortunately, EGL does not - libEGL is written in XCB (not Xlib),
> > -    * which doesn't provide a mechanism for snooping the event queues.
> > +    * EGL uses present invalidate events to do the same.
> >      *
> > -    * So EGL still relies on viewport hacks to handle window resizing.
> > -    * This should go away with DRI3000.
> > +    * Others have to rely on viewport hacks to handle window resizing.
> >      */
> Bikeshed: maybe move the i965 changes in a separate patch ?
> 
> 
> Cheers,
> Emil
> 
> >     if (!brw->driContext->driScreenPriv->dri2.useInvalidate)
> >        functions->Viewport = intel_viewport;
> > 
> 




More information about the mesa-dev mailing list