From 3e8a00d2641bd0b308929c907f6947232cc48099 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 8 Mar 2021 22:57:28 +0300 Subject: [PATCH] Basic fixups --- rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp | 29 ++++++++++++++++++--------- rpcs3/Emu/RSX/VK/VKAsyncScheduler.h | 10 ++++++++- rpcs3/Emu/RSX/VK/vkutils/sync.cpp | 5 +++-- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp index 47722c1b8f..4dd6bb7cec 100644 --- a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp +++ b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp @@ -12,9 +12,11 @@ namespace vk { void AsyncTaskScheduler::operator()() { + init_config_options(); if (!m_use_host_scheduler) { // No need to keep the GPU alive using a CPU thread. + rsx_log.notice("Host scheduler is disabled. This thread will now exit."); return; } @@ -36,8 +38,23 @@ namespace vk release(); } + void AsyncTaskScheduler::init_config_options() + { + std::lock_guard lock(m_config_mutex); + if (std::exchange(m_options_initialized, true)) + { + // Nothing to do + return; + } + + m_use_host_scheduler = g_cfg.video.vk.asynchronous_scheduler == vk_gpu_scheduler_mode::host || g_cfg.video.strict_rendering_mode; + rsx_log.notice("Asynchronous task scheduler is active running in %s mode", m_use_host_scheduler? "'Host'" : "'Device'"); + } + void AsyncTaskScheduler::delayed_init() { + init_config_options(); + auto pdev = get_current_renderer(); m_command_pool.create(*const_cast(pdev), pdev->get_transfer_queue_family()); @@ -45,20 +62,15 @@ namespace vk { auto ev1 = std::make_unique(*get_current_renderer(), sync_domain::gpu); auto ev2 = std::make_unique(*get_current_renderer(), sync_domain::gpu); - m_events_pool.emplace_back(std::move(ev1), std::move(ev2), 0ull); + m_events_pool.emplace_back(ev1, ev2, 0ull); } - - m_use_host_scheduler = g_cfg.video.vk.asynchronous_scheduler == vk_gpu_scheduler_mode::host || g_cfg.video.strict_rendering_mode; - rsx_log.notice("Asynchronous task scheduler is active running in %s mode", m_use_host_scheduler? "'Host'" : "'Device'"); } void AsyncTaskScheduler::insert_sync_event() { ensure(m_current_cb); - - xqueue_event* sync_label; ensure(m_next_event_id < events_pool_size); - sync_label = &m_events_pool[m_next_event_id]; + auto sync_label = &m_events_pool[m_next_event_id]; if (++m_next_event_id == events_pool_size) { @@ -106,7 +118,6 @@ namespace vk } // 1. Check if there is a 'next' entry - auto pdev = get_current_renderer(); if (m_async_command_queue.empty()) { delayed_init(); @@ -173,7 +184,7 @@ namespace vk void AsyncTaskScheduler::kill() { g_fxo->get() = thread_state::aborting; - while (has_refs()) _mm_pause(); + while (has_refs()); for (auto& cb : m_async_command_queue) { diff --git a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h index 7d5f004435..4a27657d9b 100644 --- a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h +++ b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h @@ -14,6 +14,11 @@ namespace vk std::unique_ptr queue1_signal; std::unique_ptr queue2_signal; u64 completion_eid; + + xqueue_event(): completion_eid(0) {} + xqueue_event(std::unique_ptr& trigger, std::unique_ptr& payload, u64 eid) + : queue1_signal(std::move(trigger)), queue2_signal(std::move(payload)), completion_eid(eid) + {} }; class AsyncTaskScheduler : private rsx::ref_counted @@ -28,6 +33,8 @@ namespace vk usz m_next_cb_index = 0; // Scheduler + shared_mutex m_config_mutex; + bool m_options_initialized = false; bool m_use_host_scheduler = false; // Sync @@ -41,6 +48,7 @@ namespace vk lf_queue m_event_queue; shared_mutex m_submit_mutex; + void init_config_options(); void delayed_init(); void insert_sync_event(); @@ -61,4 +69,4 @@ namespace vk }; using async_scheduler_thread = named_thread; -} \ No newline at end of file +} diff --git a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp index f6bc8a229e..50345ebb4f 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp @@ -6,6 +6,7 @@ #include "shared.h" #include "util/sysinfo.hpp" +#include "util/asm.hpp" extern u64 get_system_time(); @@ -203,11 +204,11 @@ namespace vk { if (!start) { - start = __rdtsc(); + start = utils::get_tsc(); continue; } - if (const auto now = __rdtsc(); + if (const auto now = utils::get_tsc(); (now > start) && (now - start) > timeout) {