dri: Convert pipe_format <-> FourCC lookup to a table

Saves typing it out twice.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36081>
This commit is contained in:
Daniel Stone 2025-07-02 18:21:50 +01:00 committed by Marge Bot
parent b6332eb43b
commit d6e639816f

View file

@ -34,55 +34,49 @@
/* Creating a DRIImage accepts a pipe_format, whilst DRM-based platforms
* like GBM, Wayland, and X11, all deal strictly in DRM FourCCs. Map
* between the two worlds. */
static const struct {
enum pipe_format pipe;
uint32_t fourcc;
} pipe_format_to_fourcc[] = {
{ PIPE_FORMAT_B8G8R8X8_SRGB, __DRI_IMAGE_FOURCC_SXRGB8888 },
{ PIPE_FORMAT_B8G8R8A8_SRGB, __DRI_IMAGE_FOURCC_SARGB8888 },
{ PIPE_FORMAT_R8G8B8A8_SRGB, __DRI_IMAGE_FOURCC_SABGR8888 },
{ PIPE_FORMAT_B5G5R5A1_UNORM, DRM_FORMAT_ARGB1555 },
{ PIPE_FORMAT_B5G6R5_UNORM, DRM_FORMAT_RGB565 },
{ PIPE_FORMAT_B8G8R8X8_UNORM, DRM_FORMAT_XRGB8888 },
{ PIPE_FORMAT_B8G8R8A8_UNORM, DRM_FORMAT_ARGB8888 },
{ PIPE_FORMAT_R8G8B8X8_UNORM, DRM_FORMAT_XBGR8888 },
{ PIPE_FORMAT_R8G8B8A8_UNORM, DRM_FORMAT_ABGR8888 },
{ PIPE_FORMAT_B10G10R10X2_UNORM, DRM_FORMAT_XRGB2101010 },
{ PIPE_FORMAT_B10G10R10A2_UNORM, DRM_FORMAT_ARGB2101010 },
{ PIPE_FORMAT_R10G10B10X2_UNORM, DRM_FORMAT_XBGR2101010 },
{ PIPE_FORMAT_R10G10B10A2_UNORM, DRM_FORMAT_ABGR2101010 },
{ PIPE_FORMAT_R16G16B16X16_UNORM, DRM_FORMAT_XBGR16161616 },
{ PIPE_FORMAT_R16G16B16A16_UNORM, DRM_FORMAT_ABGR16161616 },
{ PIPE_FORMAT_R16G16B16X16_FLOAT, DRM_FORMAT_XBGR16161616F },
{ PIPE_FORMAT_R16G16B16A16_FLOAT, DRM_FORMAT_ABGR16161616F },
};
enum pipe_format
loader_fourcc_to_pipe_format(uint32_t fourcc)
{
/* Convert from DRM_FORMAT to __DRI_IMAGE_FORMAT (sigh) */
switch (fourcc) {
case __DRI_IMAGE_FOURCC_SARGB8888: return PIPE_FORMAT_B8G8R8A8_SRGB;
case __DRI_IMAGE_FOURCC_SABGR8888: return PIPE_FORMAT_R8G8B8A8_SRGB;
case __DRI_IMAGE_FOURCC_SXRGB8888: return PIPE_FORMAT_B8G8R8X8_SRGB;
case DRM_FORMAT_RGB565: return PIPE_FORMAT_B5G6R5_UNORM;
case DRM_FORMAT_ARGB1555: return PIPE_FORMAT_B5G5R5A1_UNORM;
case DRM_FORMAT_XRGB8888: return PIPE_FORMAT_B8G8R8X8_UNORM;
case DRM_FORMAT_ARGB8888: return PIPE_FORMAT_B8G8R8A8_UNORM;
case DRM_FORMAT_ABGR8888: return PIPE_FORMAT_R8G8B8A8_UNORM;
case DRM_FORMAT_XBGR8888: return PIPE_FORMAT_R8G8B8X8_UNORM;
case DRM_FORMAT_XRGB2101010: return PIPE_FORMAT_B10G10R10X2_UNORM;
case DRM_FORMAT_ARGB2101010: return PIPE_FORMAT_B10G10R10A2_UNORM;
case DRM_FORMAT_XBGR2101010: return PIPE_FORMAT_R10G10B10X2_UNORM;
case DRM_FORMAT_ABGR2101010: return PIPE_FORMAT_R10G10B10A2_UNORM;
case DRM_FORMAT_ABGR16161616: return PIPE_FORMAT_R16G16B16A16_UNORM;
case DRM_FORMAT_XBGR16161616: return PIPE_FORMAT_R16G16B16X16_UNORM;
case DRM_FORMAT_XBGR16161616F: return PIPE_FORMAT_R16G16B16X16_FLOAT;
case DRM_FORMAT_ABGR16161616F: return PIPE_FORMAT_R16G16B16A16_FLOAT;
default: return PIPE_FORMAT_NONE;
for (int i = 0; i < ARRAY_SIZE(pipe_format_to_fourcc); i++) {
if (pipe_format_to_fourcc[i].fourcc == fourcc)
return pipe_format_to_fourcc[i].pipe;
}
return PIPE_FORMAT_NONE;
}
uint32_t
loader_pipe_format_to_fourcc(enum pipe_format pipe)
{
switch (pipe) {
case PIPE_FORMAT_B8G8R8A8_SRGB: return __DRI_IMAGE_FOURCC_SARGB8888;
case PIPE_FORMAT_R8G8B8A8_SRGB: return __DRI_IMAGE_FOURCC_SABGR8888;
case PIPE_FORMAT_B8G8R8X8_SRGB: return __DRI_IMAGE_FOURCC_SXRGB8888;
case PIPE_FORMAT_B5G6R5_UNORM: return DRM_FORMAT_RGB565;
case PIPE_FORMAT_B5G5R5A1_UNORM: return DRM_FORMAT_ARGB1555;
case PIPE_FORMAT_B8G8R8X8_UNORM: return DRM_FORMAT_XRGB8888;
case PIPE_FORMAT_B8G8R8A8_UNORM: return DRM_FORMAT_ARGB8888;
case PIPE_FORMAT_R8G8B8A8_UNORM: return DRM_FORMAT_ABGR8888;
case PIPE_FORMAT_R8G8B8X8_UNORM: return DRM_FORMAT_XBGR8888;
case PIPE_FORMAT_B10G10R10X2_UNORM: return DRM_FORMAT_XRGB2101010;
case PIPE_FORMAT_B10G10R10A2_UNORM: return DRM_FORMAT_ARGB2101010;
case PIPE_FORMAT_R10G10B10X2_UNORM: return DRM_FORMAT_XBGR2101010;
case PIPE_FORMAT_R10G10B10A2_UNORM: return DRM_FORMAT_ABGR2101010;
case PIPE_FORMAT_R16G16B16A16_UNORM: return DRM_FORMAT_ABGR16161616;
case PIPE_FORMAT_R16G16B16X16_UNORM: return DRM_FORMAT_XBGR16161616;
case PIPE_FORMAT_R16G16B16X16_FLOAT: return DRM_FORMAT_XBGR16161616F;
case PIPE_FORMAT_R16G16B16A16_FLOAT: return DRM_FORMAT_ABGR16161616F;
default: return DRM_FORMAT_INVALID;
for (int i = 0; i < ARRAY_SIZE(pipe_format_to_fourcc); i++) {
if (pipe_format_to_fourcc[i].pipe == pipe)
return pipe_format_to_fourcc[i].fourcc;
}
return DRM_FORMAT_INVALID;
}
#ifdef HAVE_X11_PLATFORM