From bb0cfe383db1538443f9992d6b42250feafe9b60 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 1 Apr 2018 20:52:54 +0300 Subject: [PATCH] Fix MFC_SYNC_CMD --- rpcs3/Emu/Cell/SPUThread.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index ddf7e6e2b5..8932728c40 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -815,7 +815,7 @@ void SPUThread::do_mfc() // Process enqueued commands std::remove_if(mfc_queue + 0, mfc_queue + mfc_size, [&](spu_mfc_cmd& args) { - if ((args.cmd & ~0xc) == MFC_BARRIER_CMD) + if (args.cmd == MFC_BARRIER_CMD || args.cmd == MFC_EIEIO_CMD) { if (&args - mfc_queue <= removed) { @@ -884,6 +884,7 @@ void SPUThread::do_mfc() return false; } + // Also ignore MFC_SYNC_CMD if (args.size) { vm::reader_lock lock; @@ -1217,7 +1218,6 @@ bool SPUThread::process_mfc_cmd(spu_mfc_cmd args) } case MFC_BARRIER_CMD: case MFC_EIEIO_CMD: - case MFC_SYNC_CMD: { if (mfc_size == 0) { @@ -1230,6 +1230,20 @@ bool SPUThread::process_mfc_cmd(spu_mfc_cmd args) return true; } + case MFC_SYNC_CMD: + { + if (LIKELY(do_dma_check(args))) + { + _mm_mfence(); + } + else + { + args.size = 0; + mfc_queue[mfc_size++] = args; + } + + return true; + } default: { break;