From 5fb6ceac452fa7960301d132f2f044073045564a Mon Sep 17 00:00:00 2001 From: Tommaso Checchi Date: Wed, 18 Oct 2017 02:02:56 -0700 Subject: Fixed fog, lava, water in Mario Galaxy (and possibly other games) in higher IRs by detecting & fixing the mipmaps that aren't just used for downscaling, but are handmade to create a gradient. --- Source/Core/VideoCommon/VertexManagerBase.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoCommon/VertexManagerBase.cpp') diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index 9138b0db09..870b9ad1e2 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -209,7 +209,7 @@ std::pair VertexManagerBase::ResetFlushAspectRatioCount() return val; } -static void SetSamplerState(u32 index, bool custom_tex) +static void SetSamplerState(u32 index, bool custom_tex, bool has_arbitrary_mips) { const FourTexUnits& tex = bpmem.tex[index / 4]; const TexMode0& tm0 = tex.texMode0[index % 4]; @@ -252,6 +252,18 @@ static void SetSamplerState(u32 index, bool custom_tex) state.anisotropic_filtering = 0; } + if (has_arbitrary_mips && SamplerCommon::AreBpTexMode0MipmapsEnabled(tm0)) + { + // Apply a secondary bias calculated from the IR scale to pull inwards mipmaps + // that have arbitrary contents, eg. are used for fog effects where the + // distance they kick in at is important to preserve at any resolution. + state.lod_bias = + state.lod_bias + std::log2(static_cast(g_ActiveConfig.iEFBScale)) * 256.f; + + // Anisotropic also pushes mips farther away so it cannot be used either + state.anisotropic_filtering = 0; + } + g_renderer->SetSamplerState(index, state); } @@ -323,7 +335,7 @@ void VertexManagerBase::Flush() if (tentry) { - SetSamplerState(i, tentry->is_custom_tex); + SetSamplerState(i, tentry->is_custom_tex, tentry->has_arbitrary_mips); PixelShaderManager::SetTexDims(i, tentry->native_width, tentry->native_height); } else -- cgit v1.2.3