Jelajahi Sumber

TextureCache: Add automatic anisotropic filtering and refactor code.

Fernando Sahmkow 4 tahun lalu
induk
melakukan
282e04bffb

+ 1 - 1
src/common/settings.h

@@ -515,7 +515,7 @@ struct Values {
 #endif
         FullscreenMode::Borderless, FullscreenMode::Exclusive, "fullscreen_mode"};
     RangedSetting<int> aspect_ratio{0, 0, 3, "aspect_ratio"};
-    RangedSetting<int> max_anisotropy{0, 0, 4, "max_anisotropy"};
+    RangedSetting<int> max_anisotropy{0, 0, 5, "max_anisotropy"};
     Setting<bool> use_speed_limit{true, "use_speed_limit"};
     RangedSetting<u16> speed_limit{100, 0, 9999, "speed_limit"};
     Setting<bool> use_disk_shader_cache{true, "use_disk_shader_cache"};

+ 1 - 7
src/video_core/renderer_opengl/gl_texture_cache.cpp

@@ -1201,13 +1201,7 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const TSCEntry& config) {
     glSamplerParameterfv(handle, GL_TEXTURE_BORDER_COLOR, config.BorderColor().data());
 
     if (GLAD_GL_ARB_texture_filter_anisotropic || GLAD_GL_EXT_texture_filter_anisotropic) {
-        const f32 setting_anisotropic =
-            static_cast<f32>(1U << Settings::values.max_anisotropy.GetValue());
-        const f32 game_anisotropic = std::clamp(config.MaxAnisotropy(), 1.0f, 16.0f);
-        const bool aument_anisotropic =
-            game_anisotropic > 1.0f || config.mipmap_filter == TextureMipmapFilter::Linear;
-        const f32 max_anisotropy =
-            aument_anisotropic ? std::max(game_anisotropic, setting_anisotropic) : game_anisotropic;
+        const f32 max_anisotropy = std::clamp(config.MaxAnisotropy(), 1.0f, 16.0f);
         glSamplerParameterf(handle, GL_TEXTURE_MAX_ANISOTROPY, max_anisotropy);
     } else {
         LOG_WARNING(Render_OpenGL, "GL_ARB_texture_filter_anisotropic is required");

+ 1 - 7
src/video_core/renderer_vulkan/vk_texture_cache.cpp

@@ -1448,13 +1448,7 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& t
         LOG_WARNING(Render_Vulkan, "VK_EXT_sampler_filter_minmax is required");
     }
     // Some games have samplers with garbage. Sanitize them here.
-    const f32 setting_anisotropic =
-        static_cast<f32>(1U << Settings::values.max_anisotropy.GetValue());
-    const f32 game_anisotropic = std::clamp(tsc.MaxAnisotropy(), 1.0f, 16.0f);
-    const bool aument_anisotropic =
-        game_anisotropic > 1.0f || tsc.mipmap_filter == TextureMipmapFilter::Linear;
-    const f32 max_anisotropy =
-        aument_anisotropic ? std::max(game_anisotropic, setting_anisotropic) : game_anisotropic;
+    const f32 max_anisotropy = std::clamp(tsc.MaxAnisotropy(), 1.0f, 16.0f);
 
     sampler = device.GetLogical().CreateSampler(VkSamplerCreateInfo{
         .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,

+ 14 - 1
src/video_core/textures/texture.cpp

@@ -6,6 +6,7 @@
 #include <array>
 
 #include "common/cityhash.h"
+#include "common/settings.h"
 #include "video_core/textures/texture.h"
 
 using Tegra::Texture::TICEntry;
@@ -61,7 +62,19 @@ std::array<float, 4> TSCEntry::BorderColor() const noexcept {
 }
 
 float TSCEntry::MaxAnisotropy() const noexcept {
-    return static_cast<float>(1U << max_anisotropy);
+    if (max_anisotropy == 0 && mipmap_filter != TextureMipmapFilter::Linear) {
+        return 1.0f;
+    }
+    const auto anisotropic_settings = Settings::values.max_anisotropy.GetValue();
+    u32 new_max_anisotropic{};
+    if (anisotropic_settings == 0) {
+        const auto anisotropic_based_onscale = Settings::values.resolution_info.up_scale >>
+                                               Settings::values.resolution_info.down_shift;
+        new_max_anisotropic = std::max(anisotropic_based_onscale + 1U, 1U);
+    } else {
+        new_max_anisotropic = Settings::values.max_anisotropy.GetValue();
+    }
+    return static_cast<float>(1U << std::min(max_anisotropy + anisotropic_settings - 1, 31U));
 }
 
 } // namespace Tegra::Texture

+ 5 - 0
src/yuzu/configuration/configure_graphics_advanced.ui

@@ -123,6 +123,11 @@
            </item>
            <item>
             <widget class="QComboBox" name="anisotropic_filtering_combobox">
+             <item>
+              <property name="text">
+               <string>Automatic</string>
+              </property>
+             </item>
              <item>
               <property name="text">
                <string>Default</string>