anv/wsi: Advertise UNORM formats as well as sRGB
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 5 Oct 2016 20:23:22 +0000 (13:23 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 6 Oct 2016 23:52:31 +0000 (16:52 -0700)
Because WSI images are created with VkImageCreateInfo::flags explicitly set
to 0, they don't ever have the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT set.
This means that you can't create an image view of it with a different
format so applications can't render directly in sRGB (without automatic
encoding) unless we actually advertise UNORM formats.  There are a lot of
applications that want to do their own sRGB conversion, so we should allow
for that.  We do, however, make UNORM come after sRGB in the list so that
the default for dumb apps that just grab the first thing is to render in
linear and let the sRGB conversion happen automatically.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/vulkan/anv_wsi_wayland.c
src/intel/vulkan/anv_wsi_x11.c

index d210e79bbcbc2eaa7a200f789c6204ffe00ba0d5..afce96f2df4ca9a2b3c6a706ee456a0e6fa9efbc 100644 (file)
@@ -106,8 +106,10 @@ wl_drm_format_for_vk_format(VkFormat vk_format, bool alpha)
    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
@@ -163,9 +165,11 @@ drm_handle_format(void *data, struct wl_drm *drm, uint32_t wl_format)
 #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:
index 7c6ef9783391af732170a3773b1f478b53c281c7..25c585f22c2ce6d8116bf7dd968d5f421ecd8498 100644 (file)
@@ -123,6 +123,7 @@ wsi_x11_get_connection(struct anv_physical_device *device,
 
 static const VkSurfaceFormatKHR formats[] = {
    { .format = VK_FORMAT_B8G8R8A8_SRGB, },
+   { .format = VK_FORMAT_B8G8R8A8_UNORM, },
 };
 
 static const VkPresentModeKHR present_modes[] = {