From: Daniel Stone Date: Fri, 16 Jun 2017 09:28:03 +0000 (+0100) Subject: gbm: Axe buffer import format conversion table X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=commitdiff_plain;h=6f8d8b17a1e25361881dfa4f91a43c1c04b029f9 gbm: Axe buffer import format conversion table Wayland buffers coming from wl_drm use the WL_DRM_FORMAT_* enums, which are identical to GBM_FORMAT_*. Similarly, FD imports do not need to convert between GBM and DRI FourCC, since they are (almost) completely compatible. This widens the formats accepted by gbm_bo_import() when importing wl_buffers; previously, only XRGB8888, ARGB8888, RGB565 and YUYV were supported. Reviewed-by: Emil Velikov --- diff --git a/src/egl/wayland/wayland-drm/wayland-drm.xml b/src/egl/wayland/wayland-drm/wayland-drm.xml index 5e64622df67..83aa5615539 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.xml +++ b/src/egl/wayland/wayland-drm/wayland-drm.xml @@ -39,7 +39,8 @@ + reported by the format event. New codes must not be added, + unless directly taken from drm_fourcc.h. --> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index ecb360773c3..d4bf2430341 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -850,23 +850,9 @@ gbm_dri_bo_import(struct gbm_device *gbm, image = dri->image->dupImage(wb->driver_buffer, NULL); - switch (wb->format) { - case WL_DRM_FORMAT_XRGB8888: - gbm_format = GBM_FORMAT_XRGB8888; - break; - case WL_DRM_FORMAT_ARGB8888: - gbm_format = GBM_FORMAT_ARGB8888; - break; - case WL_DRM_FORMAT_RGB565: - gbm_format = GBM_FORMAT_RGB565; - break; - case WL_DRM_FORMAT_YUYV: - gbm_format = GBM_FORMAT_YUYV; - break; - default: - dri->image->destroyImage(image); - return NULL; - } + /* GBM_FORMAT_* is identical to WL_DRM_FORMAT_*, so no conversion + * required. */ + gbm_format = wb->format; break; } #endif @@ -895,23 +881,27 @@ gbm_dri_bo_import(struct gbm_device *gbm, { struct gbm_import_fd_data *fd_data = buffer; int stride = fd_data->stride, offset = 0; - int dri_format; + int fourcc; + /* GBM's GBM_FORMAT_* tokens are a strict superset of the DRI FourCC + * tokens accepted by createImageFromFds, except for not supporting + * the sARGB format. Also, GBM_BO_FORMAT_* are defined differently to + * their GBM_FORMAT_* equivalents, so remap them here. */ switch (fd_data->format) { case GBM_BO_FORMAT_XRGB8888: - dri_format = GBM_FORMAT_XRGB8888; + fourcc = GBM_FORMAT_XRGB8888; break; case GBM_BO_FORMAT_ARGB8888: - dri_format = GBM_FORMAT_ARGB8888; + fourcc = GBM_FORMAT_ARGB8888; break; default: - dri_format = fd_data->format; + fourcc = fd_data->format; } image = dri->image->createImageFromFds(dri->screen, fd_data->width, fd_data->height, - dri_format, + fourcc, &fd_data->fd, 1, &stride, &offset, NULL); @@ -936,27 +926,19 @@ gbm_dri_bo_import(struct gbm_device *gbm, 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: + /* GBM's GBM_FORMAT_* tokens are a strict superset of the DRI FourCC + * tokens accepted by createImageFromDmaBufs2, except for not supporting + * the sARGB format. Also, GBM_BO_FORMAT_* are defined differently to + * their GBM_FORMAT_* equivalents, so remap them here. */ + switch (fd_data->format) { case GBM_BO_FORMAT_XRGB8888: - fourcc = __DRI_IMAGE_FOURCC_XRGB8888; - break; - case GBM_FORMAT_ABGR8888: - fourcc = __DRI_IMAGE_FOURCC_ABGR8888; + fourcc = GBM_FORMAT_XRGB8888; break; - case GBM_FORMAT_XBGR8888: - fourcc = __DRI_IMAGE_FOURCC_XBGR8888; + case GBM_BO_FORMAT_ARGB8888: + fourcc = GBM_FORMAT_ARGB8888; break; default: - errno = EINVAL; - return NULL; + fourcc = fd_data->format; } image = dri->image->createImageFromDmaBufs2(dri->screen, fd_data->width, @@ -973,7 +955,7 @@ gbm_dri_bo_import(struct gbm_device *gbm, return NULL; } - gbm_format = fd_data->format; + gbm_format = fourcc; break; } diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h index 6a9bf1fc2a8..879f003f1b4 100644 --- a/src/gbm/main/gbm.h +++ b/src/gbm/main/gbm.h @@ -77,6 +77,12 @@ enum gbm_bo_format { GBM_BO_FORMAT_ARGB8888 }; + +/** + * The FourCC format codes are taken from the drm_fourcc.h definition, and + * re-namespaced. New GBM formats must not be added, unless they are + * identical ports from drm_fourcc. + */ #define __gbm_fourcc_code(a,b,c,d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \ ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))