From 37227b8a831a40eeb7dade2f507672bc8361fd3d Mon Sep 17 00:00:00 2001 From: Dario Date: Wed, 18 Dec 2024 21:59:59 -0300 Subject: [PATCH] Add present wait support to Vulkan. --- UnleashedRecomp/gpu/rhi/plume_vulkan.cpp | 15 +++++++++++++++ UnleashedRecomp/gpu/rhi/plume_vulkan.h | 1 + 2 files changed, 16 insertions(+) diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp index a669001a..497a8a40 100644 --- a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp +++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp @@ -2124,6 +2124,12 @@ namespace plume { } bool VulkanSwapChain::present(uint32_t textureIndex, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount) { + constexpr uint64_t MaxFrameDelay = 1; + if (commandQueue->device->capabilities.presentWait && (currentPresentId > MaxFrameDelay)) { + constexpr uint64_t waitTimeout = 100000000; + vkWaitForPresentKHR(commandQueue->device->vk, vk, currentPresentId - MaxFrameDelay, waitTimeout); + } + thread_local std::vector waitSemaphoresVector; waitSemaphoresVector.clear(); for (uint32_t i = 0; i < waitSemaphoreCount; i++) { @@ -2138,6 +2144,15 @@ namespace plume { presentInfo.pImageIndices = &textureIndex; presentInfo.pWaitSemaphores = !waitSemaphoresVector.empty() ? waitSemaphoresVector.data() : nullptr; presentInfo.waitSemaphoreCount = uint32_t(waitSemaphoresVector.size()); + + VkPresentIdKHR presentId = {}; + if (commandQueue->device->capabilities.presentWait) { + currentPresentId++; + presentId.sType = VK_STRUCTURE_TYPE_PRESENT_ID_KHR; + presentId.pPresentIds = ¤tPresentId; + presentId.swapchainCount = 1; + presentInfo.pNext = &presentId; + } VkResult res; { diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.h b/UnleashedRecomp/gpu/rhi/plume_vulkan.h index b38251e4..16cf3647 100644 --- a/UnleashedRecomp/gpu/rhi/plume_vulkan.h +++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.h @@ -229,6 +229,7 @@ namespace plume { VkPresentModeKHR requiredPresentMode = VK_PRESENT_MODE_FIFO_KHR; VkCompositeAlphaFlagBitsKHR pickedAlphaFlag = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; std::vector textures; + uint64_t currentPresentId = 0; bool immediatePresentModeSupported = false; VulkanSwapChain(VulkanCommandQueue *commandQueue, RenderWindow renderWindow, uint32_t textureCount, RenderFormat format);