VertexManagerBase: Allow widecreen heuristic constants to be overriden by onion config

This commit is contained in:
OatmealDome 2023-09-04 13:02:17 -04:00
parent de781a6fa7
commit 4938b99600
5 changed files with 25 additions and 10 deletions

View File

@ -25,6 +25,10 @@ const Info<AspectMode> GFX_SUGGESTED_ASPECT_RATIO{{System::GFX, "Settings", "Sug
AspectMode::Auto}; AspectMode::Auto};
const Info<u32> GFX_WIDESCREEN_HEURISTIC_TRANSITION_THRESHOLD{ const Info<u32> GFX_WIDESCREEN_HEURISTIC_TRANSITION_THRESHOLD{
{System::GFX, "Settings", "WidescreenHeuristicTransitionThreshold"}, 3}; {System::GFX, "Settings", "WidescreenHeuristicTransitionThreshold"}, 3};
const Info<float> GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_IDEAL{
{System::GFX, "Settings", "WidescreenHeuristicAspectRatioIdeal"}, (16 / 9.f) / (4 / 3.f)};
const Info<float> GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_SLOP{
{System::GFX, "Settings", "WidescreenHeuristicAspectRatioSlop"}, 0.11f};
const Info<bool> GFX_CROP{{System::GFX, "Settings", "Crop"}, false}; const Info<bool> GFX_CROP{{System::GFX, "Settings", "Crop"}, false};
const Info<int> GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES{ const Info<int> GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES{
{System::GFX, "Settings", "SafeTextureCacheColorSamples"}, 128}; {System::GFX, "Settings", "SafeTextureCacheColorSamples"}, 128};

View File

@ -30,6 +30,8 @@ extern const Info<bool> GFX_WIDESCREEN_HACK;
extern const Info<AspectMode> GFX_ASPECT_RATIO; extern const Info<AspectMode> GFX_ASPECT_RATIO;
extern const Info<AspectMode> GFX_SUGGESTED_ASPECT_RATIO; extern const Info<AspectMode> GFX_SUGGESTED_ASPECT_RATIO;
extern const Info<u32> GFX_WIDESCREEN_HEURISTIC_TRANSITION_THRESHOLD; extern const Info<u32> GFX_WIDESCREEN_HEURISTIC_TRANSITION_THRESHOLD;
extern const Info<float> GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_IDEAL;
extern const Info<float> GFX_WIDESCREEN_HEURISTIC_ASPECT_RATIO_SLOP;
extern const Info<bool> GFX_CROP; extern const Info<bool> GFX_CROP;
extern const Info<int> GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES; extern const Info<int> GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES;
extern const Info<bool> GFX_SHOW_FPS; extern const Info<bool> GFX_SHOW_FPS;

View File

@ -76,26 +76,26 @@ constexpr Common::EnumMap<PrimitiveType, Primitive::GX_DRAW_POINTS> primitive_fr
// by ~9% in opposite directions. // by ~9% in opposite directions.
// Just in case any game decides to take this into account, we do both these // Just in case any game decides to take this into account, we do both these
// tests with a large amount of slop. // 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 // If ratio between our projection and viewport aspect ratios is similar to 16:9 / 4:3
// we have an anamorphic projection. // (the "ideal ratio"), we have an anamorphic projection. This value can be overridden
static constexpr float IDEAL_RATIO = (16 / 9.f) / (4 / 3.f); // by a GameINI.
const float projection_ar = projection[2] / projection[0]; const float projection_ar = projection[2] / projection[0];
const float viewport_ar = viewport.wd / viewport.ht; const float viewport_ar = viewport.wd / viewport.ht;
return std::abs(std::abs(projection_ar / viewport_ar) - IDEAL_RATIO) < return std::abs(std::abs(projection_ar / viewport_ar) - ideal_ratio) < ideal_ratio * slop;
IDEAL_RATIO * ASPECT_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 projection_ar = projection[2] / projection[0];
const float viewport_ar = viewport.wd / viewport.ht; 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() VertexManagerBase::VertexManagerBase()
@ -507,12 +507,15 @@ void VertexManagerBase::Flush()
auto& counts = auto& counts =
is_perspective ? m_flush_statistics.perspective : m_flush_statistics.orthographic; 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_flush_count;
counts.anamorphic_vertex_count += m_index_generator.GetIndexLen(); 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_flush_count;
counts.normal_vertex_count += m_index_generator.GetIndexLen(); counts.normal_vertex_count += m_index_generator.GetIndexLen();

View File

@ -88,6 +88,10 @@ void VideoConfig::Refresh()
suggested_aspect_mode = Config::Get(Config::GFX_SUGGESTED_ASPECT_RATIO); suggested_aspect_mode = Config::Get(Config::GFX_SUGGESTED_ASPECT_RATIO);
widescreen_heuristic_transition_threshold = widescreen_heuristic_transition_threshold =
Config::Get(Config::GFX_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); bCrop = Config::Get(Config::GFX_CROP);
iSafeTextureCache_ColorSamples = Config::Get(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES); iSafeTextureCache_ColorSamples = Config::Get(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES);
bShowFPS = Config::Get(Config::GFX_SHOW_FPS); bShowFPS = Config::Get(Config::GFX_SHOW_FPS);

View File

@ -107,6 +107,8 @@ struct VideoConfig final
AspectMode aspect_mode{}; AspectMode aspect_mode{};
AspectMode suggested_aspect_mode{}; AspectMode suggested_aspect_mode{};
u32 widescreen_heuristic_transition_threshold = 0; 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 bCrop = false; // Aspect ratio controls.
bool bShaderCache = false; bool bShaderCache = false;