[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