diff --git a/.github/workflows/scripts/lint/gamedb/lint.py b/.github/workflows/scripts/lint/gamedb/lint.py index 64ccdb3992..8fec7cb0a9 100644 --- a/.github/workflows/scripts/lint/gamedb/lint.py +++ b/.github/workflows/scripts/lint/gamedb/lint.py @@ -37,6 +37,7 @@ allowed_game_fixes = [ "VUSyncHack", "VUOverflowHack", "XGKickHack", + "BlitInternalFPSHack", ] allowed_gs_hw_fixes = [ "autoFlush", diff --git a/bin/resources/GameIndex.yaml b/bin/resources/GameIndex.yaml index f3d731a15f..8feec84b23 100644 --- a/bin/resources/GameIndex.yaml +++ b/bin/resources/GameIndex.yaml @@ -8317,6 +8317,8 @@ SLAJ-25072: SLAJ-25073: name: "Resident Evil 4" region: "NTSC-Unk" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLAJ-25075: @@ -10462,6 +10464,8 @@ SLES-50876: name: "Driv3r" region: "PAL-M5" compat: 4 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 SLES-50877: @@ -11791,6 +11795,8 @@ SLES-51510: SLES-51511: name: "Crash Nitro Kart" region: "PAL-M6" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLES-51522: name: "Return to Castle Wolfenstein - Operation Resurrection" region: "PAL-S" @@ -13008,6 +13014,8 @@ SLES-52152: SLES-52153: name: "Driv3r" region: "PAL-E-S" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 SLES-52155: @@ -16131,6 +16139,8 @@ SLES-53553: SLES-53556: name: "Driver - Parallel Lines" region: "PAL-M3" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLES-53557: name: "Need for Speed - Most Wanted" region: "PAL-E" @@ -17264,6 +17274,8 @@ SLES-54023: SLES-54027: name: "Driver - Parallel Lines" region: "PAL-M3" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLES-54030: name: "Black" region: "PAL-E" @@ -20937,6 +20949,8 @@ SLES-82013: name: "Metal Gear Solid 3 - Snake Eater" region: "PAL-E-F" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurry characters. SLES-82018: @@ -20958,11 +20972,15 @@ SLES-82021: SLES-82024: name: "Metal Gear Solid 3 - Snake Eater" region: "PAL-I" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurry characters. SLES-82026: name: "Metal Gear Solid 3 - Snake Eater" region: "PAL-S" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurry characters. SLES-82028: @@ -21002,6 +21020,8 @@ SLES-82031: SLES-82032: name: "Metal Gear Solid 3 - Snake Eater" region: "PAL-G" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurry characters. SLES-82034: @@ -21057,11 +21077,15 @@ SLES-82039: SLES-82042: name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" region: "PAL-E-F" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82043: name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" region: "PAL-E-F" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21069,11 +21093,15 @@ SLES-82043: SLES-82044: name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" region: "PAL-I" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82045: name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" region: "PAL-I" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21081,11 +21109,15 @@ SLES-82045: SLES-82046: name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" region: "PAL-G" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82047: name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" region: "PAL-G" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21093,11 +21125,15 @@ SLES-82047: SLES-82048: name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" region: "PAL-S" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82049: name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" region: "PAL-S" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21105,6 +21141,8 @@ SLES-82049: SLES-82050: name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" region: "PAL-E-F" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21112,6 +21150,8 @@ SLES-82050: SLES-82051: name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" region: "PAL-I" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21119,6 +21159,8 @@ SLES-82051: SLES-82052: name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" region: "PAL-G" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21126,6 +21168,8 @@ SLES-82052: SLES-82053: name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" region: "PAL-S" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -21594,6 +21638,8 @@ SLKA-25249: SLKA-25251: name: "Metal Gear Solid 3 - Snake Eater" region: "NTSC-K" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLKA-25252: name: "Forgotten Realms - Demon Stone" region: "NTSC-K" @@ -21777,6 +21823,8 @@ SLKA-25335: SLKA-25341: name: "Driver - Parallel Lines" region: "NTSC-K" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLKA-25342: name: "Ryu ga Gotoku" region: "NTSC-K" @@ -21790,12 +21838,16 @@ SLKA-25353: name: "Metal Gear Solid 3 - Subsistence [Limited Edition] [Disc1of2]" region: "NTSC-K" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLKA-25354: name: "Metal Gear Solid 3 - Subsistence [Limited Edition] [Disc2of2]" region: "NTSC-K" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -26995,6 +27047,8 @@ SLPM-65740: SLPM-65741: name: "Driv3r" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 SLPM-65742: @@ -27142,9 +27196,13 @@ SLPM-65788: SLPM-65789: name: "Metal Gear Solid 3 - Snake Eater [Premium Pack]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLPM-65790: name: "Metal Gear Solid 3 - Snake Eater" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLPM-65791: name: "S.L.A.I. - Steel Lancer Arena International" region: "NTSC-J" @@ -28249,6 +28307,8 @@ SLPM-66116: SLPM-66117: name: "Metal Gear Solid 3 - Subsistence [with Headset]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLPM-66122: @@ -28594,6 +28654,8 @@ SLPM-66219: SLPM-66220: name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc1of3]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -28601,6 +28663,8 @@ SLPM-66220: SLPM-66221: name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc2of3]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -28608,6 +28672,8 @@ SLPM-66221: SLPM-66222: name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc3of3]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -28615,6 +28681,8 @@ SLPM-66222: SLPM-66223: name: "Metal Gear Solid 3 - Subsistence [Disc1of2]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -28622,6 +28690,8 @@ SLPM-66223: SLPM-66224: name: "Metal Gear Solid 3 - Subsistence [Disc2of2]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -29818,6 +29888,8 @@ SLPM-66566: SLPM-66567: name: "Driver - Parallel Lines" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLPM-66568: name: "Brothers In Arms - Road to Hill 30 [Ubisoft Best]" region: "NTSC-J" @@ -30650,6 +30722,8 @@ SLPM-66792: SLPM-66794: name: "Metal Gear Solid 3 - Snake Eater [20th Anniversary Edition]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLPM-66796: name: "Metal Gear Solid - 20th Anniversary Collection" region: "NTSC-J" @@ -31443,6 +31517,8 @@ SLPM-68513: SLPM-68516: name: "Metal Gear Solid 3 - Snake Eater [Shareholder Edition]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLPM-69001: name: "PictureParadise Club" region: "NTSC-J" @@ -39162,6 +39238,8 @@ SLUS-20587: name: "Driv3r" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 SLUS-20588: @@ -39432,6 +39510,8 @@ SLUS-20649: name: "Crash Bandicoot - Nitro Kart" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLUS-20650: name: "MVP Baseball 2003" region: "NTSC-U" @@ -40578,6 +40658,8 @@ SLUS-20915: name: "Metal Gear Solid 3 - Snake Eater" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLUS-20916: name: "Dance Dance Revolution EXTREME" region: "NTSC-U" @@ -41659,6 +41741,8 @@ SLUS-21134: name: "Resident Evil 4" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLUS-21135: @@ -42214,6 +42298,8 @@ SLUS-21243: name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -42375,6 +42461,8 @@ SLUS-21271: name: "Driver - Parallel Lines" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLUS-21272: name: "Super Monkey Ball Adventure" region: "NTSC-U" @@ -42844,11 +42932,15 @@ SLUS-21359: name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLUS-21360: name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" region: "NTSC-U" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. memcardFilters: @@ -43072,6 +43164,8 @@ SLUS-21398: SLUS-21399: name: "Driver - Parallel Lines [Limited Edition]" region: "NTSC-U" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLUS-21400: name: "Monster House" region: "NTSC-U" @@ -45774,6 +45868,8 @@ SLUS-29067: SLUS-29068: name: "Crash Nitro Kart [Demo]" region: "NTSC-U" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLUS-29069: name: "Prince of Persia - The Sands of Time [Demo]" region: "NTSC-U" @@ -46051,6 +46147,8 @@ SLUS-29168: SLUS-29169: name: "Resident Evil 4 [Demo]" region: "NTSC-U" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLUS-29170: @@ -46095,6 +46193,8 @@ SLUS-29183: SLUS-29185: name: "Driver - Parallel Lines [Demo]" region: "NTSC-U" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLUS-29188: name: "Steambot Chronicles [Regular Demo]" region: "NTSC-U" diff --git a/pcsx2-qt/Settings/GameFixSettingsWidget.cpp b/pcsx2-qt/Settings/GameFixSettingsWidget.cpp index cd55c62d84..cb874d4d0b 100644 --- a/pcsx2-qt/Settings/GameFixSettingsWidget.cpp +++ b/pcsx2-qt/Settings/GameFixSettingsWidget.cpp @@ -47,6 +47,7 @@ GameFixSettingsWidget::GameFixSettingsWidget(SettingsDialog* dialog, QWidget* pa SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VUSyncHack, "EmuCore/Gamefixes", "VUSyncHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VUOverflowHack, "EmuCore/Gamefixes", "VUOverflowHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.XgKickHack, "EmuCore/Gamefixes", "XgKickHack", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.BlitInternalFPSHack, "EmuCore/Gamefixes", "BlitInternalFPSHack", false); } GameFixSettingsWidget::~GameFixSettingsWidget() = default; diff --git a/pcsx2-qt/Settings/GameFixSettingsWidget.ui b/pcsx2-qt/Settings/GameFixSettingsWidget.ui index 0f7da56249..deb4c485e6 100644 --- a/pcsx2-qt/Settings/GameFixSettingsWidget.ui +++ b/pcsx2-qt/Settings/GameFixSettingsWidget.ui @@ -141,6 +141,13 @@ + + + + Force Blit Internal FPS Detection (When auto-detection fails) + + + diff --git a/pcsx2/Config.h b/pcsx2/Config.h index 90db068221..bd8169909e 100644 --- a/pcsx2/Config.h +++ b/pcsx2/Config.h @@ -44,6 +44,7 @@ enum GamefixId Fix_VUSync, Fix_VUOverflow, Fix_XGKick, + Fix_BlitInternalFPS, GamefixId_COUNT }; @@ -796,7 +797,8 @@ struct Pcsx2Config IbitHack : 1, // I bit hack. Needed to stop constant VU recompilation in some games VUSyncHack : 1, // Makes microVU run behind the EE to avoid VU register reading/writing sync issues. Useful for M-Bit games VUOverflowHack : 1, // Tries to simulate overflow flag checks (not really possible on x86 without soft floats) - XgKickHack : 1; // Erementar Gerad, adds more delay to VU XGkick instructions. Corrects the color of some graphics, but breaks Tri-ace games and others. + XgKickHack : 1, // Erementar Gerad, adds more delay to VU XGkick instructions. Corrects the color of some graphics, but breaks Tri-ace games and others. + BlitInternalFPSHack : 1; // Disables privileged register write-based FPS detection. BITFIELD_END GamefixOptions(); diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index f0cf6ce0df..847d57db37 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -852,7 +852,8 @@ static const char* const tbl_GamefixNames[] = "Ibit", "VUSync", "VUOverflow", - "XGKick" + "XGKick", + "BlitInternalFPS" }; const char* EnumToString(GamefixId id) @@ -893,6 +894,7 @@ void Pcsx2Config::GamefixOptions::Set(GamefixId id, bool enabled) case Fix_Ibit: IbitHack = enabled; break; case Fix_VUSync: VUSyncHack = enabled; break; case Fix_VUOverflow: VUOverflowHack = enabled; break; + case Fix_BlitInternalFPS: BlitInternalFPSHack = enabled; break; jNO_DEFAULT; } } @@ -918,6 +920,7 @@ bool Pcsx2Config::GamefixOptions::Get(GamefixId id) const case Fix_Ibit: return IbitHack; case Fix_VUSync: return VUSyncHack; case Fix_VUOverflow: return VUOverflowHack; + case Fix_BlitInternalFPS: return BlitInternalFPSHack; jNO_DEFAULT; } return false; // unreachable, but we still need to suppress warnings >_< @@ -943,6 +946,7 @@ void Pcsx2Config::GamefixOptions::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(IbitHack); SettingsWrapBitBool(VUSyncHack); SettingsWrapBitBool(VUOverflowHack); + SettingsWrapBitBool(BlitInternalFPSHack); } diff --git a/pcsx2/PerformanceMetrics.cpp b/pcsx2/PerformanceMetrics.cpp index 96ff0c9938..644ca487f8 100644 --- a/pcsx2/PerformanceMetrics.cpp +++ b/pcsx2/PerformanceMetrics.cpp @@ -152,7 +152,7 @@ void PerformanceMetrics::Update(bool gs_register_write, bool fb_blit) s_accumulated_gpu_time = 0.0f; // prefer privileged register write based framerate detection, it's less likely to have false positives - if (s_gs_privileged_register_writes_since_last_update > 0) + if (s_gs_privileged_register_writes_since_last_update > 0 && !EmuConfig.Gamefixes.BlitInternalFPSHack) { s_internal_fps = static_cast(s_gs_privileged_register_writes_since_last_update) / time; s_internal_fps_method = InternalFPSMethod::GSPrivilegedRegister;