mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-22 05:45:38 +00:00
VulkanDevice: Actually use all the swap chain semaphores
This commit is contained in:
parent
edeaaebc7d
commit
b060edc61b
|
@ -1272,7 +1272,7 @@ void VulkanDevice::SubmitCommandBuffer(VulkanSwapChain* present_swap_chain /* =
|
|||
{
|
||||
DoSubmitCommandBuffer(m_current_frame, present_swap_chain);
|
||||
if (present_swap_chain)
|
||||
DoPresent(present_swap_chain);
|
||||
DoPresent(present_swap_chain, false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1317,7 +1317,7 @@ void VulkanDevice::DoSubmitCommandBuffer(u32 index, VulkanSwapChain* present_swa
|
|||
}
|
||||
}
|
||||
|
||||
void VulkanDevice::DoPresent(VulkanSwapChain* present_swap_chain)
|
||||
void VulkanDevice::DoPresent(VulkanSwapChain* present_swap_chain, bool acquire_next)
|
||||
{
|
||||
const VkPresentInfoKHR present_info = {VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
|
||||
nullptr,
|
||||
|
@ -1344,7 +1344,8 @@ void VulkanDevice::DoPresent(VulkanSwapChain* present_swap_chain)
|
|||
// Grab the next image as soon as possible, that way we spend less time blocked on the next
|
||||
// submission. Don't care if it fails, we'll deal with that at the presentation call site.
|
||||
// Credit to dxvk for the idea.
|
||||
present_swap_chain->AcquireNextImage();
|
||||
if (acquire_next)
|
||||
present_swap_chain->AcquireNextImage();
|
||||
}
|
||||
|
||||
void VulkanDevice::WaitForPresentComplete()
|
||||
|
@ -1378,7 +1379,7 @@ void VulkanDevice::PresentThread()
|
|||
|
||||
DoSubmitCommandBuffer(m_queued_present.command_buffer_index, m_queued_present.swap_chain);
|
||||
if (m_queued_present.swap_chain)
|
||||
DoPresent(m_queued_present.swap_chain);
|
||||
DoPresent(m_queued_present.swap_chain, true);
|
||||
m_present_done.store(true, std::memory_order_release);
|
||||
m_present_done_cv.notify_one();
|
||||
}
|
||||
|
|
|
@ -379,7 +379,7 @@ private:
|
|||
void WaitForCommandBufferCompletion(u32 index);
|
||||
|
||||
void DoSubmitCommandBuffer(u32 index, VulkanSwapChain* present_swap_chain);
|
||||
void DoPresent(VulkanSwapChain* present_swap_chain);
|
||||
void DoPresent(VulkanSwapChain* present_swap_chain, bool acquire_next);
|
||||
void WaitForPresentComplete(std::unique_lock<std::mutex>& lock);
|
||||
void PresentThread();
|
||||
void StartPresentThread();
|
||||
|
|
|
@ -598,6 +598,9 @@ VkResult VulkanSwapChain::AcquireNextImage()
|
|||
if (!m_swap_chain)
|
||||
return VK_ERROR_SURFACE_LOST_KHR;
|
||||
|
||||
// Use a different semaphore for each image.
|
||||
m_current_semaphore = (m_current_semaphore + 1) % static_cast<u32>(m_semaphores.size());
|
||||
|
||||
const VkResult res =
|
||||
vkAcquireNextImageKHR(VulkanDevice::GetInstance().GetVulkanDevice(), m_swap_chain, UINT64_MAX,
|
||||
m_semaphores[m_current_semaphore].available_semaphore, VK_NULL_HANDLE, &m_current_image);
|
||||
|
|
Loading…
Reference in a new issue