From 7e68042137d5e043210a578938ff713380785fe6 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 24 Mar 2025 12:46:04 +0100 Subject: [PATCH] Fix: Vulkan: Advance to next swapchain semaphore The render frame wasn't increased -> always the same semaphore was selected. In case rendering is fast (or swapchain needs to be recreated) it could select a semaphore that still had some pending operations. --- intern/ghost/intern/GHOST_ContextVK.cc | 12 ++++++------ intern/ghost/intern/GHOST_ContextVK.hh | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/intern/ghost/intern/GHOST_ContextVK.cc b/intern/ghost/intern/GHOST_ContextVK.cc index 2be327303ab..1567aaceb39 100644 --- a/intern/ghost/intern/GHOST_ContextVK.cc +++ b/intern/ghost/intern/GHOST_ContextVK.cc @@ -559,13 +559,13 @@ GHOST_TSuccess GHOST_ContextVK::swapBuffers() * swapchain image. Other do it when calling vkQueuePresent. */ VkResult result = VK_ERROR_OUT_OF_DATE_KHR; uint32_t image_index = 0; - int32_t render_frame = 0; + m_render_frame += 1; + int32_t semaphore_index = uint32_t(m_render_frame % m_acquire_semaphores.size()); while (result == VK_ERROR_OUT_OF_DATE_KHR) { - render_frame = (m_render_frame + 1) % m_acquire_semaphores.size(); result = vkAcquireNextImageKHR(device, m_swapchain, UINT64_MAX, - m_acquire_semaphores[render_frame], + m_acquire_semaphores[semaphore_index], VK_NULL_HANDLE, &image_index); if (result == VK_ERROR_OUT_OF_DATE_KHR) { @@ -578,8 +578,8 @@ GHOST_TSuccess GHOST_ContextVK::swapBuffers() swap_chain_data.image = m_swapchain_images[image_index]; swap_chain_data.surface_format = m_surface_format; swap_chain_data.extent = m_render_extent; - swap_chain_data.acquire_semaphore = m_acquire_semaphores[render_frame]; - swap_chain_data.present_semaphore = m_present_semaphores[render_frame]; + swap_chain_data.acquire_semaphore = m_acquire_semaphores[semaphore_index]; + swap_chain_data.present_semaphore = m_present_semaphores[semaphore_index]; if (swap_buffers_pre_callback_) { swap_buffers_pre_callback_(&swap_chain_data); @@ -588,7 +588,7 @@ GHOST_TSuccess GHOST_ContextVK::swapBuffers() VkPresentInfoKHR present_info = {}; present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; present_info.waitSemaphoreCount = 1; - present_info.pWaitSemaphores = &m_present_semaphores[render_frame]; + present_info.pWaitSemaphores = &m_present_semaphores[semaphore_index]; present_info.swapchainCount = 1; present_info.pSwapchains = &m_swapchain; present_info.pImageIndices = &image_index; diff --git a/intern/ghost/intern/GHOST_ContextVK.hh b/intern/ghost/intern/GHOST_ContextVK.hh index e52ecefc1e1..1ad3c0283b7 100644 --- a/intern/ghost/intern/GHOST_ContextVK.hh +++ b/intern/ghost/intern/GHOST_ContextVK.hh @@ -182,7 +182,7 @@ class GHOST_ContextVK : public GHOST_Context { std::vector m_swapchain_images; std::vector m_acquire_semaphores; std::vector m_present_semaphores; - uint32_t m_render_frame; + uint64_t m_render_frame; VkExtent2D m_render_extent; VkExtent2D m_render_extent_min;