[Mesa-dev] [PATCH v4 3/5] egl/dri: Use __DRI2_DAMAGE extension for KHR_partial_update

Harish Krupo harish.krupo.kps at intel.com
Thu Jun 27 07:59:38 UTC 2019


Hi Boris,

Thank you for resurrecting this series and taking it further. Just one
nitpick.
The commit summary should read:
"egl/dri: Use __DRI_BUFFER_DAMAGE extension for KHR_partial_update"

While you are at it, could you please update my authorship and signoff
to:
"Harish Krupo <harishkrupo at gmail.com>" ?

Thank you
Regards
Harish Krupo

Boris Brezillon <boris.brezillon at collabora.com> writes:

> From: Harish Krupo <harish.krupo.kps at intel.com>
>
> Use the DRI2 interface callback to pass the damage rects to
> the driver.
>
> Signed-off-by: Harish Krupo <harish.krupo.kps at intel.com>
> Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
> ---
>  src/egl/drivers/dri2/egl_dri2.c | 55 ++++++++++++++++++++++++++++++---
>  src/egl/drivers/dri2/egl_dri2.h |  1 +
>  2 files changed, 51 insertions(+), 5 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 3c33b2cf27f8..fcafcfd73c63 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -452,6 +452,7 @@ static const struct dri2_extension_match optional_core_extensions[] = {
>     { __DRI2_NO_ERROR, 1, offsetof(struct dri2_egl_display, no_error) },
>     { __DRI2_CONFIG_QUERY, 1, offsetof(struct dri2_egl_display, config) },
>     { __DRI2_FENCE, 1, offsetof(struct dri2_egl_display, fence) },
> +   { __DRI2_BUFFER_DAMAGE, 1, offsetof(struct dri2_egl_display, buffer_damage) },
>     { __DRI2_RENDERER_QUERY, 1, offsetof(struct dri2_egl_display, rendererQuery) },
>     { __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) },
>     { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) },
> @@ -721,6 +722,9 @@ dri2_setup_screen(_EGLDisplay *disp)
>  
>     if (dri2_dpy->flush_control)
>        disp->Extensions.KHR_context_flush_control = EGL_TRUE;
> +
> +   if (dri2_dpy->buffer_damage && dri2_dpy->buffer_damage->set_damage_region)
> +      disp->Extensions.KHR_partial_update = EGL_TRUE;
>  }
>  
>  void
> @@ -1658,11 +1662,22 @@ static EGLBoolean
>  dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
>  {
>     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> +   __DRIdrawable *dri_drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
>     _EGLContext *ctx = _eglGetCurrentContext();
> +   EGLBoolean ret;
>  
>     if (ctx && surf)
>        dri2_surf_update_fence_fd(ctx, disp, surf);
> -   return dri2_dpy->vtbl->swap_buffers(drv, disp, surf);
> +   ret = dri2_dpy->vtbl->swap_buffers(drv, disp, surf);
> +
> +   /* SwapBuffers marks the end of the frame; reset the damage region for
> +    * use again next time.
> +    */
> +   if (ret && dri2_dpy->buffer_damage &&
> +       dri2_dpy->buffer_damage->set_damage_region)
> +      dri2_dpy->buffer_damage->set_damage_region(dri_drawable, 0, NULL);
> +
> +   return ret;
>  }
>  
>  static EGLBoolean
> @@ -1671,12 +1686,23 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv, _EGLDisplay *disp,
>                                const EGLint *rects, EGLint n_rects)
>  {
>     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> +   __DRIdrawable *dri_drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
>     _EGLContext *ctx = _eglGetCurrentContext();
> +   EGLBoolean ret;
>  
>     if (ctx && surf)
>        dri2_surf_update_fence_fd(ctx, disp, surf);
> -   return dri2_dpy->vtbl->swap_buffers_with_damage(drv, disp, surf,
> -                                                   rects, n_rects);
> +   ret = dri2_dpy->vtbl->swap_buffers_with_damage(drv, disp, surf,
> +                                                  rects, n_rects);
> +
> +   /* SwapBuffers marks the end of the frame; reset the damage region for
> +    * use again next time.
> +    */
> +   if (ret && dri2_dpy->buffer_damage &&
> +       dri2_dpy->buffer_damage->set_damage_region)
> +      dri2_dpy->buffer_damage->set_damage_region(dri_drawable, 0, NULL);
> +
> +   return ret;
>  }
>  
>  static EGLBoolean
> @@ -1684,14 +1710,33 @@ dri2_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
>                           EGLint numRects, const EGLint *rects)
>  {
>     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> -   return dri2_dpy->vtbl->swap_buffers_region(drv, disp, surf, numRects, rects);
> +   __DRIdrawable *dri_drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
> +   EGLBoolean ret;
> +
> +   ret = dri2_dpy->vtbl->swap_buffers_region(drv, disp, surf, numRects, rects);
> +
> +   /* SwapBuffers marks the end of the frame; reset the damage region for
> +    * use again next time.
> +    */
> +   if (ret && dri2_dpy->buffer_damage &&
> +       dri2_dpy->buffer_damage->set_damage_region)
> +      dri2_dpy->buffer_damage->set_damage_region(dri_drawable, 0, NULL);
> +
> +   return ret;
>  }
>  
>  static EGLBoolean
>  dri2_set_damage_region(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
>                         EGLint *rects, EGLint n_rects)
>  {
> -   return false;
> +   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> +   __DRIdrawable *drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
> +
> +   if (!dri2_dpy->buffer_damage || !dri2_dpy->buffer_damage->set_damage_region)
> +      return EGL_FALSE;
> +
> +   dri2_dpy->buffer_damage->set_damage_region(drawable, n_rects, rects);
> +   return EGL_TRUE;
>  }
>  
>  static EGLBoolean
> diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
> index f9237dbe2559..00bce2285d3e 100644
> --- a/src/egl/drivers/dri2/egl_dri2.h
> +++ b/src/egl/drivers/dri2/egl_dri2.h
> @@ -178,6 +178,7 @@ struct dri2_egl_display
>     const __DRInoErrorExtension    *no_error;
>     const __DRI2configQueryExtension *config;
>     const __DRI2fenceExtension *fence;
> +   const __DRI2bufferDamageExtension *buffer_damage;
>     const __DRI2blobExtension *blob;
>     const __DRI2rendererQueryExtension *rendererQuery;
>     const __DRI2interopExtension *interop;



More information about the mesa-dev mailing list