From 4938b99600da9fc6e1241e6aad476286b74850a9 Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Mon, 4 Sep 2023 13:02:17 -0400 Subject: [PATCH] VertexManagerBase: Allow widecreen heuristic constants to be overriden by onion config --- Source/Core/Core/Config/GraphicsSettings.cpp | 4 ++++ Source/Core/Core/Config/GraphicsSettings.h | 2 ++ Source/Core/VideoCommon/VertexManagerBase.cpp | 23 +++++++++++-------- Source/Core/VideoCommon/VideoConfig.cpp | 4 ++++ Source/Core/VideoCommon/VideoConfig.h | 2 ++ 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Source/Core/Core/Config/GraphicsSettings.cpp b/Source/Core/Core/Config/GraphicsSettings.cpp index dc19c65817..0aaab5ded2 100644 --- a/Source/Core/Core/Config/GraphicsSettings.cpp +++ b/Source/Core/Core/Config/GraphicsSettings.cpp @@ -25,6 +25,10 @@ const Info GFX_SUGGESTED_ASPECT_RATIO{{System::GFX, "Settings", "Sug AspectMode::Auto}; const Info GFX_WIDESCREEN_HEURISTIC_TRANSITION_THRESHOLD{ {System::GFX, "Settings", "WidescreenHeuristicTransitionThreshold"}, 3}; +const Info GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_IDEAL{ + {System::GFX, "Settings", "WidescreenHeuristicAspectRatioIdeal"}, (16 / 9.f) / (4 / 3.f)}; +const Info GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_SLOP{ + {System::GFX, "Settings", "WidescreenHeuristicAspectRatioSlop"}, 0.11f}; const Info GFX_CROP{{System::GFX, "Settings", "Crop"}, false}; const Info GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES{ {System::GFX, "Settings", "SafeTextureCacheColorSamples"}, 128}; diff --git a/Source/Core/Core/Config/GraphicsSettings.h b/Source/Core/Core/Config/GraphicsSettings.h index 98c4031cf5..26e741dfde 100644 --- a/Source/Core/Core/Config/GraphicsSettings.h +++ b/Source/Core/Core/Config/GraphicsSettings.h @@ -30,6 +30,8 @@ extern const Info GFX_WIDESCREEN_HACK; extern const Info GFX_ASPECT_RATIO; extern const Info GFX_SUGGESTED_ASPECT_RATIO; extern const Info GFX_WIDESCREEN_HEURISTIC_TRANSITION_THRESHOLD; +extern const Info GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_IDEAL; +extern const Info GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_SLOP; extern const Info GFX_CROP; extern const Info GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES; extern const Info GFX_SHOW_FPS; diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index 564eb684dc..e1d294f331 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -76,26 +76,26 @@ constexpr Common::EnumMap primitive_fr // by ~9% in opposite directions. // Just in case any game decides to take this into account, we do both these // tests with a large amount of slop. -static constexpr float ASPECT_RATIO_SLOP = 0.11f; -static bool IsAnamorphicProjection(const Projection::Raw& projection, const Viewport& viewport) +static bool IsAnamorphicProjection(const Projection::Raw& projection, const Viewport& viewport, + const float ideal_ratio, const float slop) { // If ratio between our projection and viewport aspect ratios is similar to 16:9 / 4:3 - // we have an anamorphic projection. - static constexpr float IDEAL_RATIO = (16 / 9.f) / (4 / 3.f); + // (the "ideal ratio"), we have an anamorphic projection. This value can be overridden + // by a GameINI. const float projection_ar = projection[2] / projection[0]; const float viewport_ar = viewport.wd / viewport.ht; - return std::abs(std::abs(projection_ar / viewport_ar) - IDEAL_RATIO) < - IDEAL_RATIO * ASPECT_RATIO_SLOP; + return std::abs(std::abs(projection_ar / viewport_ar) - ideal_ratio) < ideal_ratio * slop; } -static bool IsNormalProjection(const Projection::Raw& projection, const Viewport& viewport) +static bool IsNormalProjection(const Projection::Raw& projection, const Viewport& viewport, + const float slop) { const float projection_ar = projection[2] / projection[0]; const float viewport_ar = viewport.wd / viewport.ht; - return std::abs(std::abs(projection_ar / viewport_ar) - 1) < ASPECT_RATIO_SLOP; + return std::abs(std::abs(projection_ar / viewport_ar) - 1) < slop; } VertexManagerBase::VertexManagerBase() @@ -507,12 +507,15 @@ void VertexManagerBase::Flush() auto& counts = is_perspective ? m_flush_statistics.perspective : m_flush_statistics.orthographic; - if (IsAnamorphicProjection(xfmem.projection.rawProjection, xfmem.viewport)) + const float ideal_ratio = g_ActiveConfig.widescreen_heuristic_aspect_ratio_ideal; + const float slop = g_ActiveConfig.widescreen_heuristic_aspect_ratio_slop; + + if (IsAnamorphicProjection(xfmem.projection.rawProjection, xfmem.viewport, ideal_ratio, slop)) { ++counts.anamorphic_flush_count; counts.anamorphic_vertex_count += m_index_generator.GetIndexLen(); } - else if (IsNormalProjection(xfmem.projection.rawProjection, xfmem.viewport)) + else if (IsNormalProjection(xfmem.projection.rawProjection, xfmem.viewport, slop)) { ++counts.normal_flush_count; counts.normal_vertex_count += m_index_generator.GetIndexLen(); diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index a5a6d77728..e2096dfd1f 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -88,6 +88,10 @@ void VideoConfig::Refresh() suggested_aspect_mode = Config::Get(Config::GFX_SUGGESTED_ASPECT_RATIO); widescreen_heuristic_transition_threshold = Config::Get(Config::GFX_WIDESCREEN_HEURISTIC_TRANSITION_THRESHOLD); + widescreen_heuristic_aspect_ratio_ideal = + Config::Get(Config::GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_IDEAL); + widescreen_heuristic_aspect_ratio_slop = + Config::Get(Config::GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_SLOP); bCrop = Config::Get(Config::GFX_CROP); iSafeTextureCache_ColorSamples = Config::Get(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES); bShowFPS = Config::Get(Config::GFX_SHOW_FPS); diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index 4a6c1bb811..f4320005a9 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -107,6 +107,8 @@ struct VideoConfig final AspectMode aspect_mode{}; AspectMode suggested_aspect_mode{}; u32 widescreen_heuristic_transition_threshold = 0; + float widescreen_heuristic_aspect_ratio_ideal = 0.f; + float widescreen_heuristic_aspect_ratio_slop = 0.f; bool bCrop = false; // Aspect ratio controls. bool bShaderCache = false;