summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
diff options
context:
space:
mode:
authorTilka <tilkax@gmail.com>2025-07-22 03:03:04 +0100
committerGitHub <noreply@github.com>2025-07-22 03:03:04 +0100
commit79a3af2e6e8f905de081489e5d40ef8dd4fc1db5 (patch)
tree6b98ca059ff73296771fd25beed70e92e70e571b /Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
parentc6de692d01bd71ee501e4a7dfb3361c620b482f1 (diff)
parentb80e178403d895409b481132fb8d62b46bfd8391 (diff)
Merge pull request #13805 from SuperSamus/vulkan-present-sempahore-reuse-fix
Vulkan: Fix present semaphores reuse
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp b/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
index b2f307a910..b325b1428c 100644
--- a/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
+++ b/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp
@@ -12,6 +12,7 @@
#include "VideoBackends/Vulkan/VulkanContext.h"
#include "VideoCommon/Constants.h"
+#include "vulkan/vulkan_core.h"
namespace Vulkan
{
@@ -32,9 +33,9 @@ CommandBufferManager::~CommandBufferManager()
DestroyCommandBuffers();
}
-bool CommandBufferManager::Initialize()
+bool CommandBufferManager::Initialize(size_t swapchain_image_count)
{
- if (!CreateCommandBuffers())
+ if (!CreateCommandBuffers(swapchain_image_count))
return false;
if (m_use_threaded_submission && !CreateSubmitThread())
@@ -43,7 +44,7 @@ bool CommandBufferManager::Initialize()
return true;
}
-bool CommandBufferManager::CreateCommandBuffers()
+bool CommandBufferManager::CreateCommandBuffers(size_t swapchain_image_count)
{
static constexpr VkSemaphoreCreateInfo semaphore_create_info = {
VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
@@ -95,11 +96,17 @@ bool CommandBufferManager::CreateCommandBuffers()
}
}
- res = vkCreateSemaphore(device, &semaphore_create_info, nullptr, &m_present_semaphore);
- if (res != VK_SUCCESS)
+ m_present_semaphores.reserve(swapchain_image_count);
+ for (uint32_t i = 0; i < swapchain_image_count; i++)
{
- LOG_VULKAN_ERROR(res, "vkCreateSemaphore failed: ");
- return false;
+ VkSemaphore present_semaphore;
+ res = vkCreateSemaphore(device, &semaphore_create_info, nullptr, &present_semaphore);
+ if (res != VK_SUCCESS)
+ {
+ LOG_VULKAN_ERROR(res, "vkCreateSemaphore failed: ");
+ return false;
+ }
+ m_present_semaphores.push_back(present_semaphore);
}
// Activate the first command buffer. BeginCommandBuffer moves forward, so start with the last
@@ -140,7 +147,10 @@ void CommandBufferManager::DestroyCommandBuffers()
}
}
- vkDestroySemaphore(device, m_present_semaphore, nullptr);
+ for (VkSemaphore present_semaphore : m_present_semaphores)
+ {
+ vkDestroySemaphore(device, present_semaphore, nullptr);
+ }
}
VkDescriptorPool CommandBufferManager::CreateDescriptorPool(u32 max_descriptor_sets)
@@ -414,7 +424,7 @@ void CommandBufferManager::SubmitCommandBuffer(u32 command_buffer_index,
if (present_swap_chain != VK_NULL_HANDLE)
{
submit_info.signalSemaphoreCount = 1;
- submit_info.pSignalSemaphores = &m_present_semaphore;
+ submit_info.pSignalSemaphores = &m_present_semaphores[present_image_index];
}
VkResult res =
@@ -433,7 +443,7 @@ void CommandBufferManager::SubmitCommandBuffer(u32 command_buffer_index,
VkPresentInfoKHR present_info = {VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
nullptr,
1,
- &m_present_semaphore,
+ &m_present_semaphores[present_image_index],
1,
&present_swap_chain,
&present_image_index,