diff --git a/pcsx2-qt/Settings/EmulationSettingsWidget.cpp b/pcsx2-qt/Settings/EmulationSettingsWidget.cpp index 4d0286b9da..63eebc73a3 100644 --- a/pcsx2-qt/Settings/EmulationSettingsWidget.cpp +++ b/pcsx2-qt/Settings/EmulationSettingsWidget.cpp @@ -51,6 +51,7 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsDialog* dialog, QWidget SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.noInterlacingPatches, "EmuCore", "EnableNoInterlacingPatches", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.perGameSettings, "EmuCore", "EnablePerGameSettings", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.hostFilesystem, "EmuCore", "HostFs", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.warnAboutUnsafeSettings, "EmuCore", "WarnAboutUnsafeSettings", true); dialog->registerWidgetHelp(m_ui.normalSpeed, tr("Normal Speed"), "100%", tr("Sets the target emulation speed. It is not guaranteed that this speed will be reached, " @@ -96,6 +97,9 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsDialog* dialog, QWidget tr("Sets the maximum number of frames that can be queued up to the GS, before the CPU thread will wait for one of them to complete before continuing. " "Higher values can assist with smoothing out irregular frame times, but add additional input lag.")); + dialog->registerWidgetHelp(m_ui.warnAboutUnsafeSettings, tr("Warn About Unsafe Settings"), + tr("Checked"), tr("Displays warnings when settings are enabled which may break games.")); + updateOptimalFramePacing(); } diff --git a/pcsx2-qt/Settings/EmulationSettingsWidget.ui b/pcsx2-qt/Settings/EmulationSettingsWidget.ui index 004deac456..084c7589d5 100644 --- a/pcsx2-qt/Settings/EmulationSettingsWidget.ui +++ b/pcsx2-qt/Settings/EmulationSettingsWidget.ui @@ -160,6 +160,13 @@ + + + + Warn About Unsafe Settings + + + diff --git a/pcsx2/Config.h b/pcsx2/Config.h index f5194c2aa6..03fa9e90f4 100644 --- a/pcsx2/Config.h +++ b/pcsx2/Config.h @@ -970,7 +970,9 @@ struct Pcsx2Config MultitapPort1_Enabled : 1, ConsoleToStdio : 1, - HostFs : 1; + HostFs : 1, + + WarnAboutUnsafeSettings : 1; // uses automatic ntfs compression when creating new memory cards (Win32 only) #ifdef _WIN32 diff --git a/pcsx2/Frontend/FullscreenUI.cpp b/pcsx2/Frontend/FullscreenUI.cpp index 9650e2ecb0..daaaefdf31 100644 --- a/pcsx2/Frontend/FullscreenUI.cpp +++ b/pcsx2/Frontend/FullscreenUI.cpp @@ -2256,6 +2256,8 @@ void FullscreenUI::DrawEmulationSettingsPage() "EmuCore", "EnablePerGameSettings", true); DrawToggleSetting(bsi, "Enable Host Filesystem", "Enables access to files from the host: namespace in the virtual machine.", "EmuCore", "HostFs", false); + DrawToggleSetting(bsi, "Warn About Unsafe Settings", "Displays warnings when settings are enabled which may break games.", "EmuCore", + "WarnAboutUnsafeSettings", true); EndMenuButtons(); } diff --git a/pcsx2/Frontend/ImGuiManager.cpp b/pcsx2/Frontend/ImGuiManager.cpp index 81bd4a9224..4f28134f3f 100644 --- a/pcsx2/Frontend/ImGuiManager.cpp +++ b/pcsx2/Frontend/ImGuiManager.cpp @@ -411,7 +411,7 @@ ImFont* ImGuiManager::AddFixedFont(float size) bool ImGuiManager::AddIconFonts(float size) { - static constexpr ImWchar range_fa[] = { 0xf001,0xf002,0xf005,0xf005,0xf00c,0xf00e,0xf011,0xf011,0xf013,0xf013,0xf017,0xf017,0xf019,0xf019,0xf021,0xf021,0xf025,0xf025,0xf028,0xf028,0xf030,0xf030,0xf03a,0xf03a,0xf03d,0xf03d,0xf04a,0xf04c,0xf04e,0xf04e,0xf050,0xf050,0xf052,0xf052,0xf059,0xf059,0xf05e,0xf05e,0xf065,0xf065,0xf067,0xf067,0xf071,0xf071,0xf07b,0xf07c,0xf085,0xf085,0xf091,0xf091,0xf0a0,0xf0a0,0xf0ac,0xf0ad,0xf0c5,0xf0c5,0xf0c7,0xf0c9,0xf0d0,0xf0d0,0xf0e2,0xf0e2,0xf0eb,0xf0eb,0xf0f3,0xf0f3,0xf0fe,0xf0fe,0xf110,0xf110,0xf11b,0xf11c,0xf121,0xf121,0xf140,0xf140,0xf144,0xf144,0xf14a,0xf14a,0xf15b,0xf15b,0xf188,0xf188,0xf192,0xf192,0xf1c9,0xf1c9,0xf1dd,0xf1de,0xf1e6,0xf1e6,0xf1ea,0xf1eb,0xf1f8,0xf1f8,0xf1fc,0xf1fc,0xf242,0xf242,0xf245,0xf245,0xf26c,0xf26c,0xf2d0,0xf2d0,0xf2db,0xf2db,0xf2f5,0xf2f5,0xf410,0xf410,0xf466,0xf466,0xf51f,0xf51f,0xf543,0xf543,0xf545,0xf545,0xf547,0xf548,0xf552,0xf552,0xf65d,0xf65e,0xf756,0xf756,0xf7c2,0xf7c2,0xf815,0xf815,0xf818,0xf818,0xf8cc,0xf8cc,0x0,0x0 }; + static constexpr ImWchar range_fa[] = { 0xf001,0xf002,0xf005,0xf005,0xf00c,0xf00e,0xf011,0xf011,0xf013,0xf013,0xf017,0xf017,0xf019,0xf019,0xf021,0xf021,0xf025,0xf025,0xf028,0xf028,0xf030,0xf030,0xf03a,0xf03a,0xf03d,0xf03d,0xf04a,0xf04c,0xf04e,0xf04e,0xf050,0xf050,0xf052,0xf052,0xf059,0xf059,0xf05e,0xf05e,0xf065,0xf065,0xf067,0xf067,0xf06a,0xf06a,0xf071,0xf071,0xf07b,0xf07c,0xf085,0xf085,0xf091,0xf091,0xf0a0,0xf0a0,0xf0ac,0xf0ad,0xf0b0,0xf0b0,0xf0c5,0xf0c5,0xf0c7,0xf0c9,0xf0d0,0xf0d0,0xf0e2,0xf0e2,0xf0eb,0xf0eb,0xf0f3,0xf0f3,0xf0fe,0xf0fe,0xf110,0xf110,0xf11b,0xf11c,0xf121,0xf121,0xf140,0xf140,0xf144,0xf144,0xf14a,0xf14a,0xf15b,0xf15b,0xf188,0xf188,0xf192,0xf192,0xf1c9,0xf1c9,0xf1dd,0xf1de,0xf1e6,0xf1e6,0xf1ea,0xf1eb,0xf1f8,0xf1f8,0xf1fc,0xf1fc,0xf242,0xf242,0xf245,0xf245,0xf26c,0xf26c,0xf2d0,0xf2d0,0xf2db,0xf2db,0xf2f5,0xf2f5,0xf302,0xf302,0xf3fd,0xf3fd,0xf410,0xf410,0xf466,0xf466,0xf479,0xf479,0xf517,0xf517,0xf51f,0xf51f,0xf543,0xf543,0xf545,0xf545,0xf547,0xf548,0xf552,0xf552,0xf65d,0xf65e,0xf6a9,0xf6a9,0xf756,0xf756,0xf7c2,0xf7c2,0xf815,0xf815,0xf818,0xf818,0xf8cc,0xf8cc,0x0,0x0 }; ImFontConfig cfg; cfg.MergeMode = true; diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index 5394f6db92..59671190fb 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -1034,6 +1034,8 @@ Pcsx2Config::Pcsx2Config() McdCompressNTFS = true; #endif + WarnAboutUnsafeSettings = true; + // To be moved to FileMemoryCard pluign (someday) for (uint slot = 0; slot < 8; ++slot) { @@ -1084,6 +1086,8 @@ void Pcsx2Config::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(MultitapPort1_Enabled); #endif + SettingsWrapBitBool(WarnAboutUnsafeSettings); + // Process various sub-components: Speedhacks.LoadSave(wrap); diff --git a/pcsx2/VMManager.cpp b/pcsx2/VMManager.cpp index 29a33bd899..6b33ce8e7c 100644 --- a/pcsx2/VMManager.cpp +++ b/pcsx2/VMManager.cpp @@ -83,6 +83,7 @@ namespace VMManager static void CheckForSPU2ConfigChanges(const Pcsx2Config& old_config); static void CheckForDEV9ConfigChanges(const Pcsx2Config& old_config); static void CheckForMemoryCardConfigChanges(const Pcsx2Config& old_config); + static void WarnAboutUnsafeSettings(); static bool AutoDetectSource(const std::string& filename); static bool ApplyBootParameters(VMBootParameters params, std::string* state_to_load); @@ -348,7 +349,12 @@ void VMManager::LoadSettings() EmuConfig.Speedhacks.vuThread = false; if (HasValidVM()) + { + if (EmuConfig.WarnAboutUnsafeSettings) + WarnAboutUnsafeSettings(); + ApplyGameFixes(); + } } void VMManager::ApplyGameFixes() @@ -1718,6 +1724,90 @@ void VMManager::SetDefaultSettings(SettingsInterface& si) SetHardwareDependentDefaultSettings(si); } +void VMManager::WarnAboutUnsafeSettings() +{ + std::string messages; + + if (EmuConfig.Speedhacks.fastCDVD) + messages += ICON_FA_COMPACT_DISC " Fast CDVD is enabled, this may break games.\n"; + if (EmuConfig.Speedhacks.EECycleRate != 0 || EmuConfig.Speedhacks.EECycleSkip != 0) + messages += ICON_FA_TACHOMETER_ALT " Cycle rate/skip is not at default, this may crash or make games run too slow.\n"; + if (EmuConfig.SPU2.SynchMode != Pcsx2Config::SPU2Options::SynchronizationMode::TimeStretch) + messages += ICON_FA_VOLUME_MUTE " Audio is not using time stretch synchronization, this may break FMVs.\n"; + if (EmuConfig.GS.HWMipmap != HWMipmapLevel::Automatic) + messages += ICON_FA_IMAGES " Mipmapping is not set to automatic. This may break rendering in some games.\n"; + if (EmuConfig.GS.TextureFiltering != BiFiltering::PS2) + messages += ICON_FA_FILTER " Texture filtering is not set to Bilinear (PS2). This will break rendering in some games.\n"; + if (EmuConfig.GS.UserHacks_TriFilter != TriFiltering::Automatic) + messages += ICON_FA_PAGER " Trilinear filtering is not set to automatic. This may break rendering in some games.\n"; + if (EmuConfig.GS.AccurateBlendingUnit <= AccBlendLevel::Minimum) + messages += ICON_FA_BLENDER " Blending is below basic, this may break effects in some games.\n"; + if (EmuConfig.GS.CRCHack != CRCHackLevel::Automatic) + messages += ICON_FA_FIRST_AID " CRC Fix Level is not set to default, this may break effects in some games.\n"; + if (EmuConfig.Cpu.sseMXCSR.GetRoundMode() != SSEround_Chop || EmuConfig.Cpu.sseVUMXCSR.GetRoundMode() != SSEround_Chop) + messages += ICON_FA_MICROCHIP " EE FPU Round Mode is not set to default, this may break some games.\n"; + if (!EmuConfig.Cpu.Recompiler.fpuOverflow || EmuConfig.Cpu.Recompiler.fpuExtraOverflow || EmuConfig.Cpu.Recompiler.fpuFullMode) + messages += ICON_FA_MICROCHIP " EE FPU Clamp Mode is not set to default, this may break some games.\n"; + if (EmuConfig.Cpu.sseVUMXCSR.GetRoundMode() != SSEround_Chop) + messages += ICON_FA_MICROCHIP " VU Round Mode is not set to default, this may break some games.\n"; + if (!EmuConfig.Cpu.Recompiler.vuOverflow || EmuConfig.Cpu.Recompiler.vuExtraOverflow || EmuConfig.Cpu.Recompiler.vuSignOverflow) + messages += ICON_FA_MICROCHIP " VU Clamp Mode is not set to default, this may break some games.\n"; + if (!EmuConfig.EnableGameFixes) + messages += ICON_FA_GAMEPAD " Game Fixes are not enabled. Compatibility with some games may be affected.\n"; + if (!EmuConfig.EnablePatches) + messages += ICON_FA_GAMEPAD " Compatibility Patches are not enabled. Compatibility with some games may be affected.\n"; + if (EmuConfig.GS.FramerateNTSC != Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_NTSC) + messages += ICON_FA_TV " Frame rate for NTSC is not default. This may break some games.\n"; + if (EmuConfig.GS.FrameratePAL != Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_PAL) + messages += ICON_FA_TV " Frame rate for PAL is not default. This may break some games.\n"; + + if (!messages.empty()) + { + if (messages.back() == '\n') + messages.pop_back(); + Host::AddKeyedOSDMessage("unsafe_settings_warning", std::move(messages), 10.0f); + } + else + { + Host::RemoveKeyedOSDMessage("unsafe_settings_warning"); + } + + messages.clear(); + if (!EmuConfig.Cpu.Recompiler.EnableEE) + messages += ICON_FA_EXCLAMATION_CIRCLE " EE Recompiler is not enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Cpu.Recompiler.EnableVU0) + messages += ICON_FA_EXCLAMATION_CIRCLE " VU0 Recompiler is not enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Cpu.Recompiler.EnableVU1) + messages += ICON_FA_EXCLAMATION_CIRCLE " VU1 Recompiler is not enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Cpu.Recompiler.EnableIOP) + messages += ICON_FA_EXCLAMATION_CIRCLE " IOP Recompiler is not enabled, this will significantly reduce performance.\n"; + if (EmuConfig.Cpu.Recompiler.EnableEECache) + messages += ICON_FA_EXCLAMATION_CIRCLE " EE Cache is enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Speedhacks.WaitLoop) + messages += ICON_FA_EXCLAMATION_CIRCLE " EE Wait Loop Detection is not enabled, this may reduce performance.\n"; + if (!EmuConfig.Speedhacks.IntcStat) + messages += ICON_FA_EXCLAMATION_CIRCLE " INTC Spin Detection is not enabled, this may reduce performance.\n"; + if (!EmuConfig.Speedhacks.vu1Instant) + messages += ICON_FA_EXCLAMATION_CIRCLE " Instant VU1 is disabled, this may reduce performance.\n"; + if (!EmuConfig.Speedhacks.vuFlagHack) + messages += ICON_FA_EXCLAMATION_CIRCLE " mVU Flag Hack is not enabled, this may reduce performance.\n"; + if (EmuConfig.GS.GPUPaletteConversion) + messages += ICON_FA_EXCLAMATION_CIRCLE " GPU Palette Conversion is enabled, this may reduce performance.\n"; + if (EmuConfig.GS.TexturePreloading != TexturePreloadingLevel::Full) + messages += ICON_FA_EXCLAMATION_CIRCLE " Texture Preloading is not Full, this may reduce performance.\n"; + + if (!messages.empty()) + { + if (messages.back() == '\n') + messages.pop_back(); + Host::AddKeyedOSDMessage("performance_settings_warning", std::move(messages), 10.0f); + } + else + { + Host::RemoveKeyedOSDMessage("performance_settings_warning"); + } +} + static void HotkeyAdjustTargetSpeed(double delta) { EmuConfig.Framerate.NominalScalar = EmuConfig.GS.LimitScalar + delta;