TextureCache: Make a better Anisotropic setter.
This commit is contained in:
		| @@ -1201,7 +1201,14 @@ 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) { | ||||
|         glSamplerParameterf(handle, GL_TEXTURE_MAX_ANISOTROPY, config.MaxAnisotropy()); | ||||
|         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; | ||||
|         glSamplerParameterf(handle, GL_TEXTURE_MAX_ANISOTROPY, max_anisotropy); | ||||
|     } else { | ||||
|         LOG_WARNING(Render_OpenGL, "GL_ARB_texture_filter_anisotropic is required"); | ||||
|     } | ||||
|   | ||||
| @@ -1448,7 +1448,14 @@ 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 float max_anisotropy = std::clamp(tsc.MaxAnisotropy(), 1.0f, 16.0f); | ||||
|     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; | ||||
|  | ||||
|     sampler = device.GetLogical().CreateSampler(VkSamplerCreateInfo{ | ||||
|         .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, | ||||
|         .pNext = pnext, | ||||
|   | ||||
| @@ -6,7 +6,6 @@ | ||||
| #include <array> | ||||
|  | ||||
| #include "common/cityhash.h" | ||||
| #include "common/settings.h" | ||||
| #include "video_core/textures/texture.h" | ||||
|  | ||||
| using Tegra::Texture::TICEntry; | ||||
| @@ -51,22 +50,6 @@ constexpr std::array<float, 256> SRGB_CONVERSION_LUT = { | ||||
|     0.917104f, 0.929242f, 0.941493f, 0.953859f, 0.966338f, 1.000000f, 1.000000f, 1.000000f, | ||||
| }; | ||||
|  | ||||
| unsigned SettingsMinimumAnisotropy() noexcept { | ||||
|     switch (static_cast<Anisotropy>(Settings::values.max_anisotropy.GetValue())) { | ||||
|     default: | ||||
|     case Anisotropy::Default: | ||||
|         return 1U; | ||||
|     case Anisotropy::Filter2x: | ||||
|         return 2U; | ||||
|     case Anisotropy::Filter4x: | ||||
|         return 4U; | ||||
|     case Anisotropy::Filter8x: | ||||
|         return 8U; | ||||
|     case Anisotropy::Filter16x: | ||||
|         return 16U; | ||||
|     } | ||||
| } | ||||
|  | ||||
| } // Anonymous namespace | ||||
|  | ||||
| std::array<float, 4> TSCEntry::BorderColor() const noexcept { | ||||
| @@ -78,7 +61,7 @@ std::array<float, 4> TSCEntry::BorderColor() const noexcept { | ||||
| } | ||||
|  | ||||
| float TSCEntry::MaxAnisotropy() const noexcept { | ||||
|     return static_cast<float>(std::max(1U << max_anisotropy, SettingsMinimumAnisotropy())); | ||||
|     return static_cast<float>(1U << max_anisotropy); | ||||
| } | ||||
|  | ||||
| } // namespace Tegra::Texture | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Fernando Sahmkow
					Fernando Sahmkow