diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp index a45b63f989..d19192db38 100644 --- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp @@ -83,6 +83,7 @@ #include "HW/ProcessorInterface.h" #include "HW/GPFifo.h" #include "HW/Memmap.h" +#include "DLCache.h" namespace CommandProcessor { @@ -826,6 +827,7 @@ void AbortFrame() PixelEngine::ResetSetToken(); PixelEngine::ResetSetFinish(); fifo.bFF_GPReadEnable = true; + IncrementCheckContextId(); } void SetOverflowStatusFromGatherPipe() @@ -858,8 +860,11 @@ void SetStatus() { if (!fifo.bFF_Breakpoint) + { INFO_LOG(COMMANDPROCESSOR, "Hit breakpoint at %i", fifo.CPReadPointer); - fifo.bFF_Breakpoint = true; + fifo.bFF_Breakpoint = true; + IncrementCheckContextId(); + } } else { diff --git a/Source/Core/VideoCommon/Src/DLCache.cpp b/Source/Core/VideoCommon/Src/DLCache.cpp index d7cd27952b..9f8df67951 100644 --- a/Source/Core/VideoCommon/Src/DLCache.cpp +++ b/Source/Core/VideoCommon/Src/DLCache.cpp @@ -49,10 +49,6 @@ using namespace Gen; namespace DLCache { -// Currently just recompiles the DLs themselves, doesn't bother with the vertex data. -// The speed boost is pretty small. The real big boost will come when we also store -// vertex arrays in the cached DLs. - enum DisplayListPass { DLPASS_ANALYZE, DLPASS_COMPILE, @@ -578,7 +574,7 @@ void CompileAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) numVertices); u8* EndAddress = VertexManager::s_pCurBufferPointer; u32 Vdatasize = (u32)(EndAddress - StartAddress); - if (size > 0) + if (size > 0 && numVertices > 0) { // Compile ReferencedDataRegion* NewRegion = new ReferencedDataRegion; @@ -735,17 +731,17 @@ bool HandleDisplayList(u32 address, u32 size) break; case DLCache::DLPASS_RUN: { - // Every N draws, check hash + bool DlistChanged = false; if (dl.check != CheckContextId) { dl.check = CheckContextId; - if (dl.dl_hash != GetHash64(Memory::GetPointer(address), size, 0) || !dl.CheckRegions()) - { - dl.uncachable = true; - dl.check = 60; - dl.ClearRegions(); - return false; - } + DlistChanged = !dl.CheckRegions() || dl.dl_hash != GetHash64(Memory::GetPointer(address), size, 0); + } + if (DlistChanged) + { + dl.uncachable = true; + dl.ClearRegions(); + return false; } dl.frame_count= frameCount; u8 *old_datareader = g_pVideoData; diff --git a/Source/Core/VideoCommon/Src/PixelEngine.cpp b/Source/Core/VideoCommon/Src/PixelEngine.cpp index a5584d5817..cf7d0da83e 100644 --- a/Source/Core/VideoCommon/Src/PixelEngine.cpp +++ b/Source/Core/VideoCommon/Src/PixelEngine.cpp @@ -30,7 +30,7 @@ #include "PixelEngine.h" #include "CommandProcessor.h" #include "HW/ProcessorInterface.h" - +#include "DLCache.h" namespace PixelEngine { @@ -324,7 +324,6 @@ void UpdateTokenInterrupt(bool active) void UpdateFinishInterrupt(bool active) { - if(interruptSetFinish != active) { ProcessorInterface::SetInterrupt(INT_CAUSE_PE_FINISH, active); @@ -346,6 +345,7 @@ void SetToken_OnMainThread(u64 userdata, int cyclesLate) INFO_LOG(PIXELENGINE, "VIDEO Plugin raises INT_CAUSE_PE_TOKEN (btw, token: %04x)", CommandProcessor::fifo.PEToken); UpdateInterrupts(); CommandProcessor::interruptTokenWaiting = false; + IncrementCheckContextId(); //} //else // LOGV(PIXELENGINE, 1, "VIDEO Plugin wrote token: %i", CommandProcessor::fifo.PEToken); @@ -380,6 +380,7 @@ void SetToken(const u16 _token, const int _bSetTokenAcknowledge) // 4-byte padded. Common::AtomicStore(*(volatile u32*)&CommandProcessor::fifo.PEToken, _token); } + IncrementCheckContextId(); } // SetFinish @@ -390,6 +391,7 @@ void SetFinish() CommandProcessor::interruptFinishWaiting = true; CoreTiming::ScheduleEvent_Threadsafe(0, et_SetFinishOnMainThread, 0); INFO_LOG(PIXELENGINE, "VIDEO Set Finish"); + IncrementCheckContextId(); } //This function is used in CommandProcessor when write CTRL_REGISTER and the new fifo is attached.