aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Image/Texture.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/Texture.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/Texture.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Image/Texture.cs27
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();