From 6d5815db526757b8b2008ef2c9a6c1a4fb19ce3d Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
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 bf300a1a8d3aa..47cc2d69d13c1 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;
}
}