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
///
class Sampler : IDisposable
{
- private const int MinLevelsForAnisotropic = 5;
-
///
/// Host sampler object.
///
@@ -96,26 +93,7 @@ namespace Ryujinx.Graphics.Gpu.Image
/// A host sampler
public ISampler GetHostSampler(Texture texture)
{
- return _anisoSampler != null && AllowForceAnisotropy(texture) ? _anisoSampler : _hostSampler;
- }
-
- ///
- /// 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.
- ///
- /// The texture
- /// True if anisotropic filtering can be forced, false otherwise
- 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;
}
///
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;
@@ -49,6 +52,11 @@ namespace Ryujinx.Graphics.Gpu.Image
///
public TextureInfo Info { get; private set; }
+ ///
+ /// Set when anisotropic filtering can be forced on the given texture.
+ ///
+ public bool CanForceAnisotropy { get; private set; }
+
///
/// Host scale factor.
///
@@ -1129,6 +1137,24 @@ namespace Ryujinx.Graphics.Gpu.Image
return null;
}
+ ///
+ /// 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.
+ ///
+ /// True if anisotropic filtering can be forced, false otherwise
+ 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);
+ }
+
///
/// 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
@@ -1219,6 +1245,7 @@ namespace Ryujinx.Graphics.Gpu.Image
{
Info = info;
Target = info.Target;
+ CanForceAnisotropy = CanTextureForceAnisotropy();
_depth = info.GetDepth();
_layers = info.GetLayers();