video_core: Fallback to default anisotropy instead to 1x anisotropy
This commit is contained in:
parent
745d16132b
commit
a3b7b5b22a
|
@ -488,7 +488,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
|
||||||
const bool use_fallback_sampler{sampler.HasAddedAnisotropy() &&
|
const bool use_fallback_sampler{sampler.HasAddedAnisotropy() &&
|
||||||
!image_view.SupportsAnisotropy()};
|
!image_view.SupportsAnisotropy()};
|
||||||
gl_samplers[sampler_binding++] =
|
gl_samplers[sampler_binding++] =
|
||||||
use_fallback_sampler ? sampler.HandleWithoutAnisotropy() : sampler.Handle();
|
use_fallback_sampler ? sampler.HandleWithDefaultAnisotropy() : sampler.Handle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const auto& desc : info.image_descriptors) {
|
for (const auto& desc : info.image_descriptors) {
|
||||||
|
|
|
@ -1306,8 +1306,10 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const TSCEntry& config) {
|
||||||
};
|
};
|
||||||
|
|
||||||
sampler = create_sampler(max_anisotropy);
|
sampler = create_sampler(max_anisotropy);
|
||||||
if (Settings::values.max_anisotropy.GetValue() > 0 && max_anisotropy > 1.0f) {
|
|
||||||
sampler_without_anisotropy = create_sampler(1.0f);
|
const f32 max_anisotropy_default = static_cast<f32>(1U << config.max_anisotropy);
|
||||||
|
if (max_anisotropy > max_anisotropy_default) {
|
||||||
|
sampler_default_anisotropy = create_sampler(max_anisotropy_default);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -313,17 +313,17 @@ public:
|
||||||
return sampler.handle;
|
return sampler.handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] GLuint HandleWithoutAnisotropy() const noexcept {
|
[[nodiscard]] GLuint HandleWithDefaultAnisotropy() const noexcept {
|
||||||
return sampler_without_anisotropy.handle;
|
return sampler_default_anisotropy.handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] bool HasAddedAnisotropy() const noexcept {
|
[[nodiscard]] bool HasAddedAnisotropy() const noexcept {
|
||||||
return static_cast<bool>(sampler_without_anisotropy.handle);
|
return static_cast<bool>(sampler_default_anisotropy.handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OGLSampler sampler;
|
OGLSampler sampler;
|
||||||
OGLSampler sampler_without_anisotropy;
|
OGLSampler sampler_default_anisotropy;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Framebuffer {
|
class Framebuffer {
|
||||||
|
|
|
@ -192,7 +192,7 @@ inline void PushImageDescriptors(TextureCache& texture_cache,
|
||||||
const Sampler& sampler{**(samplers++)};
|
const Sampler& sampler{**(samplers++)};
|
||||||
const bool use_fallback_sampler{sampler.HasAddedAnisotropy() &&
|
const bool use_fallback_sampler{sampler.HasAddedAnisotropy() &&
|
||||||
!image_view.SupportsAnisotropy()};
|
!image_view.SupportsAnisotropy()};
|
||||||
const VkSampler vk_sampler{use_fallback_sampler ? sampler.HandleWithoutAnisotropy()
|
const VkSampler vk_sampler{use_fallback_sampler ? sampler.HandleWithDefaultAnisotropy()
|
||||||
: sampler.Handle()};
|
: sampler.Handle()};
|
||||||
guest_descriptor_queue.AddSampledImage(vk_image_view, vk_sampler);
|
guest_descriptor_queue.AddSampledImage(vk_image_view, vk_sampler);
|
||||||
rescaling.PushTexture(texture_cache.IsRescaling(image_view));
|
rescaling.PushTexture(texture_cache.IsRescaling(image_view));
|
||||||
|
|
|
@ -1827,8 +1827,10 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& t
|
||||||
};
|
};
|
||||||
|
|
||||||
sampler = create_sampler(max_anisotropy);
|
sampler = create_sampler(max_anisotropy);
|
||||||
if (Settings::values.max_anisotropy.GetValue() > 0 && max_anisotropy > 1.0f) {
|
|
||||||
sampler_without_anisotropy = create_sampler(1.0f);
|
const f32 max_anisotropy_default = static_cast<f32>(1U << tsc.max_anisotropy);
|
||||||
|
if (max_anisotropy > max_anisotropy_default) {
|
||||||
|
sampler_default_anisotropy = create_sampler(max_anisotropy_default);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -279,17 +279,17 @@ public:
|
||||||
return *sampler;
|
return *sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] VkSampler HandleWithoutAnisotropy() const noexcept {
|
[[nodiscard]] VkSampler HandleWithDefaultAnisotropy() const noexcept {
|
||||||
return *sampler_without_anisotropy;
|
return *sampler_default_anisotropy;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] bool HasAddedAnisotropy() const noexcept {
|
[[nodiscard]] bool HasAddedAnisotropy() const noexcept {
|
||||||
return static_cast<bool>(sampler_without_anisotropy);
|
return static_cast<bool>(sampler_default_anisotropy);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
vk::Sampler sampler;
|
vk::Sampler sampler;
|
||||||
vk::Sampler sampler_without_anisotropy;
|
vk::Sampler sampler_default_anisotropy;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Framebuffer {
|
class Framebuffer {
|
||||||
|
|
|
@ -68,8 +68,8 @@ float TSCEntry::MaxAnisotropy() const noexcept {
|
||||||
const bool has_regular_lods = min_lod_clamp == 0 && max_lod_clamp >= 256;
|
const bool has_regular_lods = min_lod_clamp == 0 && max_lod_clamp >= 256;
|
||||||
const bool is_bilinear_filter = min_filter == TextureFilter::Linear &&
|
const bool is_bilinear_filter = min_filter == TextureFilter::Linear &&
|
||||||
reduction_filter == SamplerReduction::WeightedAverage;
|
reduction_filter == SamplerReduction::WeightedAverage;
|
||||||
if (max_anisotropy == 0 && (depth_compare_enabled.Value() || !has_regular_lods ||
|
if (max_anisotropy == 0 && (depth_compare_enabled || !has_regular_lods || !is_bilinear_filter ||
|
||||||
!is_bilinear_filter || !is_suitable_mipmap_filter)) {
|
!is_suitable_mipmap_filter)) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
const auto anisotropic_settings = Settings::values.max_anisotropy.GetValue();
|
const auto anisotropic_settings = Settings::values.max_anisotropy.GetValue();
|
||||||
|
|
Reference in New Issue