From 733f886e98147a338b0b4a9ff6201dd2bfb04033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 3 May 2026 23:58:30 +0200 Subject: [PATCH] libretro: Apply swapchain timing fix suggested in #21627 See #21627 --- libretro/libretro_vulkan.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index ddf5184611..8fb6700030 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -40,6 +40,7 @@ struct VkSwapchainKHR_T { std::mutex mutex; std::condition_variable condVar; int current_index; + bool ever_presented = false; }; static VkSwapchainKHR_T chain; @@ -252,6 +253,7 @@ static VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR_libretro(VkDevice dev } chain.current_index = -1; + chain.ever_presented = false; *pSwapchain = (VkSwapchainKHR)&chain; return VK_SUCCESS; @@ -291,6 +293,7 @@ static VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR_libretro(VkQueue queue, #else vulkan->set_image(vulkan->handle, &swapchain->images[pPresentInfo->pImageIndices[0]].retro_image, 0, nullptr, vulkan->queue_index); #endif + chain.ever_presented = true; swapchain->condVar.notify_all(); return VK_SUCCESS; @@ -298,7 +301,7 @@ static VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR_libretro(VkQueue queue, void vk_libretro_wait_for_presentation() { std::unique_lock lock(chain.mutex); - if (chain.current_index < 0) + if (chain.ever_presented && chain.current_index < 0) chain.condVar.wait(lock); #if 0 chain.current_index = -1; @@ -319,6 +322,7 @@ static VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR_libretro(VkDevice device memset(&chain.images, 0x00, sizeof(chain.images)); chain.count = 0; chain.current_index = -1; + chain.ever_presented = false; } VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit_libretro(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {