aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Image/Sampler.cs
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2021-12-08 21:09:36 +0000
committerGitHub <noreply@github.com>2021-12-08 18:09:36 -0300
commitbc4e70b6fafc333c91caf5a94e49ece339dccd80 (patch)
tree5f00eb22d749a3675fb53c01a9b65a4da5568dfc /Ryujinx.Graphics.Gpu/Image/Sampler.cs
parent650cc41c02e4b7305750e23f855cdc7ce533a1b2 (diff)
Move texture anisotropy check to SetInfo (#2843)
Rather than calculating this for every sampler, this PR calculates if a texture can force anisotropy when its info is set, and exposes the value via a public boolean. This should help texture/sampler heavy games when anisotropic filtering is not Auto, like UE4 ones (or so i hear?). There is another cost where samplers are created twice when anisotropic filtering is enabled, but I'm not sure how relevant this one is.
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image/Sampler.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Image/Sampler.cs24
1 files changed, 1 insertions, 23 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/Sampler.cs b/Ryujinx.Graphics.Gpu/Image/Sampler.cs
index 52d5ccec..f8923d34 100644
--- a/Ryujinx.Graphics.Gpu/Image/Sampler.cs
+++ b/Ryujinx.Graphics.Gpu/Image/Sampler.cs
@@ -1,6 +1,5 @@
using Ryujinx.Graphics.GAL;
using System;
-using System.Numerics;
namespace Ryujinx.Graphics.Gpu.Image
{
@@ -9,8 +8,6 @@ namespace Ryujinx.Graphics.Gpu.Image
/// </summary>
class Sampler : IDisposable
{
- private const int MinLevelsForAnisotropic = 5;
-
/// <summary>
/// Host sampler object.
/// </summary>
@@ -96,26 +93,7 @@ namespace Ryujinx.Graphics.Gpu.Image
/// <returns>A host sampler</returns>
public ISampler GetHostSampler(Texture texture)
{
- return _anisoSampler != null && AllowForceAnisotropy(texture) ? _anisoSampler : _hostSampler;
- }
-
- /// <summary>
- /// Determine if the given texture can have anisotropic filtering forced.
- /// Filtered textures that we might want to force anisotropy on should have a lot of mip levels.
- /// </summary>
- /// <param name="texture">The texture</param>
- /// <returns>True if anisotropic filtering can be forced, false otherwise</returns>
- private static bool AllowForceAnisotropy(Texture texture)
- {
- if (texture == null || !(texture.Target == Target.Texture2D || texture.Target == Target.Texture2DArray))
- {
- return false;
- }
-
- int maxSize = Math.Max(texture.Info.Width, texture.Info.Height);
- int maxLevels = BitOperations.Log2((uint)maxSize) + 1;
-
- return texture.Info.Levels >= Math.Min(MinLevelsForAnisotropic, maxLevels);
+ return _anisoSampler != null && texture?.CanForceAnisotropy == true ? _anisoSampler : _hostSampler;
}
/// <summary>