diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index e7169c89e4..7dc52ab1ec 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -6563,7 +6563,7 @@ public: break; } - if (u64 cmdh = ci->getZExtValue() & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_RESULT_MASK); g_cfg.core.rsx_fifo_accuracy || !g_use_rtm) + if (u64 cmdh = ci->getZExtValue() & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_RESULT_MASK); g_cfg.core.rsx_fifo_accuracy || g_cfg.video.strict_rendering_mode || !g_use_rtm) { // TODO: don't require TSX (current implementation is TSX-only) if (cmdh == MFC_PUT_CMD || cmdh == MFC_SNDSIG_CMD) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 92206c2f44..45424d8479 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -2063,7 +2063,7 @@ void spu_thread::do_dma_transfer(spu_thread* _this, const spu_mfc_cmd& args, u8* src = zero_buf; } - rsx::reservation_lock rsx_lock(eal, args.size, !is_get && g_cfg.core.rsx_fifo_accuracy && !g_cfg.core.spu_accurate_dma); + rsx::reservation_lock rsx_lock(eal, args.size, !is_get && (g_cfg.video.strict_rendering_mode || (g_cfg.core.rsx_fifo_accuracy && !g_cfg.core.spu_accurate_dma && eal < rsx::constants::local_mem_base))); if ((!g_use_rtm && !is_get) || g_cfg.core.spu_accurate_dma) [[unlikely]] { diff --git a/rpcs3/Emu/RSX/RSXOffload.cpp b/rpcs3/Emu/RSX/RSXOffload.cpp index 4e1eb2542f..413acf2025 100644 --- a/rpcs3/Emu/RSX/RSXOffload.cpp +++ b/rpcs3/Emu/RSX/RSXOffload.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" +#include "Emu/Memory/vm.h" #include "Common/BufferUtils.h" #include "RSXOffload.h" #include "RSXThread.h" @@ -44,6 +45,8 @@ namespace rsx { case raw_copy: { + const u32 vm_addr = vm::try_get_addr(job.src).first; + rsx::reservation_lock rsx_lock(vm_addr, job.length, g_cfg.video.strict_rendering_mode && vm_addr); std::memcpy(job.dst, job.src, job.length); break; } @@ -108,6 +111,8 @@ namespace rsx { if (length <= max_immediate_transfer_size || !g_cfg.video.multithreaded_rsx) { + const u32 vm_addr = vm::try_get_addr(src).first; + rsx::reservation_lock rsx_lock(vm_addr, length, g_cfg.video.strict_rendering_mode && vm_addr); std::memcpy(dst, src, length); } else diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 414ff2844e..e1f194fda9 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -879,7 +879,7 @@ namespace rsx reservation_lock(u32 addr, u32 length, bool setting) { - if (setting && addr < constants::local_mem_base) + if (setting) { lock_range(addr, length); }