Index: common/include/Pcsx2Config.h =================================================================== --- common/include/Pcsx2Config.h (revision 977) +++ common/include/Pcsx2Config.h (working copy) @@ -137,6 +137,7 @@ int Patch; int CustomFps; int Hacks; + int VUCycleHack; int GameFixes; int CustomFrameSkip; int CustomConsecutiveFrames; Index: pcsx2/Linux/Pref.cpp =================================================================== --- pcsx2/Linux/Pref.cpp (revision 977) +++ pcsx2/Linux/Pref.cpp (working copy) @@ -101,6 +101,9 @@ #endif GetValuel("Options", Config.Options); GetValuel("Hacks", Config.Hacks); + GetValuel("VUCycleHack", Config.VUCycleHack); + if (Config.VUCycleHack < 0 || Config.VUCycleHack > 4) + Config.VUCycleHack = 0; GetValuel("Fixes", Config.GameFixes); GetValuel("CustomFps", Config.CustomFps); @@ -163,6 +166,7 @@ SetValuel("Options", Config.Options); SetValuel("Hacks", Config.Hacks); + SetValuel("VUCycleHack", Config.VUCycleHack); SetValuel("Fixes", Config.GameFixes); SetValuel("Patch", Config.Patch); Index: pcsx2/windows/HacksDlg.cpp =================================================================== --- pcsx2/windows/HacksDlg.cpp (revision 977) +++ pcsx2/windows/HacksDlg.cpp (working copy) @@ -19,6 +19,23 @@ #include "win32.h" +static _TCHAR *VUCycleHackLevels[] = { + _T("Speedup for 3D games.\nCurrently off"), + _T("Slight speedup for 3D geometry, should work with most games."), + _T("Moderate speedup for 3D geometry, should work with most games with minor problems."), + _T("Large speedup for 3D geometry, may break many games and make others skip frames."), + _T("Very large speedup for 3D geometry, will break games in interesting ways."), +}; + +static void CheckVUCycleHack(HWND hDlg, int &vucyclehack) +{ + if (vucyclehack < 0 || vucyclehack > 4) { + vucyclehack = 0; + SendDlgItemMessage(hDlg, IDC_VUCYCLE, TBM_SETPOS, TRUE, vucyclehack); + } + SetDlgItemText(hDlg, IDC_VUCYCLEDESC, VUCycleHackLevels[vucyclehack]); +} + BOOL APIENTRY HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { @@ -31,8 +48,26 @@ if(CHECK_INTC_STAT_HACK) CheckDlgButton(hDlg, IDC_INTCSTATHACK, TRUE); if(CHECK_ESCAPE_HACK) CheckDlgButton(hDlg, IDC_ESCHACK, TRUE); + SendDlgItemMessage(hDlg, IDC_VUCYCLE, TBM_SETRANGE, TRUE, MAKELONG(0, 4)); + CheckVUCycleHack(hDlg, Config.VUCycleHack); + SendDlgItemMessage(hDlg, IDC_VUCYCLE, TBM_SETPOS, TRUE, Config.VUCycleHack); + return TRUE; + case WM_HSCROLL: { + HWND slider = (HWND)lParam; + int curpos = HIWORD(wParam); + switch (LOWORD(wParam)) { + case TB_THUMBTRACK: + case TB_THUMBPOSITION: + break; + default: + curpos = SendMessage(slider, TBM_GETPOS, 0, 0); + } + CheckVUCycleHack(hDlg, curpos); + return FALSE; + } + case WM_COMMAND: switch (LOWORD(wParam)) { @@ -53,12 +88,16 @@ newhacks |= IsDlgButtonChecked(hDlg, IDC_INTCSTATHACK) << 5; newhacks |= IsDlgButtonChecked(hDlg, IDC_ESCHACK) << 10; + int newvucyclehack = SendDlgItemMessage(hDlg, IDC_VUCYCLE, TBM_GETPOS, 0, 0); + CheckVUCycleHack(hDlg, newvucyclehack); + EndDialog(hDlg, TRUE); - if( newhacks != Config.Hacks ) + if( newhacks != Config.Hacks || newvucyclehack != Config.VUCycleHack) { SysRestorableReset(); Config.Hacks = newhacks; + Config.VUCycleHack = newvucyclehack; SaveConfig(); } } Index: pcsx2/windows/ini.cpp =================================================================== --- pcsx2/windows/ini.cpp (revision 977) +++ pcsx2/windows/ini.cpp (working copy) @@ -223,6 +223,9 @@ Entry( "eeOptions", Conf.eeOptions, DEFAULT_eeOptions ); Entry( "vuOptions", Conf.vuOptions, DEFAULT_vuOptions ); Entry( "SpeedHacks", Conf.Hacks ); + Entry( "VUCycleHack", Conf.VUCycleHack, 0 ); + if (Conf.VUCycleHack < 0 || Conf.VUCycleHack > 4) + Conf.VUCycleHack = 0; } ////////////////////////////////////////////////////////////////////////////////////////// Index: pcsx2/windows/pcsx2.rc =================================================================== --- pcsx2/windows/pcsx2.rc (revision 977) +++ pcsx2/windows/pcsx2.rc (working copy) @@ -371,6 +371,9 @@ LTEXT "Moderate speedup and works well with most games.",IDC_STATIC,25,90,129,19 CONTROL "INTC Sync Hack (experimental)",IDC_INTCSTATHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,43,127,10 LTEXT "Huge speedup in many games, and a pretty high compatibility rate (some games still work better with EE sync hacks).",IDC_STATIC,186,55,140,28 + CONTROL "",IDC_VUCYCLE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,174,176,36,15 + LTEXT "This space intentionally left blank",IDC_VUCYCLEDESC,186,194,142,30 + LTEXT "VU Cycle Stealing (experimental)",IDC_STATIC,210,180,105,8 END @@ -393,6 +396,8 @@ LEFTMARGIN, 7 RIGHTMARGIN, 328 VERTGUIDE, 13 + VERTGUIDE, 174 + VERTGUIDE, 186 TOPMARGIN, 7 BOTTOMMARGIN, 256 END Index: pcsx2/windows/resource.h =================================================================== --- pcsx2/windows/resource.h (revision 977) +++ pcsx2/windows/resource.h (working copy) @@ -272,6 +272,9 @@ #define IDC_MCD_LABEL2 1325 #define IDC_INTCSTATHACK 1326 #define IDC_EE_CHECK3 1327 +#define IDC_SLIDER1 1327 +#define IDC_VUCYCLE 1327 +#define IDC_VUCYCLEDESC 1328 #define IDC_CPULOG 1500 #define IDC_MEMLOG 1501 #define IDC_HWLOG 1502 @@ -405,7 +408,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 141 #define _APS_NEXT_COMMAND_VALUE 40018 -#define _APS_NEXT_CONTROL_VALUE 1326 +#define _APS_NEXT_CONTROL_VALUE 1329 #define _APS_NEXT_SYMED_VALUE 104 #endif #endif Index: pcsx2/x86/iVUzerorec.cpp =================================================================== --- pcsx2/x86/iVUzerorec.cpp (revision 977) +++ pcsx2/x86/iVUzerorec.cpp (working copy) @@ -2294,6 +2294,7 @@ VU = vuindex ? &VU1 : &VU0; VU->cycle += s_TotalVUCycles; + cpuRegs.cycle += s_TotalVUCycles * Config.VUCycleHack; if( (int)s_writeQ > 0 ) VU->VI[REG_Q] = VU->q; if( (int)s_writeP > 0 ) { assert(VU == &VU1);