From f0adc3adb46cb74b71bc2c95d82a4c0662f65d9a Mon Sep 17 00:00:00 2001 From: Marcos Vitali Date: Tue, 8 Feb 2011 01:11:11 +0000 Subject: [PATCH] Speed back to dolpihn: - Revert Read16 CPRead fifo hack for fix RE0. This hack only solve RE0 but brings slowdown in games like RE Umbrella, etc. - Move isFifoBusy again in the fifo loop and use s_fifoIdleEvent for AbortFrame. Note: if you can play RE0 only deactivate PanicAlert. These opdecoding error seems harmless. Some day this wiil be fixed in right way. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7107 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/VideoCommon/Src/CommandProcessor.cpp | 16 +++++----------- Source/Core/VideoCommon/Src/Fifo.cpp | 5 +++-- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp index efc0c35ed9..bdafa67fc1 100644 --- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp @@ -288,15 +288,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; @@ -503,11 +503,6 @@ void Write16(const u16 _Value, const u32 _Address) if (!tmpCtrl.ClearFifoUnderflow && tmpCtrl.ClearFifoOverflow) bProcessFifoToLoWatemark = true; - if (tmpCtrl.ClearFifoUnderflow && tmpCtrl.ClearFifoOverflow) - ProcessFifoAllDistance(); - - if (!tmpCtrl.ClearFifoUnderflow && !tmpCtrl.ClearFifoOverflow) - ProcessFifoAllDistance(); } else { @@ -814,8 +809,7 @@ void SetFifoIdleFromVideoPlugin() void AbortFrame() { fifo.bFF_GPReadEnable = false; - while (CommandProcessor::isFifoBusy) - Common::YieldCPU(); + s_fifoIdleEvent.Wait(); GPFifo::ResetGatherPipe(); ResetVideoBuffer(); fifo.CPReadPointer = fifo.CPWritePointer; diff --git a/Source/Core/VideoCommon/Src/Fifo.cpp b/Source/Core/VideoCommon/Src/Fifo.cpp index 0bfb21c18b..fa0a375b01 100644 --- a/Source/Core/VideoCommon/Src/Fifo.cpp +++ b/Source/Core/VideoCommon/Src/Fifo.cpp @@ -179,10 +179,11 @@ void Fifo_EnterLoop() // This call is pretty important in DualCore mode and must be called in the FIFO Loop. // If we don't, s_swapRequested or s_efbAccessRequested won't be set to false // leading the CPU thread to wait in Video_BeginField or Video_AccessEFB thus slowing things down. - VideoFifo_CheckAsyncRequest(); + VideoFifo_CheckAsyncRequest(); + CommandProcessor::isFifoBusy = false; } - CommandProcessor::isFifoBusy = false; + CommandProcessor::SetFifoIdleFromVideoPlugin(); if (EmuRunning)