From 658cdbb5de27e28a6f21e9fb51fc0d7084dfe105 Mon Sep 17 00:00:00 2001 From: bomabomabomaboma <69987043+goldislead@users.noreply.github.com> Date: Sat, 1 Aug 2026 00:54:24 +0000 Subject: [PATCH] [Vulkan] Disable anisotropy for ineligible texture formats The check is moved after the anisotropy resolution (and the anisotropic override) so it sees, and can reset, the final filter state. Co-authored-by: Herman S. <429230+has207@users.noreply.github.com> --- src/xenia/gpu/vulkan/vulkan_texture_cache.cc | 48 ++++++++++---------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/xenia/gpu/vulkan/vulkan_texture_cache.cc b/src/xenia/gpu/vulkan/vulkan_texture_cache.cc index 435507000..24cea9493 100644 --- a/src/xenia/gpu/vulkan/vulkan_texture_cache.cc +++ b/src/xenia/gpu/vulkan/vulkan_texture_cache.cc @@ -688,29 +688,6 @@ VulkanTextureCache::SamplerParameters VulkanTextureCache::GetSamplerParameters( ? fetch.mip_filter : binding.mip_filter; parameters.mip_linear = mip_filter == xenos::TextureFilter::kLinear; - if (parameters.mag_linear || parameters.min_linear || parameters.mip_linear) { - // Check if the texture is actually filterable on the host. - bool linear_filterable = true; - TextureKey texture_key; - uint8_t texture_swizzled_signs; - BindingInfoFromFetchConstant(fetch, texture_key, &texture_swizzled_signs); - if (texture_key.is_valid) { - const HostFormatPair& host_format_pair = GetHostFormatPair(texture_key); - if ((texture_util::IsAnySignNotSigned(texture_swizzled_signs) && - !host_format_pair.format_unsigned.linear_filterable) || - (texture_util::IsAnySignSigned(texture_swizzled_signs) && - !host_format_pair.format_signed.linear_filterable)) { - linear_filterable = false; - } - } else { - linear_filterable = false; - } - if (!linear_filterable) { - parameters.mag_linear = 0; - parameters.min_linear = 0; - parameters.mip_linear = 0; - } - } xenos::AnisoFilter aniso_filter = binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst ? fetch.aniso_filter @@ -734,6 +711,31 @@ VulkanTextureCache::SamplerParameters VulkanTextureCache::GetSamplerParameters( } parameters.aniso_filter = std::min(aniso_filter, max_anisotropy_); + // Fall back to point sampling if the host can't linearly filter the formats + // the texture will be sampled through. Anisotropic filtering implies linear + // filtering too. + if (parameters.mag_linear || parameters.min_linear || parameters.mip_linear || + parameters.aniso_filter != xenos::AnisoFilter::kDisabled) { + bool linear_filterable = false; + TextureKey texture_key; + uint8_t texture_swizzled_signs; + BindingInfoFromFetchConstant(fetch, texture_key, &texture_swizzled_signs); + if (texture_key.is_valid) { + const HostFormatPair& host_format_pair = GetHostFormatPair(texture_key); + linear_filterable = + (!texture_util::IsAnySignNotSigned(texture_swizzled_signs) || + host_format_pair.format_unsigned.linear_filterable) && + (!texture_util::IsAnySignSigned(texture_swizzled_signs) || + host_format_pair.format_signed.linear_filterable); + } + if (!linear_filterable) { + parameters.mag_linear = 0; + parameters.min_linear = 0; + parameters.mip_linear = 0; + parameters.aniso_filter = xenos::AnisoFilter::kDisabled; + } + } + return parameters; }