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

Eric Engestrom eric.engestrom at imgtec.com
Fri Jun 16 18:09:39 UTC 2017


On Friday, 2017-06-16 18:14:28 +0100, Daniel Stone 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 | 105 ++++++++++++++++++-----------------------
>  2 files changed, 46 insertions(+), 60 deletions(-)
> 
> 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 84f37d4cf5..3cdd7d505c 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
> @@ -550,6 +551,48 @@ 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;
> +
> +   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;
> +}
> +

This is doing a linear search, which is fine, but this is one situation
where I like macros; you can make it constant-time by just having a file
with:

	X(GBM_FORMAT_..., __DRI_IMAGE_FORMAT_...)

and in these two functions have a switch with:

	#define X(gbm, dri) case gbm: return dri;

and

	#define X(gbm, dri) case dri: return gbm;

It's a small list, so it doesn't really matter, and anyway it might as
well be a follow-up patch (happy to volunteer :P), so this and patches
1-3 are:
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>

I'll try and review the rest tomorrow.

Cheers,
  Eric


More information about the mesa-dev mailing list