Просмотр исходного кода

video_core: Fallback to default anisotropy instead to 1x anisotropy

Wollnashorn 3 лет назад
Родитель
Сommit
a3b7b5b22a

+ 1 - 1
src/video_core/renderer_opengl/gl_graphics_pipeline.cpp

@@ -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) {

+ 4 - 2
src/video_core/renderer_opengl/gl_texture_cache.cpp

@@ -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);
     }
     }
 }
 }
 
 

+ 4 - 4
src/video_core/renderer_opengl/gl_texture_cache.h

@@ -313,17 +313,17 @@ public:
         return sampler.handle;
         return sampler.handle;
     }
     }
 
 
-    [[nodiscard]] GLuint HandleWithoutAnisotropy() const noexcept {
-        return sampler_without_anisotropy.handle;
+    [[nodiscard]] GLuint HandleWithDefaultAnisotropy() const noexcept {
+        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 {

+ 1 - 1
src/video_core/renderer_vulkan/pipeline_helper.h

@@ -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));

+ 4 - 2
src/video_core/renderer_vulkan/vk_texture_cache.cpp

@@ -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);
     }
     }
 }
 }
 
 

+ 4 - 4
src/video_core/renderer_vulkan/vk_texture_cache.h

@@ -279,17 +279,17 @@ public:
         return *sampler;
         return *sampler;
     }
     }
 
 
-    [[nodiscard]] VkSampler HandleWithoutAnisotropy() const noexcept {
-        return *sampler_without_anisotropy;
+    [[nodiscard]] VkSampler HandleWithDefaultAnisotropy() const noexcept {
+        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 {

+ 2 - 2
src/video_core/textures/texture.cpp

@@ -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 ||
-                                !is_bilinear_filter || !is_suitable_mipmap_filter)) {
+    if (max_anisotropy == 0 && (depth_compare_enabled || !has_regular_lods || !is_bilinear_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();