diff options
| author | riperiperi <rhy3756547@hotmail.com> | 2021-12-08 21:09:36 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-08 18:09:36 -0300 |
| commit | bc4e70b6fafc333c91caf5a94e49ece339dccd80 (patch) | |
| tree | 5f00eb22d749a3675fb53c01a9b65a4da5568dfc /Ryujinx.Graphics.Gpu/Image/Texture.cs | |
| parent | 650cc41c02e4b7305750e23f855cdc7ce533a1b2 (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/Texture.cs')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Image/Texture.cs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/Texture.cs b/Ryujinx.Graphics.Gpu/Image/Texture.cs index 7cc8faf6..a13edc69 100644 --- a/Ryujinx.Graphics.Gpu/Image/Texture.cs +++ b/Ryujinx.Graphics.Gpu/Image/Texture.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Numerics; namespace Ryujinx.Graphics.Gpu.Image { @@ -23,6 +24,8 @@ namespace Ryujinx.Graphics.Gpu.Image // This method uses much more memory so we want to avoid it if possible. private const int ByteComparisonSwitchThreshold = 4; + private const int MinLevelsForForceAnisotropy = 5; + private struct TexturePoolOwner { public TexturePool Pool; @@ -50,6 +53,11 @@ namespace Ryujinx.Graphics.Gpu.Image public TextureInfo Info { get; private set; } /// <summary> + /// Set when anisotropic filtering can be forced on the given texture. + /// </summary> + public bool CanForceAnisotropy { get; private set; } + + /// <summary> /// Host scale factor. /// </summary> public float ScaleFactor { get; private set; } @@ -1130,6 +1138,24 @@ namespace Ryujinx.Graphics.Gpu.Image } /// <summary> + /// Determine if this texture can have anisotropic filtering forced. + /// Filtered textures that we might want to force anisotropy on should have a lot of mip levels. + /// </summary> + /// <returns>True if anisotropic filtering can be forced, false otherwise</returns> + private bool CanTextureForceAnisotropy() + { + if (!(Target == Target.Texture2D || Target == Target.Texture2DArray)) + { + return false; + } + + int maxSize = Math.Max(Info.Width, Info.Height); + int maxLevels = BitOperations.Log2((uint)maxSize) + 1; + + return Info.Levels >= Math.Min(MinLevelsForForceAnisotropy, maxLevels); + } + + /// <summary> /// Check if this texture and the specified target have the same number of dimensions. /// For the purposes of this comparison, 2D and 2D Multisample textures are not considered to have /// the same number of dimensions. Same for Cubemap and 3D textures. @@ -1219,6 +1245,7 @@ namespace Ryujinx.Graphics.Gpu.Image { Info = info; Target = info.Target; + CanForceAnisotropy = CanTextureForceAnisotropy(); _depth = info.GetDepth(); _layers = info.GetLayers(); |
