[Mesa-dev] [PATCH 2/2] gbm: implement FD import with modifier

Robert Foss robert.foss at collabora.com
Thu Jun 8 20:13:18 UTC 2017


This patch has been tested on Android on the iMX6.

Tested-by: Robert Foss <robert.foss at collabora.com>

On Thu, 2017-06-08 at 20:56 +0200, Lucas Stach wrote:
> This implements a way to import FDs with modifiers on plain GBM
> devices,
> without the need to go through EGL. This is mostly to the benefit of
> gbm_gralloc, which can keep its dependencies low.
> 
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
> ---
>  src/gbm/backends/dri/gbm_dri.c | 54
> ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 54 insertions(+)
> 
> diff --git a/src/gbm/backends/dri/gbm_dri.c
> b/src/gbm/backends/dri/gbm_dri.c
> index 7fb569078b27..19be440d48e3 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -932,6 +932,60 @@ gbm_dri_bo_import(struct gbm_device *gbm,
>        break;
>     }
>  
> +   case GBM_BO_IMPORT_FD_MODIFIER:
> +   {
> +      struct gbm_import_fd_modifier_data *fd_data = buffer;
> +      unsigned int error;
> +      int fourcc;
> +
> +      /* Import with modifier requires createImageFromDmaBufs2 */
> +      if (dri->image == NULL || dri->image->base.version < 15 ||
> +          dri->image->createImageFromDmaBufs2 == NULL) {
> +         errno = ENOSYS;
> +         return NULL;
> +      }
> +
> +      switch(fd_data->format) {
> +      case GBM_FORMAT_RGB565:
> +         fourcc = __DRI_IMAGE_FOURCC_RGB565;
> +         break;
> +      case GBM_FORMAT_ARGB8888:
> +      case GBM_BO_FORMAT_ARGB8888:
> +         fourcc = __DRI_IMAGE_FOURCC_ARGB8888;
> +         break;
> +      case GBM_FORMAT_XRGB8888:
> +      case GBM_BO_FORMAT_XRGB8888:
> +         fourcc = __DRI_IMAGE_FOURCC_XRGB8888;
> +         break;
> +      case GBM_FORMAT_ABGR8888:
> +         fourcc = __DRI_IMAGE_FOURCC_ABGR8888;
> +         break;
> +      case GBM_FORMAT_XBGR8888:
> +         fourcc = __DRI_IMAGE_FOURCC_XBGR8888;
> +         break;
> +      default:
> +         errno = EINVAL;
> +         return NULL;
> +      }
> +
> +      image = dri->image->createImageFromDmaBufs2(dri->screen,
> fd_data->width,
> +                                                  fd_data->height,
> fourcc,
> +                                                  fd_data->modifier,
> +                                                  fd_data->fds,
> +                                                  fd_data->num_fds,
> +                                                  fd_data->strides,
> +                                                  fd_data->offsets,
> +                                                  0, 0, 0, 0,
> +                                                  &error, NULL);
> +      if (image == NULL) {
> +         errno = ENOSYS;
> +         return NULL;
> +      }
> +
> +      gbm_format = fd_data->format;
> +      break;
> +   }
> +
>     default:
>        errno = ENOSYS;
>        return NULL;


More information about the mesa-dev mailing list