@@ -209,7 +209,7 @@ std::pair<size_t, size_t> 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<float>(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