summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/CommandProcessor.cpp
diff options
context:
space:
mode:
authorMarcos Vitali <marcosvitali@gmail.com>2011-02-13 15:08:37 +0000
committerMarcos Vitali <marcosvitali@gmail.com>2011-02-13 15:08:37 +0000
commitbe193088cac02d969b5ea2124fde76148b0480e9 (patch)
treee3bb0873fe7f7044d2184a4152153fd457d2c3e0 /Source/Core/VideoCommon/Src/CommandProcessor.cpp
parentc30859dae04ac7bec4548bb4be61ce36054486f8 (diff)
- FIX RE0 GFX fifo errors :D
- This game read the CPRead pointer when the GP is processing data and after detach the fifo and attach again an use this pointer for continue, so implement fifo.SafeCPReadPointer pointer. - fifo.SafeCPReadPointer is updated when (FAKE_GetFifoEndPtr() - g_pVideoData) == 0) to have a pointer without GFX Commands Cut in the beginning of 32 block. - Reset video buffer when the CPReadWriteDistance is written by the software. - This commit is experimental please test a lot your games. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7165 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/CommandProcessor.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/CommandProcessor.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp
index a8ee3c8df6..05ebd1ede2 100644
--- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp
+++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp
@@ -284,13 +284,19 @@ void Read16(u16& _rReturnValue, const u32 _Address)
return;
case FIFO_READ_POINTER_LO:
- _rReturnValue = ReadLow (fifo.CPReadPointer);
+ if (IsOnThread())
+ _rReturnValue = ReadLow (fifo.SafeCPReadPointer);
+ else
+ _rReturnValue = ReadLow (fifo.CPReadPointer);
// hack: CPU will always believe fifo is empty and on idle
//_rReturnValue = ReadLow (fifo.CPWritePointer);
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_READ_POINTER_LO : %04x", _rReturnValue);
return;
case FIFO_READ_POINTER_HI:
- _rReturnValue = ReadHigh(fifo.CPReadPointer);
+ if (IsOnThread())
+ _rReturnValue = ReadHigh (fifo.SafeCPReadPointer);
+ else
+ _rReturnValue = ReadHigh (fifo.CPReadPointer);
// hack: CPU will always believe fifo is empty and on idle
//_rReturnValue = ReadHigh(fifo.CPWritePointer);
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_READ_POINTER_HI : %04x", _rReturnValue);
@@ -614,8 +620,11 @@ void Write16(const u16 _Value, const u32 _Address)
{
GPFifo::ResetGatherPipe();
ResetVideoBuffer();
- IncrementCheckContextId();
- }
+ }else
+ {
+ ResetVideoBuffer();
+ }
+ IncrementCheckContextId();
DEBUG_LOG(COMMANDPROCESSOR,"try to write to FIFO_RW_DISTANCE_LO : %04x", _Value);
break;