From b6804a95b74d4ab8d7b0adab9ee128b06f25e55b Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 21 Feb 2019 16:29:24 +0100 Subject: [PATCH] [vulkan] Create per-swap image fences for presenter --- src/vulkan/vulkan_presenter.cpp | 22 ++++++++++++++++------ src/vulkan/vulkan_presenter.h | 8 +++++--- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/vulkan/vulkan_presenter.cpp b/src/vulkan/vulkan_presenter.cpp index 3f2694d9..21444dec 100644 --- a/src/vulkan/vulkan_presenter.cpp +++ b/src/vulkan/vulkan_presenter.cpp @@ -188,17 +188,26 @@ namespace dxvk::vk { m_semaphores.resize(m_info.imageCount); for (uint32_t i = 0; i < m_info.imageCount; i++) { - VkSemaphoreCreateInfo info; - info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - info.pNext = nullptr; - info.flags = 0; + VkFenceCreateInfo fenceInfo; + fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + fenceInfo.pNext = nullptr; + fenceInfo.flags = 0; + + if ((status = m_vkd->vkCreateFence(m_vkd->device(), + &fenceInfo, nullptr, &m_semaphores[i].fence)) != VK_SUCCESS) + return status; + + VkSemaphoreCreateInfo semInfo; + semInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + semInfo.pNext = nullptr; + semInfo.flags = 0; if ((status = m_vkd->vkCreateSemaphore(m_vkd->device(), - &info, nullptr, &m_semaphores[i].acquire)) != VK_SUCCESS) + &semInfo, nullptr, &m_semaphores[i].acquire)) != VK_SUCCESS) return status; if ((status = m_vkd->vkCreateSemaphore(m_vkd->device(), - &info, nullptr, &m_semaphores[i].present)) != VK_SUCCESS) + &semInfo, nullptr, &m_semaphores[i].present)) != VK_SUCCESS) return status; } @@ -385,6 +394,7 @@ namespace dxvk::vk { m_vkd->vkDestroyImageView(m_vkd->device(), img.view, nullptr); for (const auto& sem : m_semaphores) { + m_vkd->vkDestroyFence(m_vkd->device(), sem.fence, nullptr); m_vkd->vkDestroySemaphore(m_vkd->device(), sem.acquire, nullptr); m_vkd->vkDestroySemaphore(m_vkd->device(), sem.present, nullptr); } diff --git a/src/vulkan/vulkan_presenter.h b/src/vulkan/vulkan_presenter.h index 2e16a441..1435f7fe 100644 --- a/src/vulkan/vulkan_presenter.h +++ b/src/vulkan/vulkan_presenter.h @@ -61,11 +61,13 @@ namespace dxvk::vk { /** * \brief Presenter semaphores * - * Pair of semaphores used for acquire - * and present operations, including - * the command buffers used in between. + * Pair of semaphores used for acquire and present + * operations, including the command buffers used + * in between. Also stores a fence to signal on + * image acquisition. */ struct PresenterSync { + VkFence fence; VkSemaphore acquire; VkSemaphore present; };