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 <dani...@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.engest...@imgtec.com> I'll try and review the rest tomorrow. Cheers, Eric _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev