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()()
{
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<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 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()
{
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<async_scheduler_thread>() = thread_state::aborting;
while (has_refs()) _mm_pause();
while (has_refs());
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> queue2_signal;
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
@ -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<xqueue_event*> 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<AsyncTaskScheduler>;
}
}

View file

@ -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)
{