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
This commit is contained in:
cottonvibes 2008-08-29 22:32:43 +00:00 committed by Gregory Hainaut
parent 49459b16bd
commit d18a21ad37
6 changed files with 29 additions and 45 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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