@@ -850,6 +850,9 @@ VulkanSwapChain::VulkanSwapChain(const VulkanSwapChainCreationDescription& vulka
850850 AcquireSemaphores.clear ();
851851 AcquireSemaphores.reserve (NumberOfSwapChainImages);
852852
853+ AcquireFences.reserve (NumberOfSwapChainImages);
854+ AcquireFences.reserve (NumberOfSwapChainImages);
855+
853856 Textures.clear ();
854857 Textures.reserve (NumberOfSwapChainImages);
855858
@@ -868,8 +871,9 @@ VulkanSwapChain::VulkanSwapChain(const VulkanSwapChainCreationDescription& vulka
868871 // create images, image views and framebuffers
869872 for (uint32_t i{}; i < NumberOfSwapChainImages; ++i)
870873 {
871- // Create our Acquire Semaphore for this swapChain image
872- AcquireSemaphores.emplace_back (VkSynchronization::CreateSemaphore (vulkanSwapChainDescription.vulkanContext ->VulkanDevice , " SwapChain Acquire Semaphore: " + i));
874+ // Create our Acquire Semaphore and fences for this swapChain image
875+ AcquireSemaphores.emplace_back (VkSynchronization::CreateSemaphore (vulkanSwapChainDescription.vulkanContext ->VulkanDevice , fmt::format (" SwapChain Acquire Semaphore: {}" , i).c_str ()));
876+ AcquireFences.emplace_back (VkSynchronization::CreateFence (vulkanSwapChainDescription.vulkanContext ->VulkanDevice , fmt::format (" SwapChain Acquire Fence: {}" , i).c_str (), true ));
873877
874878 // Create a image
875879 swapChainImageDescription.Image = swapChainImages[i];
@@ -899,6 +903,11 @@ VulkanSwapChain::~VulkanSwapChain()
899903 {
900904 vkDestroySemaphore (VkContext->VulkanDevice , semaphore, nullptr );
901905 }
906+
907+ for (const VkFence& fence : AcquireFences)
908+ {
909+ vkDestroyFence (VkContext->VulkanDevice , fence, nullptr );
910+ }
902911}
903912
904913void VulkanSwapChain::Present (VkSemaphore waitSemaphore)
@@ -961,12 +970,16 @@ void VulkanSwapChain::GetAndWaitOnNextImage()
961970 .pSemaphores = &VkContext->TimelineSemaphore ,
962971 .pValues = &TimelineWaitValues[CurrentImageIndex],
963972 };
964-
965- // when timeout is set to UINT64_MAX, we wait until the next image has been acquired
966973 VK_ASSERT (vkWaitSemaphores (VkContext->VulkanDevice , &waitInfo, UINT64_MAX));
967974
975+ VK_ASSERT (vkWaitForFences (VkContext->VulkanDevice , 1 , &AcquireFences[CurrentImageIndex], VK_TRUE, UINT64_MAX));
976+ VK_ASSERT (vkResetFences (VkContext->VulkanDevice , 1 , &AcquireFences[CurrentImageIndex]));
977+ VkFence acquireFence = AcquireFences[CurrentImageIndex];
978+
968979 VkSemaphore& acquireSemaphore = AcquireSemaphores[CurrentImageIndex];
969- const VkResult result = vkAcquireNextImageKHR (VkContext->VulkanDevice , SwapChain, UINT64_MAX, acquireSemaphore, VK_NULL_HANDLE, &CurrentImageIndex);
980+
981+ // when timeout is set to UINT64_MAX, we wait until the next image has been acquired
982+ const VkResult result = vkAcquireNextImageKHR (VkContext->VulkanDevice , SwapChain, UINT64_MAX, acquireSemaphore, acquireFence, &CurrentImageIndex);
970983 CHECK (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR || result == VK_ERROR_OUT_OF_DATE_KHR, " vkAcquireNextImageKHR Failed" );
971984
972985 GetNextImage = false ;
@@ -1082,6 +1095,7 @@ CommandPool::~CommandPool()
10821095void CommandPool::WaitSemaphore (const VkSemaphore& semaphore)
10831096{
10841097 CHECK (WaitOnSemaphore.semaphore == VK_NULL_HANDLE, " The wait Semaphore is not Empty" );
1098+ CHECK (semaphore != VK_NULL_HANDLE, " The wait Semaphore is Empty" );
10851099 WaitOnSemaphore.semaphore = semaphore;
10861100}
10871101
0 commit comments