Basic fixups

This commit is contained in:
kd-11 2021-03-08 22:57:28 +03:00 committed by kd-11
parent 7d5a72c9e0
commit 3e8a00d264
3 changed files with 32 additions and 12 deletions

View file

@ -12,9 +12,11 @@ namespace vk
{ {
void AsyncTaskScheduler::operator()() void AsyncTaskScheduler::operator()()
{ {
init_config_options();
if (!m_use_host_scheduler) if (!m_use_host_scheduler)
{ {
// No need to keep the GPU alive using a CPU thread. // No need to keep the GPU alive using a CPU thread.
rsx_log.notice("Host scheduler is disabled. This thread will now exit.");
return; return;
} }
@ -36,8 +38,23 @@ namespace vk
release(); 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() void AsyncTaskScheduler::delayed_init()
{ {
init_config_options();
auto pdev = get_current_renderer(); auto pdev = get_current_renderer();
m_command_pool.create(*const_cast<render_device*>(pdev), pdev->get_transfer_queue_family()); m_command_pool.create(*const_cast<render_device*>(pdev), pdev->get_transfer_queue_family());
@ -45,20 +62,15 @@ namespace vk
{ {
auto ev1 = std::make_unique<event>(*get_current_renderer(), sync_domain::gpu); auto ev1 = std::make_unique<event>(*get_current_renderer(), sync_domain::gpu);
auto ev2 = std::make_unique<event>(*get_current_renderer(), sync_domain::gpu); auto ev2 = std::make_unique<event>(*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() void AsyncTaskScheduler::insert_sync_event()
{ {
ensure(m_current_cb); ensure(m_current_cb);
xqueue_event* sync_label;
ensure(m_next_event_id < events_pool_size); 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) if (++m_next_event_id == events_pool_size)
{ {
@ -106,7 +118,6 @@ namespace vk
} }
// 1. Check if there is a 'next' entry // 1. Check if there is a 'next' entry
auto pdev = get_current_renderer();
if (m_async_command_queue.empty()) if (m_async_command_queue.empty())
{ {
delayed_init(); delayed_init();
@ -173,7 +184,7 @@ namespace vk
void AsyncTaskScheduler::kill() void AsyncTaskScheduler::kill()
{ {
g_fxo->get<async_scheduler_thread>() = thread_state::aborting; g_fxo->get<async_scheduler_thread>() = thread_state::aborting;
while (has_refs()) _mm_pause(); while (has_refs());
for (auto& cb : m_async_command_queue) for (auto& cb : m_async_command_queue)
{ {

View file

@ -14,6 +14,11 @@ namespace vk
std::unique_ptr<event> queue1_signal; std::unique_ptr<event> queue1_signal;
std::unique_ptr<event> queue2_signal; std::unique_ptr<event> queue2_signal;
u64 completion_eid; u64 completion_eid;
xqueue_event(): completion_eid(0) {}
xqueue_event(std::unique_ptr<event>& trigger, std::unique_ptr<event>& payload, u64 eid)
: queue1_signal(std::move(trigger)), queue2_signal(std::move(payload)), completion_eid(eid)
{}
}; };
class AsyncTaskScheduler : private rsx::ref_counted class AsyncTaskScheduler : private rsx::ref_counted
@ -28,6 +33,8 @@ namespace vk
usz m_next_cb_index = 0; usz m_next_cb_index = 0;
// Scheduler // Scheduler
shared_mutex m_config_mutex;
bool m_options_initialized = false;
bool m_use_host_scheduler = false; bool m_use_host_scheduler = false;
// Sync // Sync
@ -41,6 +48,7 @@ namespace vk
lf_queue<xqueue_event*> m_event_queue; lf_queue<xqueue_event*> m_event_queue;
shared_mutex m_submit_mutex; shared_mutex m_submit_mutex;
void init_config_options();
void delayed_init(); void delayed_init();
void insert_sync_event(); void insert_sync_event();

View file

@ -6,6 +6,7 @@
#include "shared.h" #include "shared.h"
#include "util/sysinfo.hpp" #include "util/sysinfo.hpp"
#include "util/asm.hpp"
extern u64 get_system_time(); extern u64 get_system_time();
@ -203,11 +204,11 @@ namespace vk
{ {
if (!start) if (!start)
{ {
start = __rdtsc(); start = utils::get_tsc();
continue; continue;
} }
if (const auto now = __rdtsc(); if (const auto now = utils::get_tsc();
(now > start) && (now > start) &&
(now - start) > timeout) (now - start) > timeout)
{ {