From 0dcf8242f52ccf559edaf304d51e337ee61fd18d Mon Sep 17 00:00:00 2001 From: LunaMoo Date: Sat, 2 Jul 2022 19:14:05 +0200 Subject: [PATCH] Add Fixed60FPShack for GOW, should work smoother than the ForceMax60FPS. Also more stable than it's CWCheat version, unfortunately because of that, still causes softlock in GOW:GOS vortex stage. --- Core/Compatibility.cpp | 1 + Core/Compatibility.h | 1 + Core/HLE/ReplaceTables.cpp | 10 ++++++++++ Core/HLE/sceDisplay.cpp | 4 ++++ Core/HLE/sceDisplay.h | 1 + Core/MIPS/MIPSAnalyst.cpp | 1 + assets/compat.ini | 12 +++++++----- 7 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Core/Compatibility.cpp b/Core/Compatibility.cpp index db48c4f4c9..c38251e9d3 100644 --- a/Core/Compatibility.cpp +++ b/Core/Compatibility.cpp @@ -66,6 +66,7 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) { CheckSetting(iniFile, gameID, "YugiohSaveFix", &flags_.YugiohSaveFix); CheckSetting(iniFile, gameID, "ForceUMDDelay", &flags_.ForceUMDDelay); CheckSetting(iniFile, gameID, "ForceMax60FPS", &flags_.ForceMax60FPS); + CheckSetting(iniFile, gameID, "Fixed60FPShack", &flags_.Fixed60FPShack); CheckSetting(iniFile, gameID, "JitInvalidationHack", &flags_.JitInvalidationHack); CheckSetting(iniFile, gameID, "HideISOFiles", &flags_.HideISOFiles); CheckSetting(iniFile, gameID, "MoreAccurateVMMUL", &flags_.MoreAccurateVMMUL); diff --git a/Core/Compatibility.h b/Core/Compatibility.h index 9340c36411..058bd19b39 100644 --- a/Core/Compatibility.h +++ b/Core/Compatibility.h @@ -65,6 +65,7 @@ struct CompatFlags { bool YugiohSaveFix; bool ForceUMDDelay; bool ForceMax60FPS; + bool Fixed60FPShack; bool JitInvalidationHack; bool HideISOFiles; bool MoreAccurateVMMUL; diff --git a/Core/HLE/ReplaceTables.cpp b/Core/HLE/ReplaceTables.cpp index 039c26ecc4..61a0bdbe52 100644 --- a/Core/HLE/ReplaceTables.cpp +++ b/Core/HLE/ReplaceTables.cpp @@ -25,6 +25,7 @@ #include "Common/Log.h" #include "Common/Swap.h" #include "Core/Config.h" +#include "Core/System.h" #include "Core/Debugger/Breakpoints.h" #include "Core/Debugger/MemBlockInfo.h" #include "Core/Debugger/SymbolMap.h" @@ -34,6 +35,7 @@ #include "Core/MIPS/MIPSAnalyst.h" #include "Core/HLE/ReplaceTables.h" #include "Core/HLE/FunctionWrappers.h" +#include "Core/HLE/sceDisplay.h" #include "GPU/Math3D.h" #include "GPU/GPU.h" @@ -1338,6 +1340,13 @@ static int Hook_soltrigger_render_ucschar() { return 0; } +static int Hook_gow_fps_hack() { + if (PSP_CoreParameter().compat.flags().Fixed60FPShack) { + __DisplayWaitForVblanks("vblank start waited", 1); + } + return 0; +} + #define JITFUNC(f) (&MIPSComp::MIPSFrontendInterface::f) // Can either replace with C functions or functions emitted in Asm/ArmAsm. @@ -1454,6 +1463,7 @@ static const ReplacementTableEntry entries[] = { { "worms_copy_normalize_alpha", &Hook_worms_copy_normalize_alpha, 0, REPFLAG_HOOKENTER, 0x0CC }, { "openseason_data_decode", &Hook_openseason_data_decode, 0, REPFLAG_HOOKENTER, 0x2F0 }, { "soltrigger_render_ucschar", &Hook_soltrigger_render_ucschar, 0, REPFLAG_HOOKENTER, 0 }, + { "gow_fps_hack", &Hook_gow_fps_hack, 0, REPFLAG_HOOKEXIT , 0 }, {} }; diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 3ebd210469..8cc22e65a2 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -730,6 +730,10 @@ static int DisplayWaitForVblanks(const char *reason, int vblanks, bool callbacks return hleLogSuccessVerboseI(SCEDISPLAY, 0, "waiting for %d vblanks", vblanks); } +void __DisplayWaitForVblanks(const char* reason, int vblanks, bool callbacks) { + DisplayWaitForVblanks(reason, vblanks, callbacks); +} + static u32 sceDisplaySetMode(int displayMode, int displayWidth, int displayHeight) { if (displayMode != PSP_DISPLAY_MODE_LCD || displayWidth != 480 || displayHeight != 272) { WARN_LOG_REPORT(SCEDISPLAY, "Video out requested, not supported: mode=%d size=%d,%d", displayMode, displayWidth, displayHeight); diff --git a/Core/HLE/sceDisplay.h b/Core/HLE/sceDisplay.h index f1911a49ec..bb134af815 100644 --- a/Core/HLE/sceDisplay.h +++ b/Core/HLE/sceDisplay.h @@ -33,3 +33,4 @@ void __DisplaySetFramebuf(u32 topaddr, int linesize, int pixelformat, int sync); void __DisplaySetWasPaused(); void Register_sceDisplay_driver(); +void __DisplayWaitForVblanks(const char* reason, int vblanks, bool callbacks = false); diff --git a/Core/MIPS/MIPSAnalyst.cpp b/Core/MIPS/MIPSAnalyst.cpp index 6cc740246a..2822f54847 100644 --- a/Core/MIPS/MIPSAnalyst.cpp +++ b/Core/MIPS/MIPSAnalyst.cpp @@ -507,6 +507,7 @@ static const HardHashTableEntry hardcodedHashes[] = { { 0xfe5dd338ab862291, 216, "memset", }, // Metal Gear Solid: Peace Walker demo { 0xffc8f5f8f946152c, 192, "dl_write_light_color", }, { 0x249a3c5981c73480, 1472, "openseason_data_decode", }, // Open Season + { 0x795d940ad0a605f8, 40, "gow_fps_hack", }, // God of War (all) }; namespace MIPSAnalyst { diff --git a/assets/compat.ini b/assets/compat.ini index f4b6692f23..580d281454 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -802,11 +802,9 @@ ULJS00119 = true ULKS46167 = true NPJH50017 = true -[ForceMax60FPS] -# The GOW games are very heavy and render as fast as they can. They benefit greatly from -# capping the framerate at 60fps. -# Unfortunately causes softlock in GOW:GOS , see #8299 - +[Fixed60FPShack] +# Replaces ForceMax60FPS for GOW games, should provide smoother experience +# Unfortunately just like the latter still causes softlock in GOW:GOS , see #8299 # GOW : Ghost of Sparta # UCUS98737 = true # UCAS40323 = true @@ -840,6 +838,10 @@ UCUS98705 = true UCED00971 = true UCUS98713 = true +[ForceMax60FPS] +# Some games are very heavy and render as fast as they can. They benefit greatly from +# capping the framerate at 60fps. + # F1 2006 has extremely long loading times if we don't limit the framerate. UCES00238 = true UCJS10045 = true