mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-09 00:11:24 +12:00
Avoid using PUTLLC in PUTLLUC if we know SPU LR has already been raised (#11940)
This commit is contained in:
parent
ce48d880d9
commit
be5f8413ca
1 changed files with 8 additions and 1 deletions
|
@ -2918,13 +2918,14 @@ void spu_thread::do_putlluc(const spu_mfc_cmd& args)
|
|||
// Try to process PUTLLUC using PUTLLC when a reservation is active:
|
||||
// If it fails the reservation is cleared, LR event is set and we fallback to the main implementation
|
||||
// All of this is done atomically in PUTLLC
|
||||
if (do_putllc(args))
|
||||
if (!(ch_events.load().events & SPU_EVENT_LR) && do_putllc(args))
|
||||
{
|
||||
// Success, return as our job was done here
|
||||
return;
|
||||
}
|
||||
|
||||
// Failure, fallback to the main implementation
|
||||
raddr = 0;
|
||||
}
|
||||
|
||||
do_cell_atomic_128_store(addr, _ptr<spu_rdata_t>(args.lsa & 0x3ff80));
|
||||
|
@ -3219,6 +3220,12 @@ bool spu_thread::process_mfc_cmd()
|
|||
u64 ntime;
|
||||
rsx::reservation_lock rsx_lock(addr, 128);
|
||||
|
||||
if (ch_events.load().events & SPU_EVENT_LR)
|
||||
{
|
||||
// There is no longer a need to concern about LR event if it has already been raised.
|
||||
raddr = 0;
|
||||
}
|
||||
|
||||
if (raddr)
|
||||
{
|
||||
// Save rdata from previous reservation
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue