From 88916a61daf0768c8e6ab8453c249e6b24d7ab81 Mon Sep 17 00:00:00 2001 From: Marcos Vitali Date: Sun, 28 Nov 2010 03:20:20 +0000 Subject: [PATCH] In the command processor when FIFO_READ_POINTER is reading Is better return fifo.CPWritePointer instead fifo.CPReadPointer. In this way it prevents wrong fifo.CPReadWriteDistance in the future. That should fix RE0 Issue 2846 and others "Warning: GFX FIFO: Unknown Opcode (0x4d)" in dual core mode. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6485 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/VideoCommon/Src/CommandProcessor.cpp | 8 ++++---- Source/Core/VideoCommon/Src/Fifo.cpp | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp index 2e46d1219c..752d31b3ed 100644 --- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp @@ -249,15 +249,15 @@ void Read16(u16& _rReturnValue, const u32 _Address) return; case FIFO_READ_POINTER_LO: - _rReturnValue = ReadLow (fifo.CPReadPointer); + //_rReturnValue = ReadLow (fifo.CPReadPointer); // hack: CPU will always believe fifo is empty and on idle - //_rReturnValue = ReadLow (fifo.CPWritePointer); + _rReturnValue = ReadLow (fifo.CPWritePointer); DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_READ_POINTER_LO : %04x", _rReturnValue); return; case FIFO_READ_POINTER_HI: - _rReturnValue = ReadHigh(fifo.CPReadPointer); + //_rReturnValue = ReadHigh(fifo.CPReadPointer); // hack: CPU will always believe fifo is empty and on idle - //_rReturnValue = ReadHigh(fifo.CPWritePointer); + _rReturnValue = ReadHigh(fifo.CPWritePointer); DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_READ_POINTER_HI : %04x", _rReturnValue); return; diff --git a/Source/Core/VideoCommon/Src/Fifo.cpp b/Source/Core/VideoCommon/Src/Fifo.cpp index ae76326eef..9681e52697 100644 --- a/Source/Core/VideoCommon/Src/Fifo.cpp +++ b/Source/Core/VideoCommon/Src/Fifo.cpp @@ -196,11 +196,12 @@ void Fifo_EnterLoop(const SVideoInitialize &video_initialize) readPtr += distToSend; } + Common::AtomicStore(_fifo.CPReadPointer, readPtr); + Common::AtomicAdd(_fifo.CPReadWriteDistance, -distToSend); // Execute new instructions found in uData Fifo_SendFifoData(uData, distToSend); - Common::AtomicStore(_fifo.CPReadPointer, readPtr); - Common::AtomicAdd(_fifo.CPReadWriteDistance, -distToSend); + CommandProcessor::FifoCriticalLeave();