mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-11 09:18:40 +12:00
Basic fixups
This commit is contained in:
parent
7d5a72c9e0
commit
3e8a00d264
3 changed files with 32 additions and 12 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue