From 50872438e9f71a70240581fd1033c8e89a0ff842 Mon Sep 17 00:00:00 2001 From: refractionpcsx2 Date: Thu, 2 Nov 2023 11:14:28 +0000 Subject: [PATCH] VU: scale VU0 cycle rate with EE Also fix cycle underflow issue --- pcsx2/x86/microVU.h | 2 +- pcsx2/x86/microVU_Compile.inl | 26 ++++++++++++++++++++++++++ pcsx2/x86/microVU_Execute.inl | 4 ++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/pcsx2/x86/microVU.h b/pcsx2/x86/microVU.h index 469b3d3e46..8c5ff8efdc 100644 --- a/pcsx2/x86/microVU.h +++ b/pcsx2/x86/microVU.h @@ -135,7 +135,7 @@ struct microVU u32 p; // Holds current P instance index u32 q; // Holds current Q instance index u32 totalCycles; // Total Cycles that mVU is expected to run for - u32 cycles; // Cycles Counter + s32 cycles; // Cycles Counter VURegs& regs() const { return ::vuRegs[index]; } diff --git a/pcsx2/x86/microVU_Compile.inl b/pcsx2/x86/microVU_Compile.inl index 9629804fb8..9c2b8db67c 100644 --- a/pcsx2/x86/microVU_Compile.inl +++ b/pcsx2/x86/microVU_Compile.inl @@ -464,6 +464,32 @@ void mVUtestCycles(microVU& mVU, microFlagCycles& mFC) { iPC = mVUstartPC; + if (isVU0 && EmuConfig.Speedhacks.EECycleRate != 0) + { + switch (std::min(static_cast(EmuConfig.Speedhacks.EECycleRate), static_cast(mVUcycles))) + { + case -3: // 50% + mVUcycles *= 2.0f; + break; + case -2: // 60% + mVUcycles *= 1.6666667f; + break; + case -1: // 75% + mVUcycles *= 1.3333333f; + break; + case 1: // 130% + mVUcycles /= 1.3f; + break; + case 2: // 180% + mVUcycles /= 1.8f; + break; + case 3: // 300% + mVUcycles /= 3.0f; + break; + default: + break; + } + } xMOV(eax, ptr32[&mVU.cycles]); if (EmuConfig.Gamefixes.VUSyncHack) xSUB(eax, mVUcycles); // Running behind, make sure we have time to run the block diff --git a/pcsx2/x86/microVU_Execute.inl b/pcsx2/x86/microVU_Execute.inl index 6484cb78a7..e43caa39d6 100644 --- a/pcsx2/x86/microVU_Execute.inl +++ b/pcsx2/x86/microVU_Execute.inl @@ -355,12 +355,12 @@ _mVUt void mVUcleanUp() mVUreset(mVU, false); } - mVU.cycles = mVU.totalCycles - mVU.cycles; + mVU.cycles = mVU.totalCycles - std::max(0, mVU.cycles); mVU.regs().cycle += mVU.cycles; if (!vuIndex || !THREAD_VU1) { - u32 cycles_passed = std::min(mVU.cycles, 3000u) * EmuConfig.Speedhacks.EECycleSkip; + u32 cycles_passed = std::min(mVU.cycles, 3000) * EmuConfig.Speedhacks.EECycleSkip; if (cycles_passed > 0) { s32 vu0_offset = VU0.cycle - cpuRegs.cycle;