[Mesa-dev] [PATCH v2 05/11] gbm: Pull out FourCC <-> DRIimage format table

Jason Ekstrand jason at jlekstrand.net
Thu Jul 13 15:59:57 UTC 2017


On July 13, 2017 4:13:17 AM Daniel Stone <daniels at collabora.com> wrote:

> Rather than duplicated (yet asymmetric) open-coded tables, pull them out
> to a common structure.
>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  src/gbm/Makefile.am            |   1 +
>  src/gbm/backends/dri/gbm_dri.c | 113 +++++++++++++++++++----------------------
>  2 files changed, 54 insertions(+), 60 deletions(-)
>
> v2: Add extra include, fix GBM_BO_FORMAT_* fallback with long comment.
>
> diff --git a/src/gbm/Makefile.am b/src/gbm/Makefile.am
> index 60b0924506..de8396000b 100644
> --- a/src/gbm/Makefile.am
> +++ b/src/gbm/Makefile.am
> @@ -5,6 +5,7 @@ pkgconfig_DATA = main/gbm.pc
>
>  AM_CFLAGS = \
>  	-I$(top_srcdir)/include \
> +	-I$(top_srcdir)/src \
>  	-I$(top_srcdir)/src/loader \
>  	-I$(top_srcdir)/src/gbm/main \
>  	$(DLOPEN_CFLAGS) \
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> index d4bf243034..99df265c6b 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -48,6 +48,7 @@
>
>  #include "gbmint.h"
>  #include "loader.h"
> +#include "util/macros.h"
>
>  /* For importing wl_buffer */
>  #if HAVE_WAYLAND_PLATFORM
> @@ -541,6 +542,56 @@ dri_screen_create_sw(struct gbm_dri_device *dri)
>     return dri_screen_create_swrast(dri);
>  }
>
> +static const struct {
> +   uint32_t gbm_format;
> +   int dri_image_format;
> +} gbm_to_dri_image_formats[] = {
> +   { GBM_FORMAT_R8,          __DRI_IMAGE_FORMAT_R8          },
> +   { GBM_FORMAT_GR88,        __DRI_IMAGE_FORMAT_GR88        },
> +   { GBM_FORMAT_RGB565,      __DRI_IMAGE_FORMAT_RGB565      },
> +   { GBM_FORMAT_XRGB8888,    __DRI_IMAGE_FORMAT_XRGB8888    },
> +   { GBM_FORMAT_ARGB8888,    __DRI_IMAGE_FORMAT_ARGB8888    },
> +   { GBM_FORMAT_XBGR8888,    __DRI_IMAGE_FORMAT_XBGR8888    },
> +   { GBM_FORMAT_ABGR8888,    __DRI_IMAGE_FORMAT_ABGR8888    },
> +   { GBM_FORMAT_XRGB2101010, __DRI_IMAGE_FORMAT_XRGB2101010 },
> +   { GBM_FORMAT_ARGB2101010, __DRI_IMAGE_FORMAT_ARGB2101010 },
> +};
> +
> +static int
> +gbm_format_to_dri_format(uint32_t gbm_format)
> +{
> +   int i;
> +
> +   /* The two GBM_BO_FORMAT_[XA]RGB8888 formats alias the GBM_FORMAT_*
> +    * formats of the same name. We want to accept them whenever someone
> +    * has a GBM format, but never return them to the user. */
> +   if (gbm_format == GBM_BO_FORMAT_XRGB8888)
> +      gbm_format = GBM_FORMAT_XRGB8888;
> +   else if (gbm_format == GBM_BO_FORMAT_ARGB8888)
> +      gbm_format = GBM_FORMAT_ARGB8888;

You could put them in the table but make sure they come after their 
GBM_FORMAT counterparts.  I'm not sure if that's actually better though.

> +
> +   for (i = 0; i < ARRAY_SIZE(gbm_to_dri_image_formats); i++) {
> +      if (gbm_to_dri_image_formats[i].gbm_format == gbm_format)
> +         return gbm_to_dri_image_formats[i].dri_image_format;
> +   }
> +
> +   return 0;
> +}
> +
> +static uint32_t
> +gbm_dri_to_gbm_format(int dri_format)
> +{
> +   int i;
> +
> +   for (i = 0; i < ARRAY_SIZE(gbm_to_dri_image_formats); i++) {
> +      if (gbm_to_dri_image_formats[i].dri_image_format == dri_format)
> +         return gbm_to_dri_image_formats[i].gbm_format;
> +   }
> +
> +   return 0;
> +}
> +
> +
>  static int
>  gbm_dri_is_format_supported(struct gbm_device *gbm,
>                              uint32_t format,
> @@ -786,35 +837,6 @@ gbm_dri_bo_destroy(struct gbm_bo *_bo)
>     free(bo);
>  }
>
> -static uint32_t
> -gbm_dri_to_gbm_format(uint32_t dri_format)
> -{
> -   uint32_t ret = 0;
> -
> -   switch (dri_format) {
> -   case __DRI_IMAGE_FORMAT_RGB565:
> -      ret = GBM_FORMAT_RGB565;
> -      break;
> -   case __DRI_IMAGE_FORMAT_XRGB8888:
> -      ret = GBM_FORMAT_XRGB8888;
> -      break;
> -   case __DRI_IMAGE_FORMAT_ARGB8888:
> -      ret = GBM_FORMAT_ARGB8888;
> -      break;
> -   case __DRI_IMAGE_FORMAT_XBGR8888:
> -      ret = GBM_FORMAT_XBGR8888;
> -      break;
> -   case __DRI_IMAGE_FORMAT_ABGR8888:
> -      ret = GBM_FORMAT_ABGR8888;
> -      break;
> -   default:
> -      ret = 0;
> -      break;
> -   }
> -
> -   return ret;
> -}
> -
>  static struct gbm_bo *
>  gbm_dri_bo_import(struct gbm_device *gbm,
>                    uint32_t type, void *buffer, uint32_t usage)
> @@ -1117,37 +1139,8 @@ gbm_dri_bo_create(struct gbm_device *gbm,
>     bo->base.height = height;
>     bo->base.format = format;
>
> -   switch (format) {
> -   case GBM_FORMAT_R8:
> -      dri_format = __DRI_IMAGE_FORMAT_R8;
> -      break;
> -   case GBM_FORMAT_GR88:
> -      dri_format = __DRI_IMAGE_FORMAT_GR88;
> -      break;
> -   case GBM_FORMAT_RGB565:
> -      dri_format = __DRI_IMAGE_FORMAT_RGB565;
> -      break;
> -   case GBM_FORMAT_XRGB8888:
> -   case GBM_BO_FORMAT_XRGB8888:
> -      dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
> -      break;
> -   case GBM_FORMAT_ARGB8888:
> -   case GBM_BO_FORMAT_ARGB8888:
> -      dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
> -      break;
> -   case GBM_FORMAT_ABGR8888:
> -      dri_format = __DRI_IMAGE_FORMAT_ABGR8888;
> -      break;
> -   case GBM_FORMAT_XBGR8888:
> -      dri_format = __DRI_IMAGE_FORMAT_XBGR8888;
> -      break;
> -   case GBM_FORMAT_ARGB2101010:
> -      dri_format = __DRI_IMAGE_FORMAT_ARGB2101010;
> -      break;
> -   case GBM_FORMAT_XRGB2101010:
> -      dri_format = __DRI_IMAGE_FORMAT_XRGB2101010;
> -      break;
> -   default:
> +   dri_format = gbm_format_to_dri_format(format);
> +   if (dri_format == 0) {
>        errno = EINVAL;
>        goto failed;
>     }
> --
> 2.13.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev




More information about the mesa-dev mailing list