=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Choose exact formats for D3D12 swapchain fallback formats.

Alexandre Julliard julliard at winehq.org
Mon Aug 27 16:18:16 CDT 2018


Module: wine
Branch: master
Commit: 79bc939b40fff52a50d31e761c626f88180788f5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=79bc939b40fff52a50d31e761c626f88180788f5

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Fri Aug 24 15:44:06 2018 +0200

dxgi: Choose exact formats for D3D12 swapchain fallback formats.

Mainly to avoid gamma correction issues.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dxgi/swapchain.c | 43 ++++++++++++++++++++++++++++---------------
 1 file changed, 28 insertions(+), 15 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 83e0f25..101f2d1 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1694,6 +1694,32 @@ static BOOL init_vk_funcs(struct dxgi_vk_funcs *dxgi, VkInstance vk_instance, Vk
     return TRUE;
 }
 
+static DXGI_FORMAT dxgi_format_from_vk_format(VkFormat vk_format)
+{
+    switch (vk_format)
+    {
+        case VK_FORMAT_B8G8R8A8_SRGB:  return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
+        case VK_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM;
+        case VK_FORMAT_R8G8B8A8_SRGB:  return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
+        case VK_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM;
+        default:
+            WARN("Unhandled format %#x.\n", vk_format);
+            return DXGI_FORMAT_UNKNOWN;
+    }
+}
+
+static VkFormat get_swapchain_fallback_format(VkFormat vk_format)
+{
+    switch (vk_format)
+    {
+        case VK_FORMAT_R8G8B8A8_SRGB:  return VK_FORMAT_B8G8R8A8_SRGB;
+        case VK_FORMAT_R8G8B8A8_UNORM: return VK_FORMAT_B8G8R8A8_UNORM;
+        default:
+            WARN("Unhandled format %#x.\n", vk_format);
+            return VK_FORMAT_UNDEFINED;
+    }
+}
+
 static HRESULT select_vk_format(const struct dxgi_vk_funcs *vk_funcs,
         VkPhysicalDevice vk_physical_device, VkSurfaceKHR vk_surface,
         const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, VkFormat *vk_format)
@@ -1734,10 +1760,11 @@ static HRESULT select_vk_format(const struct dxgi_vk_funcs *vk_funcs,
     if (i == format_count)
     {
         /* Try to create a swapchain with format conversion. */
+        format = get_swapchain_fallback_format(format);
         WARN("Failed to find Vulkan swapchain format for %s.\n", debug_dxgi_format(swapchain_desc->Format));
         for (i = 0; i < format_count; ++i)
         {
-            if (formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
+            if (formats[i].format == format && formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
             {
                 format = formats[i].format;
                 break;
@@ -1757,20 +1784,6 @@ static HRESULT select_vk_format(const struct dxgi_vk_funcs *vk_funcs,
     return S_OK;
 }
 
-static DXGI_FORMAT dxgi_format_from_vk_format(VkFormat vk_format)
-{
-    switch (vk_format)
-    {
-        case VK_FORMAT_B8G8R8A8_SRGB:  return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
-        case VK_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM;
-        case VK_FORMAT_R8G8B8A8_SRGB:  return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
-        case VK_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM;
-        default:
-            FIXME("Unhandled format %#x.\n", vk_format);
-            return DXGI_FORMAT_UNKNOWN;
-    }
-}
-
 static HRESULT vk_select_memory_type(const struct dxgi_vk_funcs *vk_funcs,
         VkPhysicalDevice vk_physical_device, uint32_t memory_type_mask,
         VkMemoryPropertyFlags flags, uint32_t *memory_type_index)




More information about the wine-cvs mailing list