[vulkan] Create per-swap image fences for presenter

This commit is contained in:
Philip Rebohle 2019-02-21 16:29:24 +01:00
parent a6d1fe07f2
commit b6804a95b7
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 21 additions and 9 deletions

View File

@ -188,17 +188,26 @@ namespace dxvk::vk {
m_semaphores.resize(m_info.imageCount); m_semaphores.resize(m_info.imageCount);
for (uint32_t i = 0; i < m_info.imageCount; i++) { for (uint32_t i = 0; i < m_info.imageCount; i++) {
VkSemaphoreCreateInfo info; VkFenceCreateInfo fenceInfo;
info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
info.pNext = nullptr; fenceInfo.pNext = nullptr;
info.flags = 0; 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(), 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; return status;
if ((status = m_vkd->vkCreateSemaphore(m_vkd->device(), 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; return status;
} }
@ -385,6 +394,7 @@ namespace dxvk::vk {
m_vkd->vkDestroyImageView(m_vkd->device(), img.view, nullptr); m_vkd->vkDestroyImageView(m_vkd->device(), img.view, nullptr);
for (const auto& sem : m_semaphores) { 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.acquire, nullptr);
m_vkd->vkDestroySemaphore(m_vkd->device(), sem.present, nullptr); m_vkd->vkDestroySemaphore(m_vkd->device(), sem.present, nullptr);
} }

View File

@ -61,11 +61,13 @@ namespace dxvk::vk {
/** /**
* \brief Presenter semaphores * \brief Presenter semaphores
* *
* Pair of semaphores used for acquire * Pair of semaphores used for acquire and present
* and present operations, including * operations, including the command buffers used
* the command buffers used in between. * in between. Also stores a fence to signal on
* image acquisition.
*/ */
struct PresenterSync { struct PresenterSync {
VkFence fence;
VkSemaphore acquire; VkSemaphore acquire;
VkSemaphore present; VkSemaphore present;
}; };