From 2bcf704ff3c1df0f952b74b9b1c3153affa6f9f5 Mon Sep 17 00:00:00 2001 From: cottonvibes Date: Tue, 28 Jul 2009 01:36:37 +0000 Subject: [PATCH] microVU: Improved microProgram management/searching. Instead of just having live/dead programs, we now have young/old/dead programs. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1578 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/x86/microVU.cpp | 34 +++++++++++++++++++++++----------- pcsx2/x86/microVU.h | 3 ++- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/pcsx2/x86/microVU.cpp b/pcsx2/x86/microVU.cpp index 8b5611a0b7..a4630a3e1e 100644 --- a/pcsx2/x86/microVU.cpp +++ b/pcsx2/x86/microVU.cpp @@ -134,6 +134,7 @@ microVUf(void) mVUclearProg(int progIndex) { microVU* mVU = mVUx; mVUprogI.used = 0; mVUprogI.isDead = 1; + mVUprogI.isOld = 1; mVUprogI.frame = mVU->prog.curFrame; for (int j = 0; j <= mVUprogI.ranges.max; j++) { mVUprogI.ranges.range[j][0] = -1; // Set range to @@ -173,8 +174,9 @@ microVUf(int) mVUfindLeastUsedProg() { if (mVU->prog.prog[i].isDead) { mVU->prog.total++; mVUcacheProg(i); // Cache Micro Program - mVU->prog.prog[i].isDead = 0; - mVU->prog.prog[i].used = 1; + mVU->prog.prog[i].isDead = 0; + mVU->prog.prog[i].isOld = 0; + mVU->prog.prog[i].used = 1; mVUsortProg(mVU, i); Console::Notice("microVU%d: Cached MicroPrograms = [%03d] [%03d]", params vuIndex, i+1, mVU->prog.total+1); return i; @@ -189,14 +191,15 @@ microVUf(int) mVUfindLeastUsedProg() { } mVU->prog.total -= ((mVU->prog.max+1)/4)-1; mVUcacheProg(pIdx); // Cache Micro Program - mVU->prog.prog[pIdx].isDead = 0; - mVU->prog.prog[pIdx].used = 1; + mVU->prog.prog[pIdx].isDead = 0; + mVU->prog.prog[pIdx].isOld = 0; + mVU->prog.prog[pIdx].used = 1; mVUsortProg(mVU, pIdx); Console::Notice("microVU%d: Cached MicroPrograms = [%03d] [%03d]", params vuIndex, pIdx+1, mVU->prog.total+1); return pIdx; } -// Finds and Kills Programs if they haven't been used in a while. +// Finds and Ages/Kills Programs if they haven't been used in a while. microVUt(void) mVUvsyncUpdate(mV) { for (int i = 0; i <= mVU->prog.max; i++) { if (mVU->prog.prog[i].isDead) continue; @@ -204,12 +207,16 @@ microVUt(void) mVUvsyncUpdate(mV) { mVU->prog.prog[i].used = 0; mVU->prog.prog[i].frame = mVU->prog.curFrame; } - if((mVU->prog.curFrame - mVU->prog.prog[i].frame) >= (60 * 7)) { + if((mVU->prog.curFrame - mVU->prog.prog[i].frame) >= (360 * 10)) { mVU->prog.total--; if (!mVU->index) mVUclearProg<0>(i); else mVUclearProg<1>(i); DevCon::Status("microVU%d: Killing Dead Program [%03d]", params mVU->index, i+1); } + else if (!mVU->prog.prog[i].isOld && ((mVU->prog.curFrame - mVU->prog.prog[i].frame) >= (30 * 1))) { + mVU->prog.prog[i].isOld = 1; + //DevCon::Status("microVU%d: Aging Old Program [%03d]", params mVU->index, i+1); + } } mVU->prog.curFrame++; } @@ -227,15 +234,16 @@ microVUf(bool) mVUcmpPartial(int progIndex) { } // Compare Cached microProgram to mVU->regs->Micro -microVUf(bool) mVUcmpProg(int progIndex, const bool cmpWholeProg) { +microVUf(bool) mVUcmpProg(int progIndex, const bool checkOld, const bool cmpWholeProg) { microVU* mVU = mVUx; - if (!mVUprogI.isDead) { + if (!mVUprogI.isDead && (checkOld == mVUprogI.isOld)) { if ((cmpWholeProg && !memcmp_mmx((u8*)mVUprogI.data, mVU->regs->Micro, mVU->microMemSize)) || (!cmpWholeProg && mVUcmpPartial(progIndex))) { mVU->prog.cur = progIndex; mVU->prog.cleared = 0; mVU->prog.isSame = cmpWholeProg ? 1 : -1; - mVU->prog.prog[progIndex].used = 1; + mVU->prog.prog[progIndex].used = 1; + mVU->prog.prog[progIndex].isOld = 0; return 1; } } @@ -247,8 +255,12 @@ microVUf(int) mVUsearchProg() { microVU* mVU = mVUx; if (mVU->prog.cleared) { // If cleared, we need to search for new program for (int i = mVU->prog.max; i >= 0; i--) { - if (mVUcmpProg(mVU->prog.progList[i], 0)) - return 1; + if (mVUcmpProg(mVU->prog.progList[i], 0, 0)) + return 1; // Check Young Programs + } + for (int i = mVU->prog.max; i >= 0; i--) { + if (mVUcmpProg(mVU->prog.progList[i], 1, 0)) + return 1; // Check Old Programs } mVU->prog.cur = mVUfindLeastUsedProg(); // If cleared and program not found, make a new program instance mVU->prog.cleared = 0; diff --git a/pcsx2/x86/microVU.h b/pcsx2/x86/microVU.h index 605d8a9e59..be067f2800 100644 --- a/pcsx2/x86/microVU.h +++ b/pcsx2/x86/microVU.h @@ -110,7 +110,8 @@ struct microProgram { microRange ranges; // The ranges of the microProgram that have already been recompiled u32 frame; // Frame # the program was last used on u32 used; // Program was used this frame? - bool isDead; // Program is dead? + bool isDead; // Program is Dead? + bool isOld; // Program is Old? (Program hasn't been used in a while) }; #define mMaxProg ((mVU->index)?400:8) // The amount of Micro Programs Recs will 'remember' (For n = 1, 2, 4, 8, 16, etc...)