From: Alexandros Frantzis <alexandros.frant...@collabora.com> Express the WL_DRM_FORMATs in terms of vk_format_util_spec and use the format utilities to find compatible Vulkan formats. --- src/vulkan/wsi/wsi_common_wayland.c | 178 ++++++++++++++++++------------------ 1 file changed, 91 insertions(+), 87 deletions(-)
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index dd283a1211..a42d056b17 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -31,6 +31,7 @@ #include <string.h> #include <pthread.h> +#include "vk_format_util.h" #include "vk_util.h" #include "wsi_common_wayland.h" #include "wayland-drm-client-protocol.h" @@ -101,105 +102,108 @@ drm_handle_device(void *data, struct wl_drm *drm, const char *name) fprintf(stderr, "wl_drm.device(%s)\n", name); } +struct drm_format_spec { + uint32_t format; + struct vk_format_util_spec vspec; + bool has_alpha; +}; + +#define WF(FMT, BPP, R, G, B, A, S, HA) \ + {WL_DRM_FORMAT_##FMT, {BPP, R, G, B, A, VK_FORMAT_UTIL_ENDIANNESS_LITTLE, VK_FORMAT_UTIL_##S}, HA} + +static const struct drm_format_spec drm_format_specs[] = { + WF(C8, 8, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, SWAPPABLE, false), + WF(RGB332, 8, 0x000000e0, 0x0000001c, 0x00000003, 0x00000000, NON_SWAPPABLE, false), + WF(BGR233, 8, 0x00000007, 0x00000038, 0x000000c0, 0x00000000, NON_SWAPPABLE, false), + WF(XRGB4444, 16, 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000, NON_SWAPPABLE, false), + WF(XBGR4444, 16, 0x0000000f, 0x000000f0, 0x00000f00, 0x0000f000, NON_SWAPPABLE, false), + WF(RGBX4444, 16, 0x0000f000, 0x00000f00, 0x000000f0, 0x0000000f, NON_SWAPPABLE, false), + WF(BGRX4444, 16, 0x000000f0, 0x00000f00, 0x0000f000, 0x0000000f, NON_SWAPPABLE, false), + WF(ARGB4444, 16, 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000, NON_SWAPPABLE, true), + WF(ABGR4444, 16, 0x0000000f, 0x000000f0, 0x00000f00, 0x0000f000, NON_SWAPPABLE, true), + WF(RGBA4444, 16, 0x0000f000, 0x00000f00, 0x000000f0, 0x0000000f, NON_SWAPPABLE, true), + WF(BGRA4444, 16, 0x000000f0, 0x00000f00, 0x0000f000, 0x0000000f, NON_SWAPPABLE, true), + WF(XRGB1555, 16, 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000, NON_SWAPPABLE, false), + WF(XBGR1555, 16, 0x0000001f, 0x000003e0, 0x00007c00, 0x00008000, NON_SWAPPABLE, false), + WF(RGBX5551, 16, 0x0000f800, 0x000007c0, 0x0000003e, 0x00000001, NON_SWAPPABLE, false), + WF(BGRX5551, 16, 0x0000003e, 0x000007c0, 0x0000f800, 0x00000001, NON_SWAPPABLE, false), + WF(ARGB1555, 16, 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000, NON_SWAPPABLE, true), + WF(ABGR1555, 16, 0x0000001f, 0x000003e0, 0x00007c00, 0x00008000, NON_SWAPPABLE, true), + WF(RGBA5551, 16, 0x0000f800, 0x000007c0, 0x0000003e, 0x00000001, NON_SWAPPABLE, true), + WF(BGRA5551, 16, 0x0000003e, 0x000007c0, 0x0000f800, 0x00000001, NON_SWAPPABLE, true), + WF(RGB565, 16, 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000, NON_SWAPPABLE, false), + WF(BGR565, 16, 0x0000001f, 0x000007e0, 0x0000f800, 0x00000000, NON_SWAPPABLE, false), + WF(RGB888, 24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000, SWAPPABLE, false), + WF(BGR888, 24, 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000, SWAPPABLE, false), + WF(XRGB8888, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, SWAPPABLE, false), + WF(XBGR8888, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000, SWAPPABLE, false), + WF(RGBX8888, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff, SWAPPABLE, false), + WF(BGRX8888, 32, 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff, SWAPPABLE, false), + WF(ARGB8888, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, SWAPPABLE, true), + WF(ABGR8888, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000, SWAPPABLE, true), + WF(RGBA8888, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff, SWAPPABLE, true), + WF(BGRA8888, 32, 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff, SWAPPABLE, true), + WF(XRGB2101010, 32, 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000, NON_SWAPPABLE, false), + WF(XBGR2101010, 32, 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000, NON_SWAPPABLE, false), + WF(RGBX1010102, 32, 0xffc00000, 0x003ff000, 0x00000ffc, 0x00000003, NON_SWAPPABLE, false), + WF(BGRX1010102, 32, 0x00000ffc, 0x003ff000, 0xffc00000, 0x00000003, NON_SWAPPABLE, false), + WF(ARGB2101010, 32, 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000, NON_SWAPPABLE, true), + WF(ABGR2101010, 32, 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000, NON_SWAPPABLE, true), + WF(RGBA1010102, 32, 0xffc00000, 0x003ff000, 0x00000ffc, 0x00000003, NON_SWAPPABLE, true), + WF(BGRA1010102, 32, 0x00000ffc, 0x003ff000, 0xffc00000, 0x00000003, NON_SWAPPABLE, true) +}; + static uint32_t wl_drm_format_for_vk_format(VkFormat vk_format, bool alpha) { - switch (vk_format) { - /* TODO: Figure out what all the formats mean and make this table - * correct. - */ -#if 0 - case VK_FORMAT_R4G4B4A4_UNORM: - return alpha ? WL_DRM_FORMAT_ABGR4444 : WL_DRM_FORMAT_XBGR4444; - case VK_FORMAT_R5G6B5_UNORM: - return WL_DRM_FORMAT_BGR565; - case VK_FORMAT_R5G5B5A1_UNORM: - return alpha ? WL_DRM_FORMAT_ABGR1555 : WL_DRM_FORMAT_XBGR1555; - case VK_FORMAT_R8G8B8_UNORM: - return WL_DRM_FORMAT_XBGR8888; - case VK_FORMAT_R8G8B8A8_UNORM: - return alpha ? WL_DRM_FORMAT_ABGR8888 : WL_DRM_FORMAT_XBGR8888; - case VK_FORMAT_R10G10B10A2_UNORM: - return alpha ? WL_DRM_FORMAT_ABGR2101010 : WL_DRM_FORMAT_XBGR2101010; - case VK_FORMAT_B4G4R4A4_UNORM: - return alpha ? WL_DRM_FORMAT_ARGB4444 : WL_DRM_FORMAT_XRGB4444; - case VK_FORMAT_B5G6R5_UNORM: - return WL_DRM_FORMAT_RGB565; - case VK_FORMAT_B5G5R5A1_UNORM: - return alpha ? WL_DRM_FORMAT_XRGB1555 : WL_DRM_FORMAT_XRGB1555; -#endif - case VK_FORMAT_B8G8R8_UNORM: - case VK_FORMAT_B8G8R8_SRGB: - return WL_DRM_FORMAT_BGRX8888; - case VK_FORMAT_B8G8R8A8_UNORM: - case VK_FORMAT_B8G8R8A8_SRGB: - return alpha ? WL_DRM_FORMAT_ARGB8888 : WL_DRM_FORMAT_XRGB8888; -#if 0 - case VK_FORMAT_B10G10R10A2_UNORM: - return alpha ? WL_DRM_FORMAT_ARGB2101010 : WL_DRM_FORMAT_XRGB2101010; -#endif - - default: - assert(!"Unsupported Vulkan format"); - return 0; + struct vk_format_util_spec vspec; + uint32_t drm_format = 0; + + vk_get_format_spec(vk_format, &vspec); + + for (size_t i = 0; i < ARRAY_SIZE(drm_format_specs); i++) { + const struct drm_format_spec *dspec = &drm_format_specs[i]; + if (vk_compare_format_specs(&vspec, &dspec->vspec) && + dspec->has_alpha == alpha) { + drm_format = dspec->format; + break; + } } + + assert(drm_format != 0); + + return drm_format; } static void drm_handle_format(void *data, struct wl_drm *drm, uint32_t wl_format) { struct wsi_wl_display *display = data; + const struct vk_format_util_spec *vspec = NULL; + struct u_vector formats; + + for (size_t i = 0; i < ARRAY_SIZE(drm_format_specs); i++) { + const struct drm_format_spec *dspec = &drm_format_specs[i]; + if (dspec->format == wl_format) { + vspec = &dspec->vspec; + break; + } + } + + if (!vspec) + return; - switch (wl_format) { -#if 0 - case WL_DRM_FORMAT_ABGR4444: - case WL_DRM_FORMAT_XBGR4444: - wsi_wl_display_add_vk_format(display, VK_FORMAT_R4G4B4A4_UNORM); - break; - case WL_DRM_FORMAT_BGR565: - wsi_wl_display_add_vk_format(display, VK_FORMAT_R5G6B5_UNORM); - break; - case WL_DRM_FORMAT_ABGR1555: - case WL_DRM_FORMAT_XBGR1555: - wsi_wl_display_add_vk_format(display, VK_FORMAT_R5G5B5A1_UNORM); - break; - case WL_DRM_FORMAT_XBGR8888: - wsi_wl_display_add_vk_format(display, VK_FORMAT_R8G8B8_UNORM); - /* fallthrough */ - case WL_DRM_FORMAT_ABGR8888: - wsi_wl_display_add_vk_format(display, VK_FORMAT_R8G8B8A8_UNORM); - break; - case WL_DRM_FORMAT_ABGR2101010: - case WL_DRM_FORMAT_XBGR2101010: - wsi_wl_display_add_vk_format(display, VK_FORMAT_R10G10B10A2_UNORM); - break; - case WL_DRM_FORMAT_ARGB4444: - case WL_DRM_FORMAT_XRGB4444: - wsi_wl_display_add_vk_format(display, VK_FORMAT_B4G4R4A4_UNORM); - break; - case WL_DRM_FORMAT_RGB565: - wsi_wl_display_add_vk_format(display, VK_FORMAT_B5G6R5_UNORM); - break; - case WL_DRM_FORMAT_ARGB1555: - case WL_DRM_FORMAT_XRGB1555: - wsi_wl_display_add_vk_format(display, VK_FORMAT_B5G5R5A1_UNORM); - break; -#endif - case WL_DRM_FORMAT_XRGB8888: - wsi_wl_display_add_vk_format(display, VK_FORMAT_B8G8R8_SRGB); - wsi_wl_display_add_vk_format(display, VK_FORMAT_B8G8R8_UNORM); - /* fallthrough */ - case WL_DRM_FORMAT_ARGB8888: - wsi_wl_display_add_vk_format(display, VK_FORMAT_B8G8R8A8_SRGB); - wsi_wl_display_add_vk_format(display, VK_FORMAT_B8G8R8A8_UNORM); - break; -#if 0 - case WL_DRM_FORMAT_ARGB2101010: - case WL_DRM_FORMAT_XRGB2101010: - wsi_wl_display_add_vk_format(display, VK_FORMAT_B10G10R10A2_UNORM); - break; -#endif + if (!u_vector_init(&formats, sizeof(VkFormat), 8)) + return; + + vk_find_matching_formats(vspec, &formats); + + VkFormat *f; + u_vector_foreach(f, &formats) { + wsi_wl_display_add_vk_format(display, *f); } + + u_vector_finish(&formats); } static void -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev