On Thu, May 17, 2018 at 6:50 AM, Lucas Stach <l.st...@pengutronix.de> wrote:
> Each time I have to touch the buffer import/export functions in the dri > state tracker I get lost in the maze of functions converting between > DRI_IMAGE_FOURCC, DRI_IMAGE_FORMAT, DRI_IMAGE_COMPONENTS and pipe format. > > Rip it out and replace by a single table, which defines the correspondence > between the different representations. > > Also this now stores all the known representations in the __DRIimageRec, > to avoid the loss of information we currently have when importing a buffer > with a fourcc, which doesn't have a corresponding dri format. > > Signed-off-by: Lucas Stach <l.st...@pengutronix.de> > --- > src/gallium/state_trackers/dri/dri2.c | 476 ++++++-------------- > src/gallium/state_trackers/dri/dri_screen.h | 1 + > 2 files changed, 138 insertions(+), 339 deletions(-) > > diff --git a/src/gallium/state_trackers/dri/dri2.c > b/src/gallium/state_trackers/dri/dri2.c > index 859161fb87ac..9c74ca54fc89 100644 > --- a/src/gallium/state_trackers/dri/dri2.c > +++ b/src/gallium/state_trackers/dri/dri2.c > @@ -54,295 +54,72 @@ > #define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1) > #endif > > -static const int fourcc_formats[] = { > - __DRI_IMAGE_FOURCC_ARGB2101010, > - __DRI_IMAGE_FOURCC_XRGB2101010, > - __DRI_IMAGE_FOURCC_ABGR2101010, > - __DRI_IMAGE_FOURCC_XBGR2101010, > - __DRI_IMAGE_FOURCC_ARGB8888, > - __DRI_IMAGE_FOURCC_ABGR8888, > - __DRI_IMAGE_FOURCC_SARGB8888, > - __DRI_IMAGE_FOURCC_XRGB8888, > - __DRI_IMAGE_FOURCC_XBGR8888, > - __DRI_IMAGE_FOURCC_ARGB1555, > - __DRI_IMAGE_FOURCC_RGB565, > - __DRI_IMAGE_FOURCC_R8, > - __DRI_IMAGE_FOURCC_R16, > - __DRI_IMAGE_FOURCC_GR88, > - __DRI_IMAGE_FOURCC_GR1616, > - __DRI_IMAGE_FOURCC_YUV410, > - __DRI_IMAGE_FOURCC_YUV411, > - __DRI_IMAGE_FOURCC_YUV420, > - __DRI_IMAGE_FOURCC_YUV422, > - __DRI_IMAGE_FOURCC_YUV444, > - __DRI_IMAGE_FOURCC_YVU410, > - __DRI_IMAGE_FOURCC_YVU411, > - __DRI_IMAGE_FOURCC_YVU420, > - __DRI_IMAGE_FOURCC_YVU422, > - __DRI_IMAGE_FOURCC_YVU444, > - __DRI_IMAGE_FOURCC_NV12, > - __DRI_IMAGE_FOURCC_NV16, > - __DRI_IMAGE_FOURCC_YUYV > -}; > - > -static int convert_fourcc(int format, int *dri_components_p) > -{ > +struct dri2_format_mapping { > + int dri_fourcc; > + int dri_format; > int dri_components; > - switch(format) { > - case __DRI_IMAGE_FOURCC_RGB565: > - format = __DRI_IMAGE_FORMAT_RGB565; > - dri_components = __DRI_IMAGE_COMPONENTS_RGB; > - break; > - case __DRI_IMAGE_FOURCC_ARGB8888: > - format = __DRI_IMAGE_FORMAT_ARGB8888; > - dri_components = __DRI_IMAGE_COMPONENTS_RGBA; > - break; > - case __DRI_IMAGE_FOURCC_XRGB8888: > - format = __DRI_IMAGE_FORMAT_XRGB8888; > - dri_components = __DRI_IMAGE_COMPONENTS_RGB; > - break; > - case __DRI_IMAGE_FOURCC_ABGR8888: > - format = __DRI_IMAGE_FORMAT_ABGR8888; > - dri_components = __DRI_IMAGE_COMPONENTS_RGBA; > - break; > - case __DRI_IMAGE_FOURCC_XBGR8888: > - format = __DRI_IMAGE_FORMAT_XBGR8888; > - dri_components = __DRI_IMAGE_COMPONENTS_RGB; > - break; > - case __DRI_IMAGE_FOURCC_ARGB2101010: > - format = __DRI_IMAGE_FORMAT_ARGB2101010; > - dri_components = __DRI_IMAGE_COMPONENTS_RGBA; > - break; > - case __DRI_IMAGE_FOURCC_XRGB2101010: > - format = __DRI_IMAGE_FORMAT_XRGB2101010; > - dri_components = __DRI_IMAGE_COMPONENTS_RGB; > - break; > - case __DRI_IMAGE_FOURCC_ABGR2101010: > - format = __DRI_IMAGE_FORMAT_ABGR2101010; > - dri_components = __DRI_IMAGE_COMPONENTS_RGBA; > - break; > - case __DRI_IMAGE_FOURCC_XBGR2101010: > - format = __DRI_IMAGE_FORMAT_XBGR2101010; > - dri_components = __DRI_IMAGE_COMPONENTS_RGB; > - break; > - case __DRI_IMAGE_FOURCC_R8: > - format = __DRI_IMAGE_FORMAT_R8; > - dri_components = __DRI_IMAGE_COMPONENTS_R; > - break; > - case __DRI_IMAGE_FOURCC_GR88: > - format = __DRI_IMAGE_FORMAT_GR88; > - dri_components = __DRI_IMAGE_COMPONENTS_RG; > - break; > - case __DRI_IMAGE_FOURCC_R16: > - format = __DRI_IMAGE_FORMAT_R16; > - dri_components = __DRI_IMAGE_COMPONENTS_R; > - break; > - case __DRI_IMAGE_FOURCC_GR1616: > - format = __DRI_IMAGE_FORMAT_GR1616; > - dri_components = __DRI_IMAGE_COMPONENTS_RG; > - break; > - case __DRI_IMAGE_FOURCC_YUYV: > - format = __DRI_IMAGE_FORMAT_YUYV; > - dri_components = __DRI_IMAGE_COMPONENTS_Y_XUXV; > - break; > - /* > - * For multi-planar YUV formats, we return the format of the first > - * plane only. Since there is only one caller which supports multi- > - * planar YUV it gets to figure out the remaining planes on it's > - * own. > - */ > - case __DRI_IMAGE_FOURCC_YUV420: > - case __DRI_IMAGE_FOURCC_YVU420: > - format = __DRI_IMAGE_FORMAT_R8; > - dri_components = __DRI_IMAGE_COMPONENTS_Y_U_V; > - break; > - case __DRI_IMAGE_FOURCC_NV12: > - format = __DRI_IMAGE_FORMAT_R8; > - dri_components = __DRI_IMAGE_COMPONENTS_Y_UV; > - break; > - default: > - return -1; > - } > - *dri_components_p = dri_components; > - return format; > -} > - > -/* NOTE this probably isn't going to do the right thing for YUV images > - * (but I think the same can be said for intel_query_image()). I think > - * only needed for exporting dmabuf's, so I think I won't loose much > - * sleep over it. > - */ > -static int convert_to_fourcc(int format) > -{ > - switch(format) { > - case __DRI_IMAGE_FORMAT_RGB565: > - format = __DRI_IMAGE_FOURCC_RGB565; > - break; > - case __DRI_IMAGE_FORMAT_ARGB8888: > - format = __DRI_IMAGE_FOURCC_ARGB8888; > - break; > - case __DRI_IMAGE_FORMAT_XRGB8888: > - format = __DRI_IMAGE_FOURCC_XRGB8888; > - break; > - case __DRI_IMAGE_FORMAT_ABGR8888: > - format = __DRI_IMAGE_FOURCC_ABGR8888; > - break; > - case __DRI_IMAGE_FORMAT_XBGR8888: > - format = __DRI_IMAGE_FOURCC_XBGR8888; > - break; > - case __DRI_IMAGE_FORMAT_ARGB2101010: > - format = __DRI_IMAGE_FOURCC_ARGB2101010; > - break; > - case __DRI_IMAGE_FORMAT_XRGB2101010: > - format = __DRI_IMAGE_FOURCC_XRGB2101010; > - break; > - case __DRI_IMAGE_FORMAT_ABGR2101010: > - format = __DRI_IMAGE_FOURCC_ABGR2101010; > - break; > - case __DRI_IMAGE_FORMAT_XBGR2101010: > - format = __DRI_IMAGE_FOURCC_XBGR2101010; > - break; > - case __DRI_IMAGE_FORMAT_R8: > - format = __DRI_IMAGE_FOURCC_R8; > - break; > - case __DRI_IMAGE_FORMAT_GR88: > - format = __DRI_IMAGE_FOURCC_GR88; > - break; > - default: > - return -1; > - } > - return format; > -} > + enum pipe_format pipe_format; > +}; > > -static enum pipe_format dri2_format_to_pipe_format (int format) > -{ > - enum pipe_format pf; > +static const struct dri2_format_mapping dri2_format_table[] = { > + { __DRI_IMAGE_FOURCC_ARGB2101010, __DRI_IMAGE_FORMAT_ARGB2101010, > + __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_B10G10R10A2_UNORM }, > + { __DRI_IMAGE_FOURCC_XRGB2101010, __DRI_IMAGE_FORMAT_XRGB2101010, > + __DRI_IMAGE_COMPONENTS_RGB, PIPE_FORMAT_B10G10R10X2_UNORM }, > + { __DRI_IMAGE_FOURCC_ABGR2101010, __DRI_IMAGE_FORMAT_ABGR2101010, > + __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_R10G10B10A2_UNORM }, > + { __DRI_IMAGE_FOURCC_XBGR2101010, __DRI_IMAGE_FORMAT_XBGR2101010, > + __DRI_IMAGE_COMPONENTS_RGB, PIPE_FORMAT_R10G10B10X2_UNORM }, > + { __DRI_IMAGE_FOURCC_ARGB8888, __DRI_IMAGE_FORMAT_ARGB8888, > + __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_BGRA8888_UNORM }, > + { __DRI_IMAGE_FOURCC_ABGR8888, __DRI_IMAGE_FORMAT_ABGR8888, > + __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_RGBA8888_UNORM }, > + { __DRI_IMAGE_FOURCC_SARGB8888, __DRI_IMAGE_FORMAT_SARGB8, > + __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_BGRA8888_SRGB }, > + { __DRI_IMAGE_FOURCC_XRGB8888, __DRI_IMAGE_FORMAT_XRGB8888, > + __DRI_IMAGE_COMPONENTS_RGB, PIPE_FORMAT_BGRX8888_UNORM }, > + { __DRI_IMAGE_FOURCC_XBGR8888, __DRI_IMAGE_FORMAT_XBGR8888, > + __DRI_IMAGE_COMPONENTS_RGB, PIPE_FORMAT_RGBX8888_UNORM }, > + { __DRI_IMAGE_FOURCC_ARGB1555, __DRI_IMAGE_FORMAT_NONE, > + __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_B5G5R5A1_UNORM }, > + { __DRI_IMAGE_FOURCC_RGB565, __DRI_IMAGE_FORMAT_RGB565, > + __DRI_IMAGE_COMPONENTS_RGB, PIPE_FORMAT_B5G6R5_UNORM }, > + { __DRI_IMAGE_FOURCC_R8, __DRI_IMAGE_FORMAT_R8, > + __DRI_IMAGE_COMPONENTS_R, PIPE_FORMAT_R8_UNORM }, > + { __DRI_IMAGE_FOURCC_R16, __DRI_IMAGE_FORMAT_R16, > + __DRI_IMAGE_COMPONENTS_R, PIPE_FORMAT_R16_UNORM }, > + { __DRI_IMAGE_FOURCC_GR88, __DRI_IMAGE_FORMAT_GR88, > + __DRI_IMAGE_COMPONENTS_RG, PIPE_FORMAT_RG88_UNORM }, > + { __DRI_IMAGE_FOURCC_GR1616, __DRI_IMAGE_FORMAT_GR88, > + __DRI_IMAGE_COMPONENTS_RG, PIPE_FORMAT_RG1616_UNORM }, > + { __DRI_IMAGE_FOURCC_YUV420, __DRI_IMAGE_FORMAT_NONE, > + __DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_IYUV }, > + { __DRI_IMAGE_FOURCC_YVU420, __DRI_IMAGE_FORMAT_NONE, > + __DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_YV12 }, > + { __DRI_IMAGE_FOURCC_NV12, __DRI_IMAGE_FORMAT_NONE, > + __DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_NV12 }, > + { __DRI_IMAGE_FOURCC_YUYV, __DRI_IMAGE_FORMAT_YUYV, > + __DRI_IMAGE_COMPONENTS_Y_XUXV, PIPE_FORMAT_YUYV }, > +}; > > - switch (format) { > - case __DRI_IMAGE_FORMAT_RGB565: > - pf = PIPE_FORMAT_B5G6R5_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_XRGB8888: > - pf = PIPE_FORMAT_BGRX8888_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_ARGB8888: > - pf = PIPE_FORMAT_BGRA8888_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_XBGR8888: > - pf = PIPE_FORMAT_RGBX8888_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_ABGR8888: > - pf = PIPE_FORMAT_RGBA8888_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_XRGB2101010: > - pf = PIPE_FORMAT_B10G10R10X2_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_ARGB2101010: > - pf = PIPE_FORMAT_B10G10R10A2_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_XBGR2101010: > - pf = PIPE_FORMAT_R10G10B10X2_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_ABGR2101010: > - pf = PIPE_FORMAT_R10G10B10A2_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_R8: > - pf = PIPE_FORMAT_R8_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_GR88: > - pf = PIPE_FORMAT_RG88_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_R16: > - pf = PIPE_FORMAT_R16_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_GR1616: > - pf = PIPE_FORMAT_R16G16_UNORM; > - break; > - case __DRI_IMAGE_FORMAT_YUYV: > - pf = PIPE_FORMAT_YUYV; > - break; > - default: > - pf = PIPE_FORMAT_NONE; > - break; > +static const struct dri2_format_mapping * > +dri2_get_mapping_by_fourcc(int fourcc) { > + for (unsigned i = 0; i < ARRAY_SIZE(dri2_format_table); i++) { > + if (dri2_format_table[i].dri_fourcc == fourcc) > + return &dri2_format_table[i]; > } > > - return pf; > + return NULL; > } > > -static enum pipe_format fourcc_to_pipe_format(int fourcc) > -{ > - enum pipe_format pf; > - > - switch (fourcc) { > - case __DRI_IMAGE_FOURCC_R8: > - pf = PIPE_FORMAT_R8_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_GR88: > - pf = PIPE_FORMAT_RG88_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_ARGB1555: > - pf = PIPE_FORMAT_B5G5R5A1_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_R16: > - pf = PIPE_FORMAT_R16_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_GR1616: > - pf = PIPE_FORMAT_RG1616_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_RGB565: > - pf = PIPE_FORMAT_B5G6R5_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_ARGB8888: > - pf = PIPE_FORMAT_BGRA8888_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_XRGB8888: > - pf = PIPE_FORMAT_BGRX8888_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_ABGR8888: > - pf = PIPE_FORMAT_RGBA8888_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_XBGR8888: > - pf = PIPE_FORMAT_RGBX8888_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_ARGB2101010: > - pf = PIPE_FORMAT_B10G10R10A2_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_XRGB2101010: > - pf = PIPE_FORMAT_B10G10R10X2_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_ABGR2101010: > - pf = PIPE_FORMAT_R10G10B10A2_UNORM; > - break; > - case __DRI_IMAGE_FOURCC_XBGR2101010: > - pf = PIPE_FORMAT_R10G10B10X2_UNORM; > - break; > - > - case __DRI_IMAGE_FOURCC_NV12: > - pf = PIPE_FORMAT_NV12; > - break; > - case __DRI_IMAGE_FOURCC_YUYV: > - pf = PIPE_FORMAT_YUYV; > - break; > - case __DRI_IMAGE_FOURCC_YUV420: > - case __DRI_IMAGE_FOURCC_YVU420: > - pf = PIPE_FORMAT_YV12; > - break; > - > - case __DRI_IMAGE_FOURCC_SARGB8888: > - case __DRI_IMAGE_FOURCC_YUV410: > - case __DRI_IMAGE_FOURCC_YUV411: > - case __DRI_IMAGE_FOURCC_YUV422: > - case __DRI_IMAGE_FOURCC_YUV444: > - case __DRI_IMAGE_FOURCC_NV16: > - case __DRI_IMAGE_FOURCC_YVU410: > - case __DRI_IMAGE_FOURCC_YVU411: > - case __DRI_IMAGE_FOURCC_YVU422: > - case __DRI_IMAGE_FOURCC_YVU444: > - default: > - pf = PIPE_FORMAT_NONE; > +static const struct dri2_format_mapping * > +dri2_get_mapping_by_format(int format) { > + for (unsigned i = 0; i < ARRAY_SIZE(dri2_format_table); i++) { > + if (dri2_format_table[i].dri_format == format) > + return &dri2_format_table[i]; > } > > - return pf; > + return NULL; > } > > /** > @@ -983,7 +760,7 @@ dri2_update_tex_buffer(struct dri_drawable *drawable, > > static __DRIimage * > dri2_create_image_from_winsys(__DRIscreen *_screen, > - int width, int height, int format, > + int width, int height, enum pipe_format pf, > int num_handles, struct winsys_handle > *whandle, > void *loaderPrivate) > { > @@ -992,13 +769,8 @@ dri2_create_image_from_winsys(__DRIscreen *_screen, > __DRIimage *img; > struct pipe_resource templ; > unsigned tex_usage = 0; > - enum pipe_format pf; > int i; > > - pf = dri2_format_to_pipe_format (format); > - if (pf == PIPE_FORMAT_NONE) > - return NULL; > - > if (pscreen->is_format_supported(pscreen, pf, screen->target, 0, > PIPE_BIND_RENDER_TARGET)) > tex_usage |= PIPE_BIND_RENDER_TARGET; > @@ -1006,6 +778,20 @@ dri2_create_image_from_winsys(__DRIscreen *_screen, > PIPE_BIND_SAMPLER_VIEW)) > tex_usage |= PIPE_BIND_SAMPLER_VIEW; > > + if (!tex_usage && util_format_is_yuv(pf)) { > + /* YUV format sampling can be emulated by the Mesa state tracker by > + * using multiple R8/RG88 samplers. So try to rewrite the pipe > format. > + */ > + pf = PIPE_FORMAT_R8_UNORM; > + > + if (pscreen->is_format_supported(pscreen, pf, screen->target, 0, > + PIPE_BIND_SAMPLER_VIEW)) > + tex_usage |= PIPE_BIND_SAMPLER_VIEW; > + } > This doesn't seem to belong in this commit. Other than that, the series is: Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev