diff --git a/pcsx2/Misc.h b/pcsx2/Misc.h index 6da04ee125..407ee91eeb 100644 --- a/pcsx2/Misc.h +++ b/pcsx2/Misc.h @@ -52,14 +52,17 @@ #define CHECK_DUALCORE (Config.Options&PCSX2_DUALCORE) #define CHECK_EEREC (Config.Options&PCSX2_EEREC) #define CHECK_COP2REC (Config.Options&PCSX2_COP2REC) // goes with ee option -//------------ SPEED HACKS!!! --------------- +//------------ SPEED/MISC HACKS!!! --------------- #define CHECK_OVERFLOW (!(Config.Hacks & 0x2)) #define CHECK_EXTRA_OVERFLOW (Config.Hacks & 0x40) // If enabled, Operands are checked for infinities before being used in the VU recs #define CHECK_EESYNC_HACK (Config.Hacks & 0x1) #define CHECK_IOPSYNC_HACK (Config.Hacks & 0x10) #define CHECK_EE_IOP_EXTRA (Config.Hacks & 0x20) -#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_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_FRAMELIMIT (Config.Options&PCSX2_FRAMELIMIT_MASK) diff --git a/pcsx2/windows/WinMain.c b/pcsx2/windows/WinMain.c index 374fb78854..b5379b208f 100644 --- a/pcsx2/windows/WinMain.c +++ b/pcsx2/windows/WinMain.c @@ -728,6 +728,9 @@ BOOL APIENTRY HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { if(Config.Hacks & 0x20) CheckDlgButton(hDlg, IDC_SYNCHACK3, TRUE); 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); + return TRUE; case WM_COMMAND: @@ -741,6 +744,8 @@ BOOL APIENTRY HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_SYNCHACK3) ? 0x20 : 0; 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; SaveConfig(); diff --git a/pcsx2/windows/pcsx2.rc b/pcsx2/windows/pcsx2.rc index 74d513978d..be5d340e26 100644 --- a/pcsx2/windows/pcsx2.rc +++ b/pcsx2/windows/pcsx2.rc @@ -938,18 +938,18 @@ BEGIN CONTROL 132,IDC_PS2SILVER_RECT,"Static",SS_BITMAP,0,167,70,74 END -IDD_HACKS DIALOGEX 0, 0, 405, 251 +IDD_HACKS DIALOGEX 0, 0, 406, 273 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PCSX2 Speed Hacks" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - DEFPUSHBUTTON "OK",IDOK,146,230,50,14 - PUSHBUTTON "Cancel",IDCANCEL,202,230,50,14 + DEFPUSHBUTTON "OK",IDOK,146,252,50,14 + PUSHBUTTON "Cancel",IDCANCEL,202,252,50,14 CONTROL "EE Sync Hack (x2) - Doubles the cycle rate of the EE.",IDC_SYNCHACK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,114,252,10 CONTROL "Disable All Overflow Checks - Doesn't check for overflow at all in the VU Recs.",IDC_OVERFLOWHACK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,63,373,10 - CTEXT "These hacks will effect the speed of PCSX2 but possibly comprimise on compatability",IDC_HACKDESC,7,7,391,8 + CTEXT "These hacks will effect the speed of PCSX2 but possibly comprimise on compatability",IDC_HACKDESC,7,7,392,8 CONTROL "Tighter SPU2 Sync ( FFXII vids) - Slower, not useful anymore.",IDC_SOUNDHACK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,197,323,10 CONTROL "IOP Sync Hack (x2) - Doubles the cycle rate of the IOP.",IDC_SYNCHACK2, @@ -960,12 +960,16 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,50,377,10 CONTROL "EE/IOP Fast Branches - Quick branching ( Very small speedup, use only when you need every fps! )",IDC_FASTBRANCHES, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,183,351,10 - CTEXT "If you have problems, disable all these and try again",IDC_STATIC,7,22,391,8 - GROUPBOX "Overflow and Underflow",IDC_STATIC,7,36,391,60 + CTEXT "If you have problems, disable all these and try again",IDC_STATIC,7,22,392,8 + GROUPBOX "Overflow and Underflow",IDC_STATIC,7,36,392,60 CONTROL "Denormals are Zero - Makes very small numbers equal zero. ( Big speedup on Intel CPUs ) ( Needs Restart! )",IDC_DENORMALS, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,76,377,10 - GROUPBOX "Sync Hacks",IDC_STATIC,7,101,391,59 - GROUPBOX "Miscellaneous",IDC_STATIC,7,168,391,46 + 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 END @@ -986,9 +990,9 @@ BEGIN IDD_HACKS, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 398 + RIGHTMARGIN, 399 TOPMARGIN, 7 - BOTTOMMARGIN, 244 + BOTTOMMARGIN, 266 END END #endif // APSTUDIO_INVOKED diff --git a/pcsx2/windows/resource.h b/pcsx2/windows/resource.h index 7b45d766ef..eb6e17c1c5 100644 --- a/pcsx2/windows/resource.h +++ b/pcsx2/windows/resource.h @@ -606,7 +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_LOG 1500 #define IDC_CPULOG 1500 #define IDC_MEMLOG 1501 diff --git a/pcsx2/x86/iVUmicro.c b/pcsx2/x86/iVUmicro.c index 6bca9d7825..85f0a8aadc 100644 --- a/pcsx2/x86/iVUmicro.c +++ b/pcsx2/x86/iVUmicro.c @@ -3351,12 +3351,12 @@ void recVUMI_MAXw(VURegs *VU, int info) { recVUMI_MAX_xyzw(VU, 3, info); } void recVUMI_MINI(VURegs *VU, int info) { if ( _Fd_ == 0 ) return; - if (CHECK_EXTRA_OVERFLOW) { - vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W); - vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W); - } if( _X_Y_Z_W == 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,6 +3365,10 @@ 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); + } SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S); SSE_MINPS_XMM_to_XMM(EEREC_TEMP, EEREC_T); @@ -3372,16 +3376,28 @@ void recVUMI_MINI(VURegs *VU, int info) } else { if( EEREC_D == EEREC_S ) { - // need for GT4 vu0rec - //ClampUnordered(EEREC_T, EEREC_TEMP, 0); + 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); + } SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_T); } else if( EEREC_D == EEREC_T ) { - // need for GT4 vu0rec - //ClampUnordered(EEREC_S, EEREC_TEMP, 0); + 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); + } 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); } @@ -3664,7 +3680,7 @@ void recVUMI_CLIP(VURegs *VU, int info) x86temp1 = ALLOCTEMPX86(MODE_8BITREG); x86temp2 = ALLOCTEMPX86(MODE_8BITREG); - if ( (x86temp1 == 0) || (x86temp2 == 0) ) SysPrintf("VU CLIP Allocation Error: EAX being allocated!"); + //if ( (x86temp1 == 0) || (x86temp2 == 0) ) SysPrintf("VU CLIP Allocation Error: EAX being allocated! \n"); if( _Ft_ == 0 ) { // all 1s @@ -3699,9 +3715,11 @@ void recVUMI_CLIP(VURegs *VU, int info) AND32ItoR(EAX, 0xffffff); MOV32RtoM(clipaddr, EAX); - MOV32RtoM((uptr)&VU->VI[REG_CLIP_FLAG], EAX); - //if( !(info&(PROCESS_VU_SUPER|PROCESS_VU_COP2)) ) MOV32RtoM((uptr)&VU->VI[REG_CLIP_FLAG], EAX); + // God of War needs this additional move, but it breaks Rockstar games; ideally this hack shouldn't be needed, i think its a clipflag allocation bug in iVUzerorec.cpp + if ( ( CHECK_VUCLIPHACK ) || ( !(info & (PROCESS_VU_SUPER|PROCESS_VU_COP2)) ) ) + MOV32RtoM((uptr)&VU->VI[REG_CLIP_FLAG], EAX); + //_freeXMMreg(t1reg); // We Never Allocated these regs, so no need to free them //_freeXMMreg(t2reg);