From 6d5815db526757b8b2008ef2c9a6c1a4fb19ce3d Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 20 Jan 2025 22:31:09 -0500 Subject: [PATCH] vulkan: Deal with VK_ERROR_OUT_OF_DATE_KHR returns from vkAcquireNextImageKHR. Fixes #11075. --- src/gpu/vulkan/SDL_gpu_vulkan.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c index bf300a1a8d..47cc2d69d1 100644 --- a/src/gpu/vulkan/SDL_gpu_vulkan.c +++ b/src/gpu/vulkan/SDL_gpu_vulkan.c @@ -9858,24 +9858,7 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture( } // Finally, try to acquire! - acquireResult = renderer->vkAcquireNextImageKHR( - renderer->logicalDevice, - windowData->swapchain, - SDL_MAX_UINT64, - windowData->imageAvailableSemaphore[windowData->frameCounter], - VK_NULL_HANDLE, - &swapchainImageIndex); - - // Acquisition is invalid, let's try to recreate - if (acquireResult != VK_SUCCESS && acquireResult != VK_SUBOPTIMAL_KHR) { - Uint32 recreateSwapchainResult = VULKAN_INTERNAL_RecreateSwapchain(renderer, windowData); - if (!recreateSwapchainResult) { - return false; - } else if (recreateSwapchainResult == VULKAN_INTERNAL_TRY_AGAIN) { - // Edge case, texture is filled in with NULL but not an error - return true; - } - + while (true) { acquireResult = renderer->vkAcquireNextImageKHR( renderer->logicalDevice, windowData->swapchain, @@ -9884,8 +9867,19 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture( VK_NULL_HANDLE, &swapchainImageIndex); - if (acquireResult != VK_SUCCESS && acquireResult != VK_SUBOPTIMAL_KHR) { + //if (acquireResult == VK_ERROR_OUT_OF_DATE_KHR) { SDL_Log("VULKAN SWAPCHAIN OUT OF DATE"); } + + if (acquireResult == VK_SUCCESS || acquireResult == VK_SUBOPTIMAL_KHR) { + break; // we got the next image! + } + + // If acquisition is invalid, let's try to recreate + Uint32 recreateSwapchainResult = VULKAN_INTERNAL_RecreateSwapchain(renderer, windowData); + if (!recreateSwapchainResult) { return false; + } else if (recreateSwapchainResult == VULKAN_INTERNAL_TRY_AGAIN) { + // Edge case, texture is filled in with NULL but not an error + return true; } }