diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2023-04-04 22:02:39 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-04 22:02:39 +0200 |
| commit | d8fabd37fbdd3ec355832ba4685749bbe6f1ede8 (patch) | |
| tree | 69dd6fc667dd905611cfd84da26e60b139556a4f /Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp | |
| parent | c71a4c2751c705940a00d9b7befdd29a5c5c9f48 (diff) | |
| parent | c1be9628fc1237ffbae14f2d1a15ed1895be2eda (diff) | |
Merge pull request #11417 from K0bin/vk-submit-thread-cleanup
VideoBackends:Vulkan: Clean up submission thread using WorkQueueThread
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp | 54 |
1 files changed, 8 insertions, 46 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp b/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp index 80bbd7e5b5..be02034f67 100644 --- a/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp +++ b/Source/Core/VideoBackends/Vulkan/CommandBufferManager.cpp @@ -26,8 +26,7 @@ CommandBufferManager::~CommandBufferManager() if (m_use_threaded_submission) { WaitForWorkerThreadIdle(); - m_submit_loop->Stop(); - m_submit_thread.join(); + m_submit_thread.Shutdown(); } DestroyCommandBuffers(); @@ -221,40 +220,11 @@ VkDescriptorSet CommandBufferManager::AllocateDescriptorSet(VkDescriptorSetLayou bool CommandBufferManager::CreateSubmitThread() { - m_submit_loop = std::make_unique<Common::BlockingLoop>(); - m_submit_thread = std::thread([this]() { - Common::SetCurrentThreadName("Vulkan CommandBufferManager SubmitThread"); - - m_submit_loop->Run([this]() { - PendingCommandBufferSubmit submit; - { - std::lock_guard<std::mutex> guard(m_pending_submit_lock); - if (m_pending_submits.empty()) - { - m_submit_loop->AllowSleep(); - m_submit_worker_idle = true; - m_submit_worker_condvar.notify_all(); - 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); - - { - std::lock_guard<std::mutex> guard(m_pending_submit_lock); - if (m_pending_submits.empty()) - { - m_submit_worker_idle = true; - m_submit_worker_condvar.notify_all(); - } - } - }); + m_submit_thread.Reset("VK submission thread", [this](PendingCommandBufferSubmit submit) { + 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; @@ -265,8 +235,7 @@ void CommandBufferManager::WaitForWorkerThreadIdle() if (!m_use_threaded_submission) return; - std::unique_lock lock{m_pending_submit_lock}; - m_submit_worker_condvar.wait(lock, [&] { return m_submit_worker_idle; }); + m_submit_thread.WaitForCompletion(); } void CommandBufferManager::WaitForFenceCounter(u64 fence_counter) @@ -352,14 +321,7 @@ void CommandBufferManager::SubmitCommandBuffer(bool submit_on_worker_thread, { resources.waiting_for_submit.store(true, std::memory_order_relaxed); // Push to the pending submit queue. - { - std::lock_guard<std::mutex> guard(m_pending_submit_lock); - m_submit_worker_idle = false; - 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(); + m_submit_thread.Push({present_swap_chain, present_image_index, m_current_cmd_buffer}); } else { |
