From 6e864a36ed8f65cb6720a247a18dcbace1ac31ed Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 20 Aug 2025 22:06:44 +1000 Subject: [PATCH] GameDatabase: Allow CPU overclock override --- src/core/game_database.cpp | 15 +++++++++++++-- src/core/game_database.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/core/game_database.cpp b/src/core/game_database.cpp index cda42a776..bd92f623a 100644 --- a/src/core/game_database.cpp +++ b/src/core/game_database.cpp @@ -40,7 +40,7 @@ namespace GameDatabase { enum : u32 { GAME_DATABASE_CACHE_SIGNATURE = 0x45434C48, - GAME_DATABASE_CACHE_VERSION = 27, + GAME_DATABASE_CACHE_VERSION = 28, }; static const Entry* GetEntryForId(std::string_view code); @@ -443,6 +443,13 @@ void GameDatabase::Entry::ApplySettings(Settings& settings, bool display_osd_mes Settings::GetLineDetectModeName(settings.gpu_line_detect_mode)); } } + if (cpu_overclock.has_value() && (!settings.cpu_overclock_enable || settings.disable_all_enhancements)) + { + settings.SetCPUOverclockPercent(cpu_overclock.value()); + settings.cpu_overclock_enable = settings.cpu_overclock_active = true; + if (display_osd_messages) + INFO_LOG("GameDB: CPU overclock set to {}.", cpu_overclock.value()); + } SmallStackString<512> messages; #define APPEND_MESSAGE(msg) \ @@ -967,6 +974,7 @@ std::string GameDatabase::Entry::GenerateCompatibilityReport() const &Settings::GetDisplayCropModeDisplayName, display_crop_mode); AppendEnumSetting(ret, settings_heading, TRANSLATE_SV("GameDatabase", "Display Deinterlacing Mode"), &Settings::GetDisplayDeinterlacingModeDisplayName, display_deinterlacing_mode); + AppendIntegerSetting(ret, settings_heading, TRANSLATE_SV("GameDatabase", "CPU Overclock Percent"), cpu_overclock); AppendIntegerSetting(ret, settings_heading, TRANSLATE_SV("GameDatabase", "DMA Max Slice Ticks"), dma_max_slice_ticks); AppendIntegerSetting(ret, settings_heading, TRANSLATE_SV("GameDatabase", "DMA Halt Ticks"), dma_halt_ticks); AppendIntegerSetting(ret, settings_heading, TRANSLATE_SV("GameDatabase", "CD-ROM Max Seek Speedup Cycles"), @@ -1062,7 +1070,8 @@ bool GameDatabase::LoadFromCache() !reader.ReadOptionalT(&entry.gpu_max_run_ahead) || !reader.ReadOptionalT(&entry.gpu_pgxp_tolerance) || !reader.ReadOptionalT(&entry.gpu_pgxp_depth_threshold) || !reader.ReadOptionalT(&entry.gpu_pgxp_preserve_proj_fp) || !reader.ReadOptionalT(&entry.gpu_line_detect_mode) || - !reader.ReadSizePrefixedString(&entry.disc_set_name) || !reader.ReadU32(&num_disc_set_serials)) + !reader.ReadOptionalT(&entry.cpu_overclock) || !reader.ReadSizePrefixedString(&entry.disc_set_name) || + !reader.ReadU32(&num_disc_set_serials)) { DEV_LOG("Cache entry is corrupted."); return false; @@ -1184,6 +1193,7 @@ bool GameDatabase::SaveToCache() writer.WriteOptionalT(entry.gpu_pgxp_depth_threshold); writer.WriteOptionalT(entry.gpu_pgxp_preserve_proj_fp); writer.WriteOptionalT(entry.gpu_line_detect_mode); + writer.WriteOptionalT(entry.cpu_overclock); writer.WriteSizePrefixedString(entry.disc_set_name); writer.WriteU32(static_cast(entry.disc_set_serials.size())); @@ -1447,6 +1457,7 @@ bool GameDatabase::ParseYamlEntry(Entry* entry, const ryml::ConstNodeRef& value) entry->gpu_pgxp_preserve_proj_fp = GetOptionalTFromObject(settings, "gpuPGXPPreserveProjFP"); entry->gpu_line_detect_mode = ParseOptionalTFromObject(settings, "gpuLineDetectMode", &Settings::ParseLineDetectModeName); + entry->cpu_overclock = GetOptionalTFromObject(settings, "cpuOverclockPercent"); } if (const ryml::ConstNodeRef disc_set = value.find_child("discSet"); disc_set.valid() && disc_set.has_children()) diff --git a/src/core/game_database.h b/src/core/game_database.h index 3575d648b..a382b85b7 100644 --- a/src/core/game_database.h +++ b/src/core/game_database.h @@ -124,6 +124,7 @@ struct Entry std::optional display_crop_mode; std::optional display_deinterlacing_mode; std::optional gpu_line_detect_mode; + std::optional cpu_overclock; std::optional dma_max_slice_ticks; std::optional dma_halt_ticks; std::optional cdrom_max_seek_speedup_cycles;