mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-06 23:15:18 +00:00
SPU/Non-TSX: Implement cuncurrent reservations
This commit is contained in:
parent
db24ce7708
commit
75ad56338b
5 changed files with 210 additions and 103 deletions
|
|
@ -682,6 +682,7 @@ static atomic_t<u32> s_dummy_atomic = 0;
|
|||
bool cpu_thread::check_state() noexcept
|
||||
{
|
||||
bool cpu_sleep_called = false;
|
||||
bool cpu_memory_checked = false;
|
||||
bool cpu_can_stop = true;
|
||||
bool escape{}, retval{};
|
||||
|
||||
|
|
@ -770,7 +771,7 @@ bool cpu_thread::check_state() noexcept
|
|||
if (!is_stopped(flags) && flags.none_of(cpu_flag::ret))
|
||||
{
|
||||
// Check pause flags which hold thread inside check_state (ignore suspend/debug flags on cpu_flag::temp)
|
||||
if (flags & (cpu_flag::pause + cpu_flag::memory) || (cpu_can_stop && flags & (cpu_flag::dbg_global_pause + cpu_flag::dbg_pause + cpu_flag::suspend + cpu_flag::yield + cpu_flag::preempt)))
|
||||
if (flags & cpu_flag::pause || (!cpu_memory_checked && flags & cpu_flag::memory) || (cpu_can_stop && flags & (cpu_flag::dbg_global_pause + cpu_flag::dbg_pause + cpu_flag::suspend + cpu_flag::yield + cpu_flag::preempt)))
|
||||
{
|
||||
if (!(flags & cpu_flag::wait))
|
||||
{
|
||||
|
|
@ -789,12 +790,18 @@ bool cpu_thread::check_state() noexcept
|
|||
return store;
|
||||
}
|
||||
|
||||
if (flags & (cpu_flag::wait + cpu_flag::memory))
|
||||
{
|
||||
flags -= (cpu_flag::wait + cpu_flag::memory);
|
||||
store = true;
|
||||
}
|
||||
|
||||
if (s_tls_thread_slot == umax)
|
||||
{
|
||||
if (cpu_flag::wait - state)
|
||||
if (cpu_flag::wait - this->state.load())
|
||||
{
|
||||
// Force wait flag (must be set during ownership of s_cpu_lock), this makes the atomic op fail as a side effect
|
||||
state += cpu_flag::wait;
|
||||
this->state += cpu_flag::wait;
|
||||
store = true;
|
||||
}
|
||||
|
||||
|
|
@ -802,12 +809,6 @@ bool cpu_thread::check_state() noexcept
|
|||
cpu_counter::add(this);
|
||||
}
|
||||
|
||||
if (flags & cpu_flag::wait)
|
||||
{
|
||||
flags -= cpu_flag::wait;
|
||||
store = true;
|
||||
}
|
||||
|
||||
retval = false;
|
||||
}
|
||||
else
|
||||
|
|
@ -856,6 +857,14 @@ bool cpu_thread::check_state() noexcept
|
|||
|
||||
if (escape)
|
||||
{
|
||||
if (vm::g_range_lock_bits[1] && vm::g_tls_locked && *vm::g_tls_locked == this)
|
||||
{
|
||||
state += cpu_flag::wait + cpu_flag::memory;
|
||||
cpu_sleep_called = false;
|
||||
cpu_memory_checked = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (cpu_can_stop && state0 & cpu_flag::pending)
|
||||
{
|
||||
// Execute pending work
|
||||
|
|
@ -866,6 +875,7 @@ bool cpu_thread::check_state() noexcept
|
|||
// Work could have changed flags
|
||||
// Reset internal flags as if check_state() has just been called
|
||||
cpu_sleep_called = false;
|
||||
cpu_memory_checked = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
@ -883,6 +893,7 @@ bool cpu_thread::check_state() noexcept
|
|||
{
|
||||
cpu_sleep();
|
||||
cpu_sleep_called = true;
|
||||
cpu_memory_checked = false;
|
||||
|
||||
if (s_tls_thread_slot != umax)
|
||||
{
|
||||
|
|
@ -907,6 +918,7 @@ bool cpu_thread::check_state() noexcept
|
|||
if (state0 & cpu_flag::memory)
|
||||
{
|
||||
vm::passive_lock(*this);
|
||||
cpu_memory_checked = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue