diff --git a/src/loader/loader_dri_helper.c b/src/loader/loader_dri_helper.c index dee92c9a64d..b92abd8a0fc 100644 --- a/src/loader/loader_dri_helper.c +++ b/src/loader/loader_dri_helper.c @@ -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