VideoBackends:Vulkan: Use WorkQueueThread

This commit is contained in:
Robin Kertels 2023-01-27 15:06:35 +01:00
parent 9d422d14d5
commit c1be9628fc
No known key found for this signature in database
GPG Key ID: 3824904F14D40757
2 changed files with 10 additions and 39 deletions

View File

@ -26,8 +26,7 @@ CommandBufferManager::~CommandBufferManager()
if (m_use_threaded_submission) if (m_use_threaded_submission)
{ {
WaitForWorkerThreadIdle(); WaitForWorkerThreadIdle();
m_submit_loop->Stop(); m_submit_thread.Shutdown();
m_submit_thread.join();
} }
DestroyCommandBuffers(); DestroyCommandBuffers();
@ -221,32 +220,11 @@ VkDescriptorSet CommandBufferManager::AllocateDescriptorSet(VkDescriptorSetLayou
bool CommandBufferManager::CreateSubmitThread() bool CommandBufferManager::CreateSubmitThread()
{ {
m_submit_loop = std::make_unique<Common::BlockingLoop>(); m_submit_thread.Reset("VK submission thread", [this](PendingCommandBufferSubmit submit) {
m_submit_thread = std::thread([this]() { SubmitCommandBuffer(submit.command_buffer_index, submit.present_swap_chain,
Common::SetCurrentThreadName("Vulkan CommandBufferManager SubmitThread"); submit.present_image_index);
CmdBufferResources& resources = m_command_buffers[submit.command_buffer_index];
m_submit_loop->Run([this]() { resources.waiting_for_submit.store(false, std::memory_order_release);
while (true)
{
PendingCommandBufferSubmit submit;
{
std::lock_guard<std::mutex> guard(m_pending_submit_lock);
if (m_pending_submits.empty())
{
m_submit_loop->AllowSleep();
return;
}
submit = m_pending_submits.front();
m_pending_submits.pop_front();
}
SubmitCommandBuffer(submit.command_buffer_index, submit.present_swap_chain,
submit.present_image_index);
CmdBufferResources& resources = m_command_buffers[submit.command_buffer_index];
resources.waiting_for_submit.store(false, std::memory_order_release);
}
});
}); });
return true; return true;
@ -257,7 +235,7 @@ void CommandBufferManager::WaitForWorkerThreadIdle()
if (!m_use_threaded_submission) if (!m_use_threaded_submission)
return; return;
m_submit_loop->Wait(); m_submit_thread.WaitForCompletion();
} }
void CommandBufferManager::WaitForFenceCounter(u64 fence_counter) void CommandBufferManager::WaitForFenceCounter(u64 fence_counter)
@ -343,12 +321,7 @@ void CommandBufferManager::SubmitCommandBuffer(bool submit_on_worker_thread,
{ {
resources.waiting_for_submit.store(true, std::memory_order_relaxed); resources.waiting_for_submit.store(true, std::memory_order_relaxed);
// Push to the pending submit queue. // Push to the pending submit queue.
{ m_submit_thread.Push({present_swap_chain, present_image_index, m_current_cmd_buffer});
std::lock_guard<std::mutex> guard(m_pending_submit_lock);
m_pending_submits.push_back({present_swap_chain, present_image_index, m_current_cmd_buffer});
// Wake up the worker thread for a single iteration.
m_submit_loop->Wakeup();
}
} }
else else
{ {

View File

@ -14,6 +14,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <Common/WorkQueueThread.h>
#include "Common/BlockingLoop.h" #include "Common/BlockingLoop.h"
#include "Common/Flag.h" #include "Common/Flag.h"
#include "Common/Semaphore.h" #include "Common/Semaphore.h"
@ -146,17 +147,14 @@ private:
u32 m_current_cmd_buffer = 0; u32 m_current_cmd_buffer = 0;
// Threaded command buffer execution // Threaded command buffer execution
std::thread m_submit_thread;
std::unique_ptr<Common::BlockingLoop> m_submit_loop;
struct PendingCommandBufferSubmit struct PendingCommandBufferSubmit
{ {
VkSwapchainKHR present_swap_chain; VkSwapchainKHR present_swap_chain;
u32 present_image_index; u32 present_image_index;
u32 command_buffer_index; u32 command_buffer_index;
}; };
Common::WorkQueueThread<PendingCommandBufferSubmit> m_submit_thread;
VkSemaphore m_present_semaphore = VK_NULL_HANDLE; VkSemaphore m_present_semaphore = VK_NULL_HANDLE;
std::deque<PendingCommandBufferSubmit> m_pending_submits;
std::mutex m_pending_submit_lock;
Common::Flag m_last_present_failed; Common::Flag m_last_present_failed;
Common::Flag m_last_present_done; Common::Flag m_last_present_done;
VkResult m_last_present_result = VK_SUCCESS; VkResult m_last_present_result = VK_SUCCESS;