Rockstar games shouldn't have SPS anymore; also added 2 game-specific hacks, one for God of War, and one for Grand Turismo 4 the God of War hack brings back the SPS in the Rockstar games; so only turn it on for God of War.

hopefully we won't need these hacks in the future, once stuff is handled properly :p

git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@66 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
cottonvibes 2008-08-28 21:53:39 +00:00 committed by Gregory Hainaut
parent 09bb4dd533
commit 12d63f137a
5 changed files with 56 additions and 23 deletions

View File

@ -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)

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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);