From d18a21ad37171511691ec0700920ef70f854e7ae Mon Sep 17 00:00:00 2001 From: cottonvibes Date: Fri, 29 Aug 2008 22:32:43 +0000 Subject: [PATCH] okay changed what the GT4 speedhack does. use the Check Extra Overflow + FPU Clamp Hack when running GT4! i might be able to fix the code to not need the hack in the future; but its going to take some major changes :p git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@71 a6443dda-0b58-4228-96e9-037be469359c --- pcsx2/Misc.h | 2 +- pcsx2/windows/WinMain.c | 4 ++-- pcsx2/windows/pcsx2.rc | 6 +++--- pcsx2/windows/resource.h | 4 ++-- pcsx2/x86/iFPU.c | 29 ++++++++++++++++------------- pcsx2/x86/iVUmicro.c | 29 +++++------------------------ 6 files changed, 29 insertions(+), 45 deletions(-) diff --git a/pcsx2/Misc.h b/pcsx2/Misc.h index 407ee91eeb..1874c52201 100644 --- a/pcsx2/Misc.h +++ b/pcsx2/Misc.h @@ -61,7 +61,7 @@ #define CHECK_DENORMALS ((Config.Hacks & 0x8) ? 0xffc0 : 0x7f80) //If enabled, Denormals are Zero for the recs and flush to zero is enabled as well #define CHECK_FASTBRANCHES (Config.Hacks & 0x80) #define CHECK_VUCLIPHACK (Config.Hacks & 0x100) // Special Fix for GoW, updates the clipflag differently in recVUMI_CLIP() (note: turning this hack on, breaks Rockstar games) -#define CHECK_VUMINIHACK (Config.Hacks & 0x200) // Special Fix for GT4, different clamping for recVUMI_MINI() (Note: sets negative infinity to positive fMax when clamping, which the real ps2 doesn't do) +#define CHECK_FPUCLAMPHACK (Config.Hacks & 0x200) // Special Fix for GT4, different clamping for FPU (Note: sets negative infinity to positive fMax when clamping, which the real ps2 doesn't do) #define CHECK_FRAMELIMIT (Config.Options&PCSX2_FRAMELIMIT_MASK) diff --git a/pcsx2/windows/WinMain.c b/pcsx2/windows/WinMain.c index b5379b208f..0c76106ea8 100644 --- a/pcsx2/windows/WinMain.c +++ b/pcsx2/windows/WinMain.c @@ -729,7 +729,7 @@ BOOL APIENTRY HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { if(Config.Hacks & 0x40) CheckDlgButton(hDlg, IDC_OVERFLOWHACK_EXTRA, TRUE); if(Config.Hacks & 0x80) CheckDlgButton(hDlg, IDC_FASTBRANCHES, TRUE); if(Config.Hacks & 0x100) CheckDlgButton(hDlg, IDC_VUCLIPHACK, TRUE); - if(Config.Hacks & 0x200) CheckDlgButton(hDlg, IDC_VUMINIHACK, TRUE); + if(Config.Hacks & 0x200) CheckDlgButton(hDlg, IDC_FPUCLAMPHACK, TRUE); return TRUE; @@ -745,7 +745,7 @@ BOOL APIENTRY HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_OVERFLOWHACK_EXTRA) ? 0x40 : 0; Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_FASTBRANCHES) ? 0x80 : 0; Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_VUCLIPHACK) ? 0x100 : 0; - Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_VUMINIHACK) ? 0x200 : 0; + Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_FPUCLAMPHACK) ? 0x200 : 0; SaveConfig(); diff --git a/pcsx2/windows/pcsx2.rc b/pcsx2/windows/pcsx2.rc index be5d340e26..d3c2570d01 100644 --- a/pcsx2/windows/pcsx2.rc +++ b/pcsx2/windows/pcsx2.rc @@ -967,9 +967,9 @@ BEGIN GROUPBOX "Sync Hacks",IDC_STATIC,7,101,392,59 GROUPBOX "Miscellaneous / Special Game Fixes",IDC_STATIC,7,168,392,76 CONTROL "VU Clip Hack - Special fix for God of War; Breaks Rockstar games!",IDC_VUCLIPHACK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,211,323,10 - CONTROL "VU Mini Hack - Special fix for Grand Turismo 4",IDC_VUMINIHACK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,224,323,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,227,323,10 + CONTROL "FPU Clamp Hack - Special fix for Gran Turismo 4 and possibly other games",IDC_FPUCLAMPHACK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,212,323,10 END diff --git a/pcsx2/windows/resource.h b/pcsx2/windows/resource.h index eb6e17c1c5..3334d95ede 100644 --- a/pcsx2/windows/resource.h +++ b/pcsx2/windows/resource.h @@ -606,10 +606,10 @@ #define IDC_CHECK1 1300 #define IDC_SOUNDHACK 1300 #define IDC_DENORMALS 1301 -#define IDC_SOUNDHACK2 1302 #define IDC_VUCLIPHACK 1302 #define IDC_FRAMELIMIT_OPTIONS 1303 -#define IDC_VUMINIHACK 1303 +#define IDC_VUCLAMPHACK 1303 +#define IDC_FPUCLAMPHACK 1303 #define IDC_LOG 1500 #define IDC_CPULOG 1500 #define IDC_MEMLOG 1501 diff --git a/pcsx2/x86/iFPU.c b/pcsx2/x86/iFPU.c index e620cf033f..83933cec29 100644 --- a/pcsx2/x86/iFPU.c +++ b/pcsx2/x86/iFPU.c @@ -777,24 +777,27 @@ void ClampValues(regd) { } void ClampValues2(regd) { - SSE_MAXSS_M32_to_XMM(regd, (uptr)&g_minvals[0]); - SSE_MINSS_M32_to_XMM(regd, (uptr)&g_maxvals[0]); -/* - int t5reg = _allocTempXMMreg(XMMT_FPS, -1); + if (CHECK_FPUCLAMPHACK) { // This fixes Gran Turismo graphics - SSE_XORPS_XMM_to_XMM(t5reg, t5reg); - SSE_CMPORDSS_XMM_to_XMM(t5reg, regd); + int t5reg = _allocTempXMMreg(XMMT_FPS, -1); - SSE_ORPS_M128_to_XMM(t5reg, (uptr)s_overflowmask); // fixes katamari falling off podium + SSE_XORPS_XMM_to_XMM(t5reg, t5reg); + SSE_CMPORDSS_XMM_to_XMM(t5reg, regd); - SSE_ANDPS_XMM_to_XMM(regd, t5reg); + SSE_ORPS_M128_to_XMM(t5reg, (uptr)s_overflowmask); // fixes katamari falling off podium - // not necessary since above ORPS handles that (i think) Lets enable it for now ;) - SSE_MAXSS_M32_to_XMM(regd, (uptr)&g_minvals[0]); - SSE_MINSS_M32_to_XMM(regd, (uptr)&g_maxvals[0]); + SSE_ANDPS_XMM_to_XMM(regd, t5reg); - _freeXMMreg(t5reg); -*/ + // not necessary since above ORPS handles that (i think) Lets enable it for now ;) + SSE_MAXSS_M32_to_XMM(regd, (uptr)&g_minvals[0]); + SSE_MINSS_M32_to_XMM(regd, (uptr)&g_maxvals[0]); + + _freeXMMreg(t5reg); + } + else { + SSE_MAXSS_M32_to_XMM(regd, (uptr)&g_minvals[0]); + SSE_MINSS_M32_to_XMM(regd, (uptr)&g_maxvals[0]); + } } static void (*recComOpXMM_to_XMM[] )(x86SSERegType, x86SSERegType) = { diff --git a/pcsx2/x86/iVUmicro.c b/pcsx2/x86/iVUmicro.c index 85f0a8aadc..c6b228e404 100644 --- a/pcsx2/x86/iVUmicro.c +++ b/pcsx2/x86/iVUmicro.c @@ -3353,10 +3353,7 @@ void recVUMI_MINI(VURegs *VU, int info) if ( _Fd_ == 0 ) return; if( _X_Y_Z_W == 8 ) { - if (CHECK_EXTRA_OVERFLOW) { - vuFloat2( EEREC_S, EEREC_TEMP, 8); - vuFloat2( EEREC_T, EEREC_TEMP, 8); - } + if (CHECK_EXTRA_OVERFLOW) { vuFloat2( EEREC_S, EEREC_TEMP, 8); vuFloat2( EEREC_T, EEREC_TEMP, 8); } if (EEREC_D == EEREC_S) SSE_MINSS_XMM_to_XMM(EEREC_D, EEREC_T); else if (EEREC_D == EEREC_T) SSE_MINSS_XMM_to_XMM(EEREC_D, EEREC_S); else { @@ -3365,39 +3362,23 @@ void recVUMI_MINI(VURegs *VU, int info) } } else if (_X_Y_Z_W != 0xf) { - if (CHECK_EXTRA_OVERFLOW) { - vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W); - vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W); - } + if (CHECK_EXTRA_OVERFLOW) { vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W); vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W); } SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S); SSE_MINPS_XMM_to_XMM(EEREC_TEMP, EEREC_T); VU_MERGE_REGS(EEREC_D, EEREC_TEMP); } else { + if (CHECK_EXTRA_OVERFLOW) { vuFloat2( EEREC_S, EEREC_TEMP, 0xf); vuFloat2( EEREC_T, EEREC_TEMP, 0xf); } if( EEREC_D == EEREC_S ) { - if (CHECK_VUMINIHACK) - ClampUnordered(EEREC_T, EEREC_TEMP, 0); // need for GT4 vu0rec - else if (CHECK_EXTRA_OVERFLOW) { - vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W); - vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W); - } + //ClampUnordered(EEREC_T, EEREC_TEMP, 0); // need for GT4 vu0rec SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_T); } else if( EEREC_D == EEREC_T ) { - if (CHECK_VUMINIHACK) - ClampUnordered(EEREC_S, EEREC_TEMP, 0); // need for GT4 vu0rec - else if (CHECK_EXTRA_OVERFLOW) { - vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W); - vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W); - } + //ClampUnordered(EEREC_S, EEREC_TEMP, 0); // need for GT4 vu0rec SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_S); } else { - if (CHECK_EXTRA_OVERFLOW) { - vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W); - vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W); - } SSE_MOVAPS_XMM_to_XMM(EEREC_D, EEREC_S); SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_T); }