From ce92341e7582f8a3cf843b0bd75b2e3b5722e17c Mon Sep 17 00:00:00 2001 From: Elad Ashkenazi <18193363+elad335@users.noreply.github.com> Date: Thu, 15 Aug 2024 07:56:20 +0300 Subject: [PATCH] SPU: Unlock RSX list transfers --- rpcs3/Emu/Cell/SPUThread.cpp | 18 +++++++++++++----- rpcs3/Emu/RSX/Core/RSXReservationLock.hpp | 3 ++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index a24ab0a0f4..1fe8e3e8a3 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -3504,13 +3504,21 @@ bool spu_thread::do_list_transfer(spu_mfc_cmd& args) arg_lsa += utils::align(size, 16); } // Avoid inlining huge transfers because it intentionally drops range lock unlock - else if (addr < RAW_SPU_BASE_ADDR && size - 1 <= 0x400 - 1 && optimization_compatible == MFC_PUT_CMD && (addr % 0x10000 + (size - 1)) < 0x10000) + else if (optimization_compatible == MFC_PUT_CMD && ((addr >> 28 == rsx::constants::local_mem_base >> 28) || (addr < RAW_SPU_BASE_ADDR && size - 1 <= 0x400 - 1 && (addr % 0x10000 + (size - 1)) < 0x10000))) { - rsx_lock.update_if_enabled(addr, size, range_lock); - - if (!g_use_rtm) + if (addr >> 28 != rsx::constants::local_mem_base >> 28) { - vm::range_lock(range_lock, addr & -128, utils::align(addr + size, 128) - (addr & -128)); + rsx_lock.update_if_enabled(addr, size, range_lock); + + if (!g_use_rtm) + { + vm::range_lock(range_lock, addr & -128, utils::align(addr + size, 128) - (addr & -128)); + } + } + else + { + range_lock->release(0); + rsx_lock.unlock(); } u8* dst = vm::_ptr(addr); diff --git a/rpcs3/Emu/RSX/Core/RSXReservationLock.hpp b/rpcs3/Emu/RSX/Core/RSXReservationLock.hpp index 2f83ffa50b..06ae47796e 100644 --- a/rpcs3/Emu/RSX/Core/RSXReservationLock.hpp +++ b/rpcs3/Emu/RSX/Core/RSXReservationLock.hpp @@ -73,8 +73,9 @@ namespace rsx template void update_if_enabled(u32 addr, u32 _length, const std::add_pointer_t& lock_release = std::add_pointer_t{}) { - if (!length || _length <= 1) + if (!length) { + unlock(); return; }