[Mesa-dev] [RFC 01/22] RFC: egl/x11: Support DRI3 v1.1

Eric Engestrom eric.engestrom at imgtec.com
Wed Jun 14 15:45:56 UTC 2017


On Thursday, 2017-06-08 19:43:59 +0100, Daniel Stone wrote:
> From: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
> 
> Add support for DRI3 v1.1, which allows pixmaps to be backed by
> multi-planar buffers, or those with format modifiers. This is both
> for allocating render buffers, as well as EGLImage imports from a
> native pixmap (EGL_NATIVE_PIXMAP_KHR).
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  src/egl/drivers/dri2/egl_dri2.c          |   3 +
>  src/egl/drivers/dri2/egl_dri2.h          |   1 +
>  src/egl/drivers/dri2/platform_x11_dri3.c |  62 +++++++-
>  src/glx/dri3_glx.c                       |  10 +-
>  src/loader/loader_dri3_helper.c          | 250 +++++++++++++++++++++++++------
>  src/loader/loader_dri3_helper.h          |  16 +-
>  6 files changed, 293 insertions(+), 49 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 7175e827c9..5b0799fcc4 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -804,6 +804,9 @@ dri2_setup_extensions(_EGLDisplay *disp)
>     if (!dri2_bind_extensions(dri2_dpy, mandatory_core_extensions, extensions, false))
>        return EGL_FALSE;
>  
> +   dri2_dpy->multibuffers_available &=
> +      (dri2_dpy->image && dri2_dpy->image->base.version >= 15);

Probably a matter of taste, but I find this more readable:

   if (!dri2_dpy->image || dri2_dpy->image->base.version < 15);
      dri2_dpy->multibuffers_available = false;


> diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
> index 493a7f5218..3908512b9f 100644
> --- a/src/loader/loader_dri3_helper.c
> +++ b/src/loader/loader_dri3_helper.c
[snip]
> @@ -814,6 +820,27 @@ dri3_cpp_for_format(uint32_t format) {
>     }
>  }
>  
> +/* the DRIimage createImage function takes __DRI_IMAGE_FORMAT codes, while
> + * the createImageFromFds call takes __DRI_IMAGE_FOURCC codes. To avoid
> + * complete confusion, just deal in __DRI_IMAGE_FORMAT codes for now and
> + * translate to __DRI_IMAGE_FOURCC codes in the call to createImageFromFds
> + */
> +static int
> +image_format_to_fourcc(int format)
> +{
> +
> +   /* Convert from __DRI_IMAGE_FORMAT to __DRI_IMAGE_FOURCC (sigh) */
> +   switch (format) {
> +   case __DRI_IMAGE_FORMAT_SARGB8: return __DRI_IMAGE_FOURCC_SARGB8888;
> +   case __DRI_IMAGE_FORMAT_RGB565: return __DRI_IMAGE_FOURCC_RGB565;
> +   case __DRI_IMAGE_FORMAT_XRGB8888: return __DRI_IMAGE_FOURCC_XRGB8888;
> +   case __DRI_IMAGE_FORMAT_ARGB8888: return __DRI_IMAGE_FOURCC_ARGB8888;
> +   case __DRI_IMAGE_FORMAT_ABGR8888: return __DRI_IMAGE_FOURCC_ABGR8888;
> +   case __DRI_IMAGE_FORMAT_XBGR8888: return __DRI_IMAGE_FOURCC_XBGR8888;
> +   }
> +   return 0;
> +}
> +

I like to have "move code around" and other light refactor commits
separate from "change code" commits, but that's kind of a nitpick (and
I don't even always follow this rule myself, so feel free to ignore).


> @@ -890,25 +972,82 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
>           goto no_linear_buffer;
>     }
>  
> -   /* X wants the stride, so ask the image for it
> +   /* X want some information about the planes, so ask the image for it
>      */
> -   if (!draw->ext->image->queryImage(pixmap_buffer, __DRI_IMAGE_ATTRIB_STRIDE,
> -                                     &stride))
> -      goto no_buffer_attrib;
> -
> -   buffer->pitch = stride;
> +   draw->ext->image->queryImage(pixmap_buffer, __DRI_IMAGE_ATTRIB_NUM_PLANES,
> +                                &num_planes);
> +   if (num_planes <= 0)
> +      num_planes = 1;
> +
> +   for (i = 0; i < num_planes; i++) {
> +      __DRIimage *image = draw->ext->image->fromPlanar(pixmap_buffer, i, NULL);
> +      int ret;
> +      if (!image)
> +         image = pixmap_buffer;
> +      ret = draw->ext->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD,
> +                                         &buffer_fds[i]);
> +      if (!ret) {
> +         if (image != pixmap_buffer)
> +            draw->ext->image->destroyImage(image);
> +         goto no_buffer_attrib;
> +      }
> +      ret = draw->ext->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE,
> +                                         &buffer->strides[i]);
> +      if (!ret) {
> +         if (image != pixmap_buffer)
> +            draw->ext->image->destroyImage(image);
> +         goto no_buffer_attrib;
[snip]
> @@ -930,6 +1069,8 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
>     return buffer;
>  
>  no_buffer_attrib:
> +   while (--i >= 0)
> +      close(buffer_fds[i]);

Unless my maths is wrong, this leaves the top fd open.

   do
   {
      close(buffer_fds[i]);
   }
   while (--i >= 0);

With this close() loop fix, this is
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>

Cheers,
  Eric


More information about the mesa-dev mailing list