=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Obey image count limits for Vulkan swapchains.

Alexandre Julliard julliard at winehq.org
Wed Jul 31 13:55:52 CDT 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Jul 17 17:59:59 2019 +0200

dxgi: Obey image count limits for Vulkan swapchains.

Mesa drivers require at least 3 images (see Mesa commit
4689e98fe884d9412b72fd6293b6d6a69e3ef68e).

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 | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index caf0863..963ceee 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1663,9 +1663,9 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s
     VkSwapchainCreateInfoKHR vk_swapchain_desc;
     VkDevice vk_device = swapchain->vk_device;
     VkFormat vk_format, vk_swapchain_format;
+    unsigned int width, height, image_count;
     VkSurfaceCapabilitiesKHR surface_caps;
     VkSwapchainKHR vk_swapchain;
-    unsigned int width, height;
     VkImageUsageFlags usage;
     VkResult vr;
     HRESULT hr;
@@ -1687,12 +1687,15 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s
         return hresult_from_vk_result(vr);
     }
 
-    if (surface_caps.maxImageCount && (swapchain->desc.BufferCount > surface_caps.maxImageCount
-            || swapchain->desc.BufferCount < surface_caps.minImageCount))
+    image_count = swapchain->desc.BufferCount;
+    image_count = max(image_count, surface_caps.minImageCount);
+    if (surface_caps.maxImageCount)
+        image_count = min(image_count, surface_caps.maxImageCount);
+
+    if (image_count != swapchain->desc.BufferCount)
     {
         WARN("Buffer count %u is not supported (%u-%u).\n", swapchain->desc.BufferCount,
                 surface_caps.minImageCount, surface_caps.maxImageCount);
-        return DXGI_ERROR_UNSUPPORTED;
     }
 
     width = swapchain->desc.Width;
@@ -1728,7 +1731,7 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s
     vk_swapchain_desc.pNext = NULL;
     vk_swapchain_desc.flags = 0;
     vk_swapchain_desc.surface = swapchain->vk_surface;
-    vk_swapchain_desc.minImageCount = swapchain->desc.BufferCount;
+    vk_swapchain_desc.minImageCount = image_count;
     vk_swapchain_desc.imageFormat = vk_swapchain_format;
     vk_swapchain_desc.imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
     vk_swapchain_desc.imageExtent.width = width;




More information about the wine-cvs mailing list