Fix SPU Loop Detection

This commit is contained in:
Nekotekina 2019-06-20 04:32:19 +03:00
parent 3602d45cb7
commit b9b591bf02
3 changed files with 19 additions and 0 deletions

View file

@ -1534,8 +1534,17 @@ void spu_recompiler::RDCH(spu_opcode_t op)
const u32 out = _spu->ch_dec_value - static_cast<u32>(get_timebased_time() - _spu->ch_dec_start_timestamp);
if (out > 1500)
{
_spu->state += cpu_flag::wait;
std::this_thread::yield();
if (_spu->test_stopped())
{
_spu->pc += 4;
spu_runtime::g_escape(_spu);
}
}
*_res = v128::from32r(out);
};

View file

@ -5200,7 +5200,14 @@ public:
if (res > 1500 && g_cfg.core.spu_loop_detection)
{
_spu->state += cpu_flag::wait;
std::this_thread::yield();
if (_spu->test_stopped())
{
_spu->pc += 4;
spu_runtime::g_escape(_spu);
}
}
return res;

View file

@ -2335,7 +2335,10 @@ s64 spu_thread::get_ch_value(u32 ch)
//Polling: We might as well hint to the scheduler to slot in another thread since this one is counting down
if (g_cfg.core.spu_loop_detection && out > spu::scheduler::native_jiffy_duration_us)
{
state += cpu_flag::wait;
std::this_thread::yield();
}
return out;
}