Mesa (main): vulkan/wsi/wayland: implement the full format table

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 24 19:58:50 UTC 2021


Module: Mesa
Branch: main
Commit: 83f8b19f9b72eb618fe6f8504978f5d6133675ec
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=83f8b19f9b72eb618fe6f8504978f5d6133675ec

Author: Niklas Haas <git at haasn.dev>
Date:   Mon Apr 26 13:40:38 2021 +0200

vulkan/wsi/wayland: implement the full format table

This code was written but (rightfully) commented out, because it
referenced non-existing vulkan formats.

The correct vulkan analogs come in the form _PACK16 and _PACK32,
respectively, which have their component ordering in high->low bit
order. This is compatible with the DRM format ordering on little endian
systems, so we can just implement them all in the obvious way. On big
endian systems, the _PACKN formats have no analogs, because the
corresponding DRM formats are specified as always being little endian.

I implemented all of the formats I could, while excluding those that
don't map to vulkan at all (e.g. BGRA1010102), and commenting out the
ones that require an extra extension (e.g. ARGB4444) because they
probably need to be checked for extension presence first.

List slightly re-ordered to make it more neatly organized. Tested
working with the 2101010 and 565 variants. Was not able to test the 4444
or 1555 formats, but I verified the channel order was correct so they
should be working in theory.

Signed-off-by: Niklas Haas <git at haasn.xyz>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9737>

---

 src/vulkan/wsi/wsi_common_wayland.c | 125 ++++++++++++++++++++++--------------
 1 file changed, 76 insertions(+), 49 deletions(-)

diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
index d325f9746cd..1408c8c86b8 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -119,48 +119,79 @@ wsi_wl_display_add_wl_format(struct wsi_wl_display *display,
 {
    switch (wl_format) {
 #if 0
+   /* TODO: These are only available when VK_EXT_4444_formats is enabled, so
+    * we probably need to make their use conditional on this extension. */
+   case WL_DRM_FORMAT_ARGB4444:
+   case WL_DRM_FORMAT_XRGB4444:
+      wsi_wl_display_add_vk_format(display, formats,
+                                   VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT);
+      break;
    case WL_DRM_FORMAT_ABGR4444:
    case WL_DRM_FORMAT_XBGR4444:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_R4G4B4A4_UNORM);
+                                   VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT);
       break;
-   case WL_DRM_FORMAT_BGR565:
+#endif
+
+   /* Vulkan _PACKN formats have the same component order as DRM formats
+    * on little endian systems, on big endian there exists no analog. */
+#if MESA_LITTLE_ENDIAN
+   case WL_DRM_FORMAT_RGBA4444:
+   case WL_DRM_FORMAT_RGBX4444:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_R5G6B5_UNORM);
+                                   VK_FORMAT_R4G4B4A4_UNORM_PACK16);
       break;
-   case WL_DRM_FORMAT_ABGR1555:
-   case WL_DRM_FORMAT_XBGR1555:
+   case WL_DRM_FORMAT_BGRA4444:
+   case WL_DRM_FORMAT_BGRX4444:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_R5G5B5A1_UNORM);
+                                   VK_FORMAT_B4G4R4A4_UNORM_PACK16);
       break;
-   case WL_DRM_FORMAT_XBGR8888:
+   case WL_DRM_FORMAT_RGB565:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_R8G8B8_UNORM);
-      FALLTHROUGH;
-   case WL_DRM_FORMAT_ABGR8888:
+                                   VK_FORMAT_R5G6B5_UNORM_PACK16);
+      break;
+   case WL_DRM_FORMAT_BGR565:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_R8G8B8A8_UNORM);
+                                   VK_FORMAT_B5G6R5_UNORM_PACK16);
       break;
-   case WL_DRM_FORMAT_ABGR2101010:
-   case WL_DRM_FORMAT_XBGR2101010:
+   case WL_DRM_FORMAT_ARGB1555:
+   case WL_DRM_FORMAT_XRGB1555:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_R10G10B10A2_UNORM);
+                                   VK_FORMAT_A1R5G5B5_UNORM_PACK16);
       break;
-   case WL_DRM_FORMAT_ARGB4444:
-   case WL_DRM_FORMAT_XRGB4444:
+   case WL_DRM_FORMAT_RGBA5551:
+   case WL_DRM_FORMAT_RGBX5551:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_B4G4R4A4_UNORM);
+                                   VK_FORMAT_R5G5B5A1_UNORM_PACK16);
       break;
-   case WL_DRM_FORMAT_RGB565:
+   case WL_DRM_FORMAT_BGRA5551:
+   case WL_DRM_FORMAT_BGRX5551:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_B5G6R5_UNORM);
+                                   VK_FORMAT_B5G5R5A1_UNORM_PACK16);
       break;
-   case WL_DRM_FORMAT_ARGB1555:
-   case WL_DRM_FORMAT_XRGB1555:
+   case WL_DRM_FORMAT_ARGB2101010:
+   case WL_DRM_FORMAT_XRGB2101010:
+      wsi_wl_display_add_vk_format(display, formats,
+                                   VK_FORMAT_A2R10G10B10_UNORM_PACK32);
+      break;
+   case WL_DRM_FORMAT_ABGR2101010:
+   case WL_DRM_FORMAT_XBGR2101010:
       wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_B5G5R5A1_UNORM);
+                                   VK_FORMAT_A2B10G10R10_UNORM_PACK32);
       break;
 #endif
+
+   /* Non-packed 8-bit formats have an inverted channel order compared to the
+    * little endian DRM formats, because the DRM channel ordering is high->low
+    * but the vulkan channel ordering is in memory byte order */
+   case WL_DRM_FORMAT_XBGR8888:
+      wsi_wl_display_add_vk_format(display, formats,
+                                   VK_FORMAT_R8G8B8_UNORM);
+      FALLTHROUGH;
+   case WL_DRM_FORMAT_ABGR8888:
+      wsi_wl_display_add_vk_format(display, formats,
+                                   VK_FORMAT_R8G8B8A8_UNORM);
+      break;
    case WL_DRM_FORMAT_XRGB8888:
       wsi_wl_display_add_vk_format(display, formats,
                                    VK_FORMAT_B8G8R8_SRGB);
@@ -173,13 +204,6 @@ wsi_wl_display_add_wl_format(struct wsi_wl_display *display,
       wsi_wl_display_add_vk_format(display, formats,
                                    VK_FORMAT_B8G8R8A8_UNORM);
       break;
-#if 0
-   case WL_DRM_FORMAT_ARGB2101010:
-   case WL_DRM_FORMAT_XRGB2101010:
-      wsi_wl_display_add_vk_format(display, formats,
-                                   VK_FORMAT_B10G10R10A2_UNORM);
-      break;
-#endif
    }
 }
 
@@ -192,39 +216,42 @@ 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:
+   case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT:
+      return alpha ? WL_DRM_FORMAT_ARGB4444 : WL_DRM_FORMAT_XRGB4444;
+   case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
       return alpha ? WL_DRM_FORMAT_ABGR4444 : WL_DRM_FORMAT_XBGR4444;
-   case VK_FORMAT_R5G6B5_UNORM:
+#endif
+#if MESA_LITTLE_ENDIAN
+   case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
+      return alpha ? WL_DRM_FORMAT_RGBA4444 : WL_DRM_FORMAT_RGBX4444;
+   case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
+      return alpha ? WL_DRM_FORMAT_BGRA4444 : WL_DRM_FORMAT_BGRX4444;
+   case VK_FORMAT_R5G6B5_UNORM_PACK16:
+      return WL_DRM_FORMAT_RGB565;
+   case VK_FORMAT_B5G6R5_UNORM_PACK16:
       return WL_DRM_FORMAT_BGR565;
-   case VK_FORMAT_R5G5B5A1_UNORM:
-      return alpha ? WL_DRM_FORMAT_ABGR1555 : WL_DRM_FORMAT_XBGR1555;
+   case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
+      return alpha ? WL_DRM_FORMAT_ARGB1555 : WL_DRM_FORMAT_XRGB1555;
+   case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
+      return alpha ? WL_DRM_FORMAT_RGBA5551 : WL_DRM_FORMAT_RGBX5551;
+   case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
+      return alpha ? WL_DRM_FORMAT_BGRA5551 : WL_DRM_FORMAT_BGRX5551;
+   case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
+      return alpha ? WL_DRM_FORMAT_ARGB2101010 : WL_DRM_FORMAT_XRGB2101010;
+   case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
+      return alpha ? WL_DRM_FORMAT_ABGR2101010 : WL_DRM_FORMAT_XBGR2101010;
+#endif
    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");



More information about the mesa-commit mailing list