TextureCache: Add automatic anisotropic filtering and refactor code.
This commit is contained in:
		| @@ -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"); | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Fernando Sahmkow
					Fernando Sahmkow