diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp index 3539ccb9..dea8c373 100644 --- a/src/d3d11/d3d11_swapchain.cpp +++ b/src/d3d11/d3d11_swapchain.cpp @@ -254,11 +254,11 @@ namespace dxvk { // Presentation semaphores and WSI swap chain image vk::PresenterInfo info = m_presenter->info(); - vk::PresenterSync sync = m_presenter->getSyncSemaphores(); + vk::PresenterSync sync; uint32_t imageIndex = 0; - VkResult status = m_presenter->acquireNextImage(sync.acquire, imageIndex); + VkResult status = m_presenter->acquireNextImage(sync, imageIndex); while (status != VK_SUCCESS && status != VK_SUBOPTIMAL_KHR) { RecreateSwapChain(m_vsync); @@ -267,9 +267,7 @@ namespace dxvk { return DXGI_STATUS_OCCLUDED; info = m_presenter->info(); - sync = m_presenter->getSyncSemaphores(); - - status = m_presenter->acquireNextImage(sync.acquire, imageIndex); + status = m_presenter->acquireNextImage(sync, imageIndex); } // Resolve back buffer if it is multisampled. We @@ -317,8 +315,7 @@ namespace dxvk { if (cHud != nullptr && !cFrameId) cHud->update(); - m_device->presentImage(m_presenter, - cSync.present, &m_presentStatus); + m_device->presentImage(m_presenter, &m_presentStatus); }); pContext->FlushCsChunk(); diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index a405c6e4..b0516435 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -787,19 +787,17 @@ namespace dxvk { // Presentation semaphores and WSI swap chain image vk::PresenterInfo info = m_presenter->info(); - vk::PresenterSync sync = m_presenter->getSyncSemaphores(); + vk::PresenterSync sync; uint32_t imageIndex = 0; - VkResult status = m_presenter->acquireNextImage(sync.acquire, imageIndex); + VkResult status = m_presenter->acquireNextImage(sync, imageIndex); while (status != VK_SUCCESS && status != VK_SUBOPTIMAL_KHR) { RecreateSwapChain(m_vsync); info = m_presenter->info(); - sync = m_presenter->getSyncSemaphores(); - - status = m_presenter->acquireNextImage(sync.acquire, imageIndex); + status = m_presenter->acquireNextImage(sync, imageIndex); } m_context->beginRecording( @@ -852,8 +850,7 @@ namespace dxvk { if (cHud != nullptr && !cFrameId) cHud->update(); - m_device->presentImage(m_presenter, - cSync.present, &m_presentStatus); + m_device->presentImage(m_presenter, &m_presentStatus); }); m_parent->FlushCsChunk(); diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index 7678c5c0..23fa92ae 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -211,13 +211,11 @@ namespace dxvk { void DxvkDevice::presentImage( const Rc& presenter, - VkSemaphore semaphore, DxvkSubmitStatus* status) { status->result = VK_NOT_READY; DxvkPresentInfo presentInfo; presentInfo.presenter = presenter; - presentInfo.waitSync = semaphore; m_submissionQueue.present(presentInfo, status); std::lock_guard statLock(m_statLock); diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index 7ff07b43..246cef1c 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -399,12 +399,10 @@ namespace dxvk { * the submission thread. The status of this operation * can be retrieved with \ref waitForSubmission. * \param [in] presenter The presenter - * \param [in] semaphore Sync semaphore * \param [out] status Present status */ void presentImage( const Rc& presenter, - VkSemaphore semaphore, DxvkSubmitStatus* status); /** diff --git a/src/dxvk/dxvk_queue.cpp b/src/dxvk/dxvk_queue.cpp index b9214afa..f97ef409 100644 --- a/src/dxvk/dxvk_queue.cpp +++ b/src/dxvk/dxvk_queue.cpp @@ -108,8 +108,7 @@ namespace dxvk { entry.submit.waitSync, entry.submit.wakeSync); } else if (entry.present.presenter != nullptr) { - status = entry.present.presenter->presentImage( - entry.present.waitSync); + status = entry.present.presenter->presentImage(); } } else { // Don't submit anything after device loss diff --git a/src/dxvk/dxvk_queue.h b/src/dxvk/dxvk_queue.h index f8da9a3f..d8bad21a 100644 --- a/src/dxvk/dxvk_queue.h +++ b/src/dxvk/dxvk_queue.h @@ -46,7 +46,6 @@ namespace dxvk { */ struct DxvkPresentInfo { Rc presenter; - VkSemaphore waitSync; }; diff --git a/src/vulkan/vulkan_presenter.cpp b/src/vulkan/vulkan_presenter.cpp index ed146379..5d0f6250 100644 --- a/src/vulkan/vulkan_presenter.cpp +++ b/src/vulkan/vulkan_presenter.cpp @@ -38,49 +38,44 @@ namespace dxvk::vk { } - PresenterSync Presenter::getSyncSemaphores() const { - return m_semaphores.at(m_frameIndex); - } - - PresenterImage Presenter::getImage(uint32_t index) const { return m_images.at(index); } - VkResult Presenter::acquireNextImage( - VkSemaphore signal, - uint32_t& index) { - VkResult status; + VkResult Presenter::acquireNextImage(PresenterSync& sync, uint32_t& index) { + sync = m_semaphores.at(m_frameIndex); - status = m_vkd->vkAcquireNextImageKHR( + VkResult status = m_vkd->vkAcquireNextImageKHR( m_vkd->device(), m_swapchain, std::numeric_limits::max(), - signal, VK_NULL_HANDLE, &m_imageIndex); + sync.acquire, VK_NULL_HANDLE, &m_imageIndex); if (status != VK_SUCCESS && status != VK_SUBOPTIMAL_KHR) return status; - m_frameIndex += 1; - m_frameIndex %= m_semaphores.size(); - index = m_imageIndex; return status; } - VkResult Presenter::presentImage(VkSemaphore wait) { + VkResult Presenter::presentImage() { + PresenterSync sync = m_semaphores.at(m_frameIndex); + VkPresentInfoKHR info; info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; info.pNext = nullptr; info.waitSemaphoreCount = 1; - info.pWaitSemaphores = &wait; + info.pWaitSemaphores = &sync.present; info.swapchainCount = 1; info.pSwapchains = &m_swapchain; info.pImageIndices = &m_imageIndex; info.pResults = nullptr; + m_frameIndex += 1; + m_frameIndex %= m_semaphores.size(); + return m_vkd->vkQueuePresentKHR(m_device.queue, &info); } diff --git a/src/vulkan/vulkan_presenter.h b/src/vulkan/vulkan_presenter.h index fcaa1d3c..a7cbbf7d 100644 --- a/src/vulkan/vulkan_presenter.h +++ b/src/vulkan/vulkan_presenter.h @@ -106,15 +106,6 @@ namespace dxvk::vk { */ PresenterInfo info() const; - /** - * \breif Retrieves a pair of semaphores - * - * These semaphores are meant to be used - * for acquire and present operations. - * \returns Pair of semaphores - */ - PresenterSync getSyncSemaphores() const; - /** * \brief Retrieves image by index * @@ -132,12 +123,12 @@ namespace dxvk::vk { * If this returns an error, the swap chain * must be recreated and a new image must * be acquired before proceeding. - * \param [in] signal Semaphore to signal + * \param [out] sync Synchronization semaphores * \param [out] index Acquired image index * \returns Status of the operation */ VkResult acquireNextImage( - VkSemaphore signal, + PresenterSync& sync, uint32_t& index); /** @@ -146,11 +137,9 @@ namespace dxvk::vk { * Presents the current image. If this returns * an error, the swap chain must be recreated, * but do not present before acquiring an image. - * \param [in] wait Semaphore to wait on * \returns Status of the operation */ - VkResult presentImage( - VkSemaphore wait); + VkResult presentImage(); /** * \brief Changes presenter properties