[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>
This commit is contained in:
committed by
Radosław Gliński
parent
1fdbe569e4
commit
658cdbb5de
@@ -688,29 +688,6 @@ VulkanTextureCache::SamplerParameters VulkanTextureCache::GetSamplerParameters(
|
|||||||
? fetch.mip_filter
|
? fetch.mip_filter
|
||||||
: binding.mip_filter;
|
: binding.mip_filter;
|
||||||
parameters.mip_linear = mip_filter == xenos::TextureFilter::kLinear;
|
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 =
|
xenos::AnisoFilter aniso_filter =
|
||||||
binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst
|
binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst
|
||||||
? fetch.aniso_filter
|
? fetch.aniso_filter
|
||||||
@@ -734,6 +711,31 @@ VulkanTextureCache::SamplerParameters VulkanTextureCache::GetSamplerParameters(
|
|||||||
}
|
}
|
||||||
parameters.aniso_filter = std::min(aniso_filter, max_anisotropy_);
|
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;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user