mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-08 16:01:42 +12:00
SPU: Implement execution wake-up delay
This commit is contained in:
parent
149c593d89
commit
cf0fcf5a2a
7 changed files with 83 additions and 64 deletions
|
@ -2780,59 +2780,10 @@ namespace rsx
|
|||
return result;
|
||||
}
|
||||
|
||||
void thread::fifo_wake_delay(u64 div)
|
||||
void thread::fifo_wake_delay(u32 div)
|
||||
{
|
||||
// TODO: Nanoseconds accuracy
|
||||
u64 remaining = g_cfg.video.driver_wakeup_delay;
|
||||
|
||||
if (!remaining)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Some cases do not need full delay
|
||||
remaining = utils::aligned_div(remaining, div);
|
||||
const u64 until = rsx::uclock() + remaining;
|
||||
|
||||
while (true)
|
||||
{
|
||||
#ifdef __linux__
|
||||
// NOTE: Assumption that timer initialization has succeeded
|
||||
u64 host_min_quantum = remaining <= 1000 ? 10 : 50;
|
||||
#else
|
||||
// Host scheduler quantum for windows (worst case)
|
||||
// NOTE: On ps3 this function has very high accuracy
|
||||
constexpr u64 host_min_quantum = 500;
|
||||
#endif
|
||||
if (remaining >= host_min_quantum)
|
||||
{
|
||||
#ifdef __linux__
|
||||
// Do not wait for the last quantum to avoid loss of accuracy
|
||||
thread_ctrl::wait_for(remaining - ((remaining % host_min_quantum) + host_min_quantum), false);
|
||||
#else
|
||||
// Wait on multiple of min quantum for large durations to avoid overloading low thread cpus
|
||||
thread_ctrl::wait_for(remaining - (remaining % host_min_quantum), false);
|
||||
#endif
|
||||
}
|
||||
// TODO: Determine best value for yield delay
|
||||
else if (remaining >= host_min_quantum / 2)
|
||||
{
|
||||
std::this_thread::yield();
|
||||
}
|
||||
else
|
||||
{
|
||||
busy_wait(100);
|
||||
}
|
||||
|
||||
const u64 current = rsx::uclock();
|
||||
|
||||
if (current >= until)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
remaining = until - current;
|
||||
}
|
||||
thread_ctrl::wait_for_accurate(utils::aligned_div(+g_cfg.video.driver_wakeup_delay, div));
|
||||
}
|
||||
|
||||
u32 thread::get_fifo_cmd() const
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue