From 44ba39e3efb206a609789c7206df6056705cfbc6 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 3 Sep 2024 20:02:01 +1000 Subject: [PATCH] Settings: Make Disable Interlacing a Deinterlacing mode Saving that precious vertical space. --- data/resources/gamedb.yaml | 10 +++--- src/core/fullscreen_ui.cpp | 8 ----- src/core/game_database.cpp | 11 +++--- src/core/gpu.cpp | 5 +-- src/core/imgui_overlays.cpp | 3 +- src/core/settings.cpp | 14 ++++---- src/core/settings.h | 3 +- src/core/system.cpp | 5 ++- src/core/types.h | 1 + src/duckstation-qt/graphicssettingswidget.cpp | 14 ++------ src/duckstation-qt/graphicssettingswidget.ui | 35 ++++++++----------- src/duckstation-qt/settingswindow.ui | 2 +- 12 files changed, 45 insertions(+), 66 deletions(-) diff --git a/data/resources/gamedb.yaml b/data/resources/gamedb.yaml index 1e67d07b6..6c41a2b4a 100644 --- a/data/resources/gamedb.yaml +++ b/data/resources/gamedb.yaml @@ -94207,7 +94207,7 @@ SLES-00211: controllers: - DigitalController settings: - displayDeinterlacingMode: Disabled # Isn't actually interlaced, uses 240p buffers, they just left 480i enabled... + displayDeinterlacingMode: Progressive # Isn't actually interlaced, uses 240p buffers, they just left 480i enabled... metadata: publisher: "Electronic Arts" developer: "Bullfrog Productions / Krisalis" @@ -94231,7 +94231,7 @@ SLPS-00587: controllers: - DigitalController settings: - displayDeinterlacingMode: Disabled # Isn't actually interlaced, uses 240p buffers, they just left 480i enabled... + displayDeinterlacingMode: Progressive # Isn't actually interlaced, uses 240p buffers, they just left 480i enabled... metadata: publisher: "Electronic Arts" developer: "Bullfrog Productions / Krisalis" @@ -94251,7 +94251,7 @@ SLUS-00029: controllers: - DigitalController settings: - displayDeinterlacingMode: Disabled # Isn't actually interlaced, uses 240p buffers, they just left 480i enabled... + displayDeinterlacingMode: Progressive # Isn't actually interlaced, uses 240p buffers, they just left 480i enabled... metadata: publisher: "Electronic Arts" developer: "Bullfrog Productions / Krisalis" @@ -116452,6 +116452,8 @@ SLPS-02587: - AnalogController - DigitalController - NeGcon + settings: + displayDeinterlacingMode: Progressive # Only used in menus, MAD flickers with fading. metadata: publisher: "MTO" developer: "MTO" @@ -116493,7 +116495,7 @@ SLPS-02951: - DigitalController - NeGcon settings: - displayDeinterlacingMode: Blend # Only used in menus, MAD flickers with fading. + displayDeinterlacingMode: Progressive # Only used in menus, MAD flickers with fading. metadata: publisher: "MTO" developer: "MTO" diff --git a/src/core/fullscreen_ui.cpp b/src/core/fullscreen_ui.cpp index 2c444c7b3..019f1e8db 100644 --- a/src/core/fullscreen_ui.cpp +++ b/src/core/fullscreen_ui.cpp @@ -4309,12 +4309,6 @@ void FullscreenUI::DrawDisplaySettingsPage() FSUI_CSTR("Smooths out blockyness between colour transitions in 24-bit content, usually FMVs."), "GPU", "ChromaSmoothing24Bit", false); - DrawToggleSetting( - bsi, FSUI_CSTR("Disable Interlacing"), - FSUI_CSTR("Disables interlaced rendering and display in the GPU. Some games can render in 480p this way, " - "but others will break."), - "GPU", "DisableInterlacing", true); - MenuHeading(FSUI_CSTR("Advanced")); std::optional strvalue = bsi->GetOptionalSmallStringValue( @@ -7352,13 +7346,11 @@ TRANSLATE_NOOP("FullscreenUI", "Determines whether a prompt will be displayed to TRANSLATE_NOOP("FullscreenUI", "Determines which algorithm is used to convert interlaced frames to progressive for display on your system."); TRANSLATE_NOOP("FullscreenUI", "Device Settings"); TRANSLATE_NOOP("FullscreenUI", "Disable All Enhancements"); -TRANSLATE_NOOP("FullscreenUI", "Disable Interlacing"); TRANSLATE_NOOP("FullscreenUI", "Disable Mailbox Presentation"); TRANSLATE_NOOP("FullscreenUI", "Disable Subdirectory Scanning"); TRANSLATE_NOOP("FullscreenUI", "Disable on 2D Polygons"); TRANSLATE_NOOP("FullscreenUI", "Disabled"); TRANSLATE_NOOP("FullscreenUI", "Disables dithering and uses the full 8 bits per channel of color information."); -TRANSLATE_NOOP("FullscreenUI", "Disables interlaced rendering and display in the GPU. Some games can render in 480p this way, but others will break."); TRANSLATE_NOOP("FullscreenUI", "Disc {} | {}"); TRANSLATE_NOOP("FullscreenUI", "Discord Server"); TRANSLATE_NOOP("FullscreenUI", "Display Settings"); diff --git a/src/core/game_database.cpp b/src/core/game_database.cpp index 4fd64e7cc..df88fc1fa 100644 --- a/src/core/game_database.cpp +++ b/src/core/game_database.cpp @@ -479,7 +479,10 @@ void GameDatabase::Entry::ApplySettings(Settings& settings, bool display_osd_mes settings.display_crop_mode = display_crop_mode.value(); } - if (display_deinterlacing_mode.has_value()) + // Don't set to optimal if disable-all-enhancements is enabled. + if (display_deinterlacing_mode.has_value() && + (display_deinterlacing_mode.value() != DisplayDeinterlacingMode::Progressive || + !g_settings.disable_all_enhancements)) { if (display_osd_messages && settings.display_deinterlacing_mode != display_deinterlacing_mode.value()) { @@ -527,12 +530,12 @@ void GameDatabase::Entry::ApplySettings(Settings& settings, bool display_osd_mes settings.gpu_accurate_blending = true; } - if (HasTrait(Trait::ForceInterlacing)) + if (HasTrait(Trait::ForceInterlacing) && settings.display_deinterlacing_mode == DisplayDeinterlacingMode::Progressive) { - if (display_osd_messages && settings.gpu_disable_interlacing) + if (display_osd_messages) APPEND_MESSAGE(TRANSLATE_SV("GameDatabase", "Interlaced rendering enabled.")); - settings.gpu_disable_interlacing = false; + settings.display_deinterlacing_mode = DisplayDeinterlacingMode::Adaptive; } if (HasTrait(Trait::DisableTrueColor)) diff --git a/src/core/gpu.cpp b/src/core/gpu.cpp index d9e5f751c..947a6e902 100644 --- a/src/core/gpu.cpp +++ b/src/core/gpu.cpp @@ -87,7 +87,7 @@ GPU::~GPU() bool GPU::Initialize() { - m_force_progressive_scan = g_settings.gpu_disable_interlacing; + m_force_progressive_scan = (g_settings.display_deinterlacing_mode == DisplayDeinterlacingMode::Progressive); m_force_frame_timings = g_settings.gpu_force_video_timing; s_crtc_tick_event.Activate(); m_fifo_size = g_settings.gpu_fifo_size; @@ -115,7 +115,7 @@ void GPU::UpdateSettings(const Settings& old_settings) { FlushRender(); - m_force_progressive_scan = g_settings.gpu_disable_interlacing; + m_force_progressive_scan = (g_settings.display_deinterlacing_mode == DisplayDeinterlacingMode::Progressive); m_fifo_size = g_settings.gpu_fifo_size; m_max_run_ahead = g_settings.gpu_max_run_ahead; @@ -1876,6 +1876,7 @@ bool GPU::CompileDisplayPipelines(bool display, bool deinterlace, bool chroma_sm switch (g_settings.display_deinterlacing_mode) { case DisplayDeinterlacingMode::Disabled: + case DisplayDeinterlacingMode::Progressive: break; case DisplayDeinterlacingMode::Weave: diff --git a/src/core/imgui_overlays.cpp b/src/core/imgui_overlays.cpp index 4f5211fb1..0a612d569 100644 --- a/src/core/imgui_overlays.cpp +++ b/src/core/imgui_overlays.cpp @@ -442,8 +442,7 @@ void ImGuiManager::DrawEnhancementsOverlay() text.append(" TrueCol"); } } - if (g_settings.gpu_disable_interlacing) - text.append(" ForceProg"); + text.append_format(" DI={}", Settings::GetDisplayDeinterlacingModeName(g_settings.display_deinterlacing_mode)); if (g_settings.gpu_force_video_timing == ForceVideoTimingMode::NTSC && System::GetRegion() == ConsoleRegion::PAL) text.append(" PAL60"); if (g_settings.gpu_force_video_timing == ForceVideoTimingMode::PAL && System::GetRegion() != ConsoleRegion::PAL) diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 258260f1e..43e33bdde 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -230,7 +230,6 @@ void Settings::Load(SettingsInterface& si, SettingsInterface& controller_si) ParseGPUWireframeMode( si.GetStringValue("GPU", "WireframeMode", GetGPUWireframeModeName(DEFAULT_GPU_WIREFRAME_MODE)).c_str()) .value_or(DEFAULT_GPU_WIREFRAME_MODE); - gpu_disable_interlacing = si.GetBoolValue("GPU", "DisableInterlacing", true); gpu_force_video_timing = ParseForceVideoTimingName( si.GetStringValue("GPU", "ForceVideoTiming", GetForceVideoTimingName(DEFAULT_FORCE_VIDEO_TIMING_MODE)).c_str()) @@ -250,9 +249,9 @@ void Settings::Load(SettingsInterface& si, SettingsInterface& controller_si) SetPGXPDepthClearThreshold(si.GetFloatValue("GPU", "PGXPDepthClearThreshold", DEFAULT_GPU_PGXP_DEPTH_THRESHOLD)); display_deinterlacing_mode = - ParseDisplayDeinterlacingMode(si.GetStringValue("Display", "DeinterlacingMode", - GetDisplayDeinterlacingModeName(DEFAULT_DISPLAY_DEINTERLACING_MODE)) - .c_str()) + ParseDisplayDeinterlacingMode( + si.GetStringValue("GPU", "DeinterlacingMode", GetDisplayDeinterlacingModeName(DEFAULT_DISPLAY_DEINTERLACING_MODE)) + .c_str()) .value_or(DEFAULT_DISPLAY_DEINTERLACING_MODE); display_crop_mode = ParseDisplayCropMode( @@ -539,7 +538,6 @@ void Settings::Save(SettingsInterface& si, bool ignore_base) const si.SetStringValue("GPU", "DownsampleMode", GetDownsampleModeName(gpu_downsample_mode)); si.SetUIntValue("GPU", "DownsampleScale", gpu_downsample_scale); si.SetStringValue("GPU", "WireframeMode", GetGPUWireframeModeName(gpu_wireframe_mode)); - si.SetBoolValue("GPU", "DisableInterlacing", gpu_disable_interlacing); si.SetStringValue("GPU", "ForceVideoTiming", GetForceVideoTimingName(gpu_force_video_timing)); si.SetBoolValue("GPU", "WidescreenHack", gpu_widescreen_hack); si.SetBoolValue("GPU", "ChromaSmoothing24Bit", display_24bit_chroma_smoothing); @@ -555,7 +553,7 @@ void Settings::Save(SettingsInterface& si, bool ignore_base) const si.SetBoolValue("GPU", "PGXPDisableOn2DPolygons", gpu_pgxp_disable_2d); si.SetFloatValue("GPU", "PGXPDepthClearThreshold", GetPGXPDepthClearThreshold()); - si.SetStringValue("Display", "DeinterlacingMode", GetDisplayDeinterlacingModeName(display_deinterlacing_mode)); + si.SetStringValue("GPU", "DeinterlacingMode", GetDisplayDeinterlacingModeName(display_deinterlacing_mode)); si.SetStringValue("Display", "CropMode", GetDisplayCropModeName(display_crop_mode)); si.SetIntValue("Display", "ActiveStartOffset", display_active_start_offset); si.SetIntValue("Display", "ActiveEndOffset", display_active_end_offset); @@ -748,10 +746,10 @@ void Settings::FixIncompatibleSettings(bool display_osd_messages) g_settings.gpu_texture_filter = GPUTextureFilter::Nearest; g_settings.gpu_sprite_texture_filter = GPUTextureFilter::Nearest; g_settings.gpu_line_detect_mode = GPULineDetectMode::Disabled; - g_settings.gpu_disable_interlacing = false; g_settings.gpu_force_video_timing = ForceVideoTimingMode::Disabled; g_settings.gpu_widescreen_hack = false; g_settings.gpu_pgxp_enable = false; + g_settings.display_deinterlacing_mode = DisplayDeinterlacingMode::Adaptive; g_settings.display_24bit_chroma_smoothing = false; g_settings.cdrom_read_speedup = 1; g_settings.cdrom_seek_speedup = 1; @@ -1323,12 +1321,14 @@ static constexpr const std::array s_display_deinterlacing_mode_names = { "Weave", "Blend", "Adaptive", + "Progressive", }; static constexpr const std::array s_display_deinterlacing_mode_display_names = { TRANSLATE_NOOP("DisplayDeinterlacingMode", "Disabled (Flickering)"), TRANSLATE_NOOP("DisplayDeinterlacingMode", "Weave (Combing)"), TRANSLATE_NOOP("DisplayDeinterlacingMode", "Blend (Blur)"), TRANSLATE_NOOP("DisplayDeinterlacingMode", "Adaptive (FastMAD)"), + TRANSLATE_NOOP("DisplayDeinterlacingMode", "Progressive (Optimal)"), }; std::optional Settings::ParseDisplayDeinterlacingMode(const char* str) diff --git a/src/core/settings.h b/src/core/settings.h index 1352646dd..a310a32bb 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -121,7 +121,6 @@ struct Settings bool gpu_scaled_dithering : 1 = true; bool gpu_force_round_texcoords : 1 = false; bool gpu_accurate_blending : 1 = false; - bool gpu_disable_interlacing : 1 = true; bool gpu_widescreen_hack : 1 = false; bool gpu_pgxp_enable : 1 = false; bool gpu_pgxp_culling : 1 = true; @@ -490,7 +489,7 @@ struct Settings static constexpr CPUFastmemMode DEFAULT_CPU_FASTMEM_MODE = CPUFastmemMode::LUT; #endif - static constexpr DisplayDeinterlacingMode DEFAULT_DISPLAY_DEINTERLACING_MODE = DisplayDeinterlacingMode::Adaptive; + static constexpr DisplayDeinterlacingMode DEFAULT_DISPLAY_DEINTERLACING_MODE = DisplayDeinterlacingMode::Progressive; static constexpr DisplayCropMode DEFAULT_DISPLAY_CROP_MODE = DisplayCropMode::Overscan; static constexpr DisplayAspectRatio DEFAULT_DISPLAY_ASPECT_RATIO = DisplayAspectRatio::Auto; static constexpr DisplayAlignment DEFAULT_DISPLAY_ALIGNMENT = DisplayAlignment::Center; diff --git a/src/core/system.cpp b/src/core/system.cpp index 59b0db5e0..529e37eb3 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -4303,7 +4303,6 @@ void System::CheckForSettingsChanges(const Settings& old_settings) g_settings.gpu_texture_filter != old_settings.gpu_texture_filter || g_settings.gpu_sprite_texture_filter != old_settings.gpu_sprite_texture_filter || g_settings.gpu_line_detect_mode != old_settings.gpu_line_detect_mode || - g_settings.gpu_disable_interlacing != old_settings.gpu_disable_interlacing || g_settings.gpu_force_video_timing != old_settings.gpu_force_video_timing || g_settings.gpu_downsample_mode != old_settings.gpu_downsample_mode || g_settings.gpu_downsample_scale != old_settings.gpu_downsample_scale || @@ -4586,8 +4585,8 @@ void System::WarnAboutUnsafeSettings() { APPEND_SUBMESSAGE(TRANSLATE_SV("System", "Texture filtering disabled.")); } - if (g_settings.gpu_disable_interlacing) - APPEND_SUBMESSAGE(TRANSLATE_SV("System", "Interlaced rendering and display enabled.")); + if (g_settings.display_deinterlacing_mode == DisplayDeinterlacingMode::Progressive) + APPEND_SUBMESSAGE(TRANSLATE_SV("System", "Interlaced rendering enabled.")); if (g_settings.gpu_force_video_timing != ForceVideoTimingMode::Disabled) APPEND_SUBMESSAGE(TRANSLATE_SV("System", "Video timings set to default.")); if (g_settings.gpu_widescreen_hack) diff --git a/src/core/types.h b/src/core/types.h index 598e074f0..cbef5ad79 100644 --- a/src/core/types.h +++ b/src/core/types.h @@ -84,6 +84,7 @@ enum class DisplayDeinterlacingMode : u8 Weave, Blend, Adaptive, + Progressive, Count }; diff --git a/src/duckstation-qt/graphicssettingswidget.cpp b/src/duckstation-qt/graphicssettingswidget.cpp index 4efab82fd..d433e880e 100644 --- a/src/duckstation-qt/graphicssettingswidget.cpp +++ b/src/duckstation-qt/graphicssettingswidget.cpp @@ -66,7 +66,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* "CustomAspectRatioDenominator", 1); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.widescreenHack, "GPU", "WidescreenHack", false); SettingWidgetBinder::BindWidgetToEnumSetting( - sif, m_ui.displayDeinterlacing, "Display", "DeinterlacingMode", &Settings::ParseDisplayDeinterlacingMode, + sif, m_ui.displayDeinterlacing, "GPU", "DeinterlacingMode", &Settings::ParseDisplayDeinterlacingMode, &Settings::GetDisplayDeinterlacingModeName, Settings::DEFAULT_DISPLAY_DEINTERLACING_MODE); SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.displayCropMode, "Display", "CropMode", &Settings::ParseDisplayCropMode, &Settings::GetDisplayCropModeName, @@ -79,7 +79,6 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* Settings::DEFAULT_FORCE_VIDEO_TIMING_MODE); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.gpuDownsampleScale, "GPU", "DownsampleScale", 1); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.trueColor, "GPU", "TrueColor", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableInterlacing, "GPU", "DisableInterlacing", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pgxpEnable, "GPU", "PGXPEnable", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pgxpDepthBuffer, "GPU", "PGXPDepthBuffer", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.force43For24Bit, "Display", "Force4_3For24Bit", false); @@ -104,8 +103,6 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* !m_dialog->hasGameTrait(GameDatabase::Trait::DisableTextureFiltering)); SettingWidgetBinder::SetAvailability(m_ui.trueColor, !m_dialog->hasGameTrait(GameDatabase::Trait::DisableTrueColor)); SettingWidgetBinder::SetAvailability(m_ui.pgxpEnable, !m_dialog->hasGameTrait(GameDatabase::Trait::DisablePGXP)); - SettingWidgetBinder::SetAvailability(m_ui.disableInterlacing, - !m_dialog->hasGameTrait(GameDatabase::Trait::ForceInterlacing)); SettingWidgetBinder::SetAvailability(m_ui.widescreenHack, !m_dialog->hasGameTrait(GameDatabase::Trait::DisableWidescreen)); @@ -325,8 +322,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* m_ui.displayDeinterlacing, tr("Deinterlacing"), QString::fromUtf8(Settings::GetDisplayDeinterlacingModeName(Settings::DEFAULT_DISPLAY_DEINTERLACING_MODE)), tr("Determines which algorithm is used to convert interlaced frames to progressive for display on your system. " - "Generally, the \"Disable Interlacing\" enhancement provides better quality output, but some games require " - "interlaced rendering.")); + "Using progressive rendering provides the best quality output, but some games require interlaced rendering.")); dialog->registerWidgetHelp( m_ui.displayCropMode, tr("Crop"), QString::fromUtf8(Settings::GetDisplayCropModeDisplayName(Settings::DEFAULT_DISPLAY_CROP_MODE)), @@ -366,12 +362,6 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* tr("Switches back to 4:3 display aspect ratio when displaying 24-bit content, usually FMVs.")); dialog->registerWidgetHelp(m_ui.chromaSmoothingFor24Bit, tr("FMV Chroma Smoothing"), tr("Unchecked"), tr("Smooths out blockyness between colour transitions in 24-bit content, usually FMVs.")); - dialog->registerWidgetHelp( - m_ui.disableInterlacing, tr("Disable Interlacing"), tr("Checked"), - tr( - "Forces the rendering and display of frames to progressive mode.
This removes the \"combing\" effect seen in " - "480i games by rendering them in 480p. Usually safe to enable.
May not be compatible with all " - "games.")); // Advanced Tab diff --git a/src/duckstation-qt/graphicssettingswidget.ui b/src/duckstation-qt/graphicssettingswidget.ui index caeebe742..1ed5f9579 100644 --- a/src/duckstation-qt/graphicssettingswidget.ui +++ b/src/duckstation-qt/graphicssettingswidget.ui @@ -7,7 +7,7 @@ 0 0 584 - 450 + 477 @@ -203,17 +203,10 @@ - - + + - PGXP Depth Buffer (Low Compatibility) - - - - - - - Disable Interlacing + Widescreen Rendering @@ -224,13 +217,6 @@ - - - - True Color Rendering - - - @@ -238,10 +224,10 @@ - - + + - Widescreen Rendering + True Color Rendering @@ -252,6 +238,13 @@ + + + + PGXP Depth Buffer (Low Compatibility) + + + diff --git a/src/duckstation-qt/settingswindow.ui b/src/duckstation-qt/settingswindow.ui index 1478fd80b..c0851e92c 100644 --- a/src/duckstation-qt/settingswindow.ui +++ b/src/duckstation-qt/settingswindow.ui @@ -7,7 +7,7 @@ 0 0 780 - 650 + 655