From f27ec9bf8a13d74a57c8f0c3639b7b2cb9186f4c Mon Sep 17 00:00:00 2001 From: Paperzlel Date: Fri, 8 May 2026 19:31:37 +0100 Subject: [PATCH] Fix false positive error in `_determine_swap_chain_format` --- .../vulkan/rendering_device_driver_vulkan.cpp | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/drivers/vulkan/rendering_device_driver_vulkan.cpp b/drivers/vulkan/rendering_device_driver_vulkan.cpp index 0680ca3064..b80a8020f8 100644 --- a/drivers/vulkan/rendering_device_driver_vulkan.cpp +++ b/drivers/vulkan/rendering_device_driver_vulkan.cpp @@ -3456,13 +3456,21 @@ bool RenderingDeviceDriverVulkan::_determine_swap_chain_format(RenderingContextD // Retrieve the formats supported by the surface. uint32_t format_count = 0; - VkResult err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, nullptr); - ERR_FAIL_COND_V_MSG(err != VK_SUCCESS, false, vformat("Couldn't retrieve Vulkan surface formats (VkResult error %d).", err)); - TightLocalVector formats; + // Loop until we get the full format list. This shouldn't have to loop more than twice on most systems. + while (true) { + VkResult err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, nullptr); + ERR_FAIL_COND_V_MSG(err != VK_SUCCESS, false, vformat("Couldn't retrieve Vulkan surface formats (VkResult error %d).", err)); + + formats.resize(format_count); + err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, formats.ptr()); + if (err == VK_SUCCESS) { + break; + } + + ERR_FAIL_COND_V_MSG(err != VK_INCOMPLETE, false, vformat("Couldn't retrieve Vulkan surface formats (VkResult error %d).", err)); + } formats.resize(format_count); - err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, formats.ptr()); - ERR_FAIL_COND_V_MSG(err != VK_SUCCESS, false, vformat("Couldn't retrieve Vulkan surface formats (VkResult error %d).", err)); // If the format list includes just one entry of VK_FORMAT_UNDEFINED, the surface has no preferred format. if (format_count == 1 && formats[0].format == VK_FORMAT_UNDEFINED) { @@ -4017,13 +4025,20 @@ bool RenderingDeviceDriverVulkan::swap_chain_get_hdr_output_supported(SwapChainI // Retrieve the formats supported by the surface. uint32_t format_count = 0; - VkResult err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, nullptr); - ERR_FAIL_COND_V(err != VK_SUCCESS, false); - TightLocalVector formats; + while (true) { + VkResult err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, nullptr); + ERR_FAIL_COND_V_MSG(err != VK_SUCCESS, false, vformat("Couldn't retrieve Vulkan surface formats (VkResult error %d).", err)); + + formats.resize(format_count); + err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, formats.ptr()); + if (err == VK_SUCCESS) { + break; + } + + ERR_FAIL_COND_V_MSG(err != VK_INCOMPLETE, false, vformat("Couldn't retrieve Vulkan surface formats (VkResult error %d).", err)); + } formats.resize(format_count); - err = functions.GetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface->vk_surface, &format_count, formats.ptr()); - ERR_FAIL_COND_V(err != VK_SUCCESS, false); // If the format list includes just one entry of VK_FORMAT_UNDEFINED, the surface has no preferred format. // Just to be safe, we assume this means HDR will not be supported.