diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp index 32fcd4da06b31..603afe1d50b0d 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp @@ -88,6 +88,8 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.interlacing, "EmuCore/GS", "deinterlace_mode", DEFAULT_INTERLACE_MODE); SettingWidgetBinder::BindWidgetToIntSetting( sif, m_ui.bilinearFiltering, "EmuCore/GS", "linear_present_mode", static_cast(GSPostBilinearMode::BilinearSmooth)); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.widescreenPatches, "EmuCore", "EnableWideScreenPatches", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.noInterlacingPatches, "EmuCore", "EnableNoInterlacingPatches", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.integerScaling, "EmuCore/GS", "IntegerScaling", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.PCRTCOffsets, "EmuCore/GS", "pcrtc_offsets", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.PCRTCOverscan, "EmuCore/GS", "pcrtc_overscan", false); @@ -319,22 +321,24 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* } #endif - // Prompt user to get rid of widescreen/no-interlace config from the ini if the user has enabled them before. - if ((m_dialog->getBoolValue("EmuCore", "EnableWideScreenPatches", false) == true || - m_dialog->getBoolValue("EmuCore", "EnableWideScreenPatches", false) == true) && - !m_dialog->containsSettingValue("UI", "UserHasDeniedWSPatchWarning")) + // Get rid of widescreen/no-interlace checkboxes from per-game settings, unless the user previously had them set. + if (m_dialog->isPerGameSettings()) { - if (QMessageBox::question(QtUtils::GetRootWidget(this), tr("Remove Unsupported Settings"), - tr("You previously had the Enable Widescreen Patches or Enable No-Interlacing Patches options enabled.

" - "We no longer provide these options, instead you should go to the \"Patches\" section on the per-game settings, and explicitly enable the patches that you want.

" - "Do you want to remove these options from your configuration now?"), + if ((m_dialog->containsSettingValue("EmuCore", "EnableWideScreenPatches") || m_dialog->containsSettingValue("EmuCore", "EnableNoInterlacingPatches")) && + QMessageBox::question(QtUtils::GetRootWidget(this), tr("Remove Unsupported Settings"), + tr("You currently have the Enable Widescreen Patches or Enable No-Interlacing Patches options enabled for this game.

" + "We no longer support these options, instead you should select the \"Patches\" section, and explicitly enable the patches you want.

" + "Do you want to remove these options from your game configuration now?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { m_dialog->removeSettingValue("EmuCore", "EnableWideScreenPatches"); m_dialog->removeSettingValue("EmuCore", "EnableNoInterlacingPatches"); } - else - m_dialog->setBoolSettingValue("UI", "UserHasDeniedWSPatchWarning", true); + + m_ui.displayGridLayout->removeWidget(m_ui.widescreenPatches); + m_ui.displayGridLayout->removeWidget(m_ui.noInterlacingPatches); + safe_delete(m_ui.widescreenPatches); + safe_delete(m_ui.noInterlacingPatches); } // Hide advanced options by default. @@ -427,6 +431,12 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* // Display tab { + dialog->registerWidgetHelp(m_ui.widescreenPatches, tr("Enable Widescreen Patches"), tr("Unchecked"), + tr("Automatically loads and applies widescreen patches on game start. Can cause issues.")); + + dialog->registerWidgetHelp(m_ui.noInterlacingPatches, tr("Enable No-Interlacing Patches"), tr("Unchecked"), + tr("Automatically loads and applies no-interlacing patches on game start. Can cause issues.")); + dialog->registerWidgetHelp(m_ui.DisableInterlaceOffset, tr("Disable Interlace Offset"), tr("Unchecked"), tr("Disables interlacing offset which may reduce blurring in some situations.")); diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui index d7994633de4b6..d1b6a9031d041 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui @@ -404,28 +404,28 @@ - + Integer Scaling - - + + - Show Overscan + Apply Widescreen Patches - - + + - Screen Offsets + Apply No-Interlacing Patches - + Anti-Blur @@ -435,13 +435,27 @@ - + Disable Interlace Offset + + + + Screen Offsets + + + + + + + Show Overscan + + + @@ -2111,7 +2125,7 @@ - + diff --git a/pcsx2/Config.h b/pcsx2/Config.h index 5d59e799774b4..403900ff2c7ea 100644 --- a/pcsx2/Config.h +++ b/pcsx2/Config.h @@ -1268,6 +1268,8 @@ struct Pcsx2Config EnablePatches : 1, // enables patch detection and application EnableCheats : 1, // enables cheat detection and application EnablePINE : 1, // enables inter-process communication + EnableWideScreenPatches : 1, + EnableNoInterlacingPatches : 1, EnableFastBoot : 1, EnableFastBootFastForward : 1, EnableThreadPinning : 1, diff --git a/pcsx2/ImGui/FullscreenUI.cpp b/pcsx2/ImGui/FullscreenUI.cpp index 27e28017d47d6..17ea99d9fa142 100644 --- a/pcsx2/ImGui/FullscreenUI.cpp +++ b/pcsx2/ImGui/FullscreenUI.cpp @@ -3705,6 +3705,15 @@ void FullscreenUI::DrawGraphicsSettingsPage(SettingsInterface* bsi, bool show_ad "EmuCore/GS", "StretchY", 100, 10, 300, FSUI_CSTR("%d%%")); DrawIntRectSetting(bsi, FSUI_CSTR("Crop"), FSUI_CSTR("Crops the image, while respecting aspect ratio."), "EmuCore/GS", "CropLeft", 0, "CropTop", 0, "CropRight", 0, "CropBottom", 0, 0, 720, 1, FSUI_CSTR("%dpx")); + + if (!IsEditingGameSettings(bsi)) + { + DrawToggleSetting(bsi, FSUI_CSTR("Enable Widescreen Patches"), FSUI_CSTR("Enables loading widescreen patches from pnach files."), + "EmuCore", "EnableWideScreenPatches", false); + DrawToggleSetting(bsi, FSUI_CSTR("Enable No-Interlacing Patches"), + FSUI_CSTR("Enables loading no-interlacing patches from pnach files."), "EmuCore", "EnableNoInterlacingPatches", false); + } + DrawIntListSetting(bsi, FSUI_CSTR("Bilinear Upscaling"), FSUI_CSTR("Smooths out the image when upscaling the console to the screen."), "EmuCore/GS", "linear_present_mode", static_cast(GSPostBilinearMode::BilinearSharp), s_bilinear_present_options, std::size(s_bilinear_present_options), true); diff --git a/pcsx2/ImGui/ImGuiOverlays.cpp b/pcsx2/ImGui/ImGuiOverlays.cpp index 3224fafea0a9d..e67c3184c22f9 100644 --- a/pcsx2/ImGui/ImGuiOverlays.cpp +++ b/pcsx2/ImGui/ImGuiOverlays.cpp @@ -397,9 +397,10 @@ __ri void ImGuiManager::DrawSettingsOverlay(float scale, float margin, float spa EmuConfig.Cpu.Recompiler.GetEEClampMode(), static_cast(EmuConfig.Cpu.VU0FPCR.GetRoundMode()), EmuConfig.Cpu.Recompiler.GetVUClampMode(), EmuConfig.GS.VsyncQueueSize); - if (EmuConfig.EnableCheats) + if (EmuConfig.EnableCheats || EmuConfig.EnableWideScreenPatches || EmuConfig.EnableNoInterlacingPatches) { - APPEND("CHT "); + APPEND("C={}{}{} ", EmuConfig.EnableCheats ? "C" : "", EmuConfig.EnableWideScreenPatches ? "W" : "", + EmuConfig.EnableNoInterlacingPatches ? "N" : ""); } if (GSIsHardwareRenderer()) diff --git a/pcsx2/Patch.cpp b/pcsx2/Patch.cpp index 7e63d1db6e577..599bd74024a9f 100644 --- a/pcsx2/Patch.cpp +++ b/pcsx2/Patch.cpp @@ -163,6 +163,9 @@ namespace Patch static void writeCheat(); static void handle_extended_t(const PatchCommand* p); + // Name of patches which will be auto-enabled based on global options. + static constexpr std::string_view WS_PATCH_NAME = "Widescreen 16:9"; + static constexpr std::string_view NI_PATCH_NAME = "No-Interlacing"; static constexpr std::string_view PATCHES_ZIP_NAME = "patches.zip"; const char* PATCHES_CONFIG_SECTION = "Patches"; @@ -585,6 +588,24 @@ void Patch::ReloadEnabledLists() s_enabled_cheats = {}; s_enabled_patches = Host::GetStringListSetting(PATCHES_CONFIG_SECTION, PATCH_ENABLE_CONFIG_KEY); + + // Name based matching for widescreen/NI settings. + if (EmuConfig.EnableWideScreenPatches) + { + if (std::none_of(s_enabled_patches.begin(), s_enabled_patches.end(), + [](const std::string& it) { return (it == WS_PATCH_NAME); })) + { + s_enabled_patches.emplace_back(WS_PATCH_NAME); + } + } + if (EmuConfig.EnableNoInterlacingPatches) + { + if (std::none_of(s_enabled_patches.begin(), s_enabled_patches.end(), + [](const std::string& it) { return (it == NI_PATCH_NAME); })) + { + s_enabled_patches.emplace_back(NI_PATCH_NAME); + } + } } u32 Patch::EnablePatches(const PatchList& patches, const EnablePatchList& enable_list) diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index 8763f6ab348e4..655c11af5885f 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -1922,6 +1922,8 @@ void Pcsx2Config::LoadSaveCore(SettingsWrapper& wrap) SettingsWrapBitBool(EnablePatches); SettingsWrapBitBool(EnableCheats); SettingsWrapBitBool(EnablePINE); + SettingsWrapBitBool(EnableWideScreenPatches); + SettingsWrapBitBool(EnableNoInterlacingPatches); SettingsWrapBitBool(EnableFastBoot); SettingsWrapBitBool(EnableFastBootFastForward); SettingsWrapBitBool(EnableThreadPinning); diff --git a/pcsx2/VMManager.cpp b/pcsx2/VMManager.cpp index cb0321c50baad..ec9fdc33eb6fd 100644 --- a/pcsx2/VMManager.cpp +++ b/pcsx2/VMManager.cpp @@ -2887,6 +2887,8 @@ void VMManager::CheckForEmulationSpeedConfigChanges(const Pcsx2Config& old_confi void VMManager::CheckForPatchConfigChanges(const Pcsx2Config& old_config) { if (EmuConfig.EnableCheats == old_config.EnableCheats && + EmuConfig.EnableWideScreenPatches == old_config.EnableWideScreenPatches && + EmuConfig.EnableNoInterlacingPatches == old_config.EnableNoInterlacingPatches && EmuConfig.EnablePatches == old_config.EnablePatches) { return;