aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Image/Texture.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-12-29 14:41:50 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit654e617fe78b0f5cc86d0bcf0625301abff168f5 (patch)
tree01f2eba89039698bec583a3e29c4c50d0e20b8d1 /Ryujinx.Graphics.Gpu/Image/Texture.cs
parentaf8498d6790ba83f1cf87eccf5f272f2ccbeb169 (diff)
Some code cleanup
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image/Texture.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Image/Texture.cs247
1 files changed, 121 insertions, 126 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/Texture.cs b/Ryujinx.Graphics.Gpu/Image/Texture.cs
index 04657f39..544c49af 100644
--- a/Ryujinx.Graphics.Gpu/Image/Texture.cs
+++ b/Ryujinx.Graphics.Gpu/Image/Texture.cs
@@ -1,7 +1,6 @@
using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
-using Ryujinx.Graphics.GAL.Texture;
using Ryujinx.Graphics.Gpu.Memory;
using Ryujinx.Graphics.Texture;
using Ryujinx.Graphics.Texture.Astc;
@@ -15,18 +14,16 @@ namespace Ryujinx.Graphics.Gpu.Image
{
private GpuContext _context;
- private TextureInfo _info;
-
private SizeInfo _sizeInfo;
- public Format Format => _info.FormatInfo.Format;
+ public Format Format => Info.FormatInfo.Format;
- public TextureInfo Info => _info;
+ public TextureInfo Info { get; private set; }
private int _depth;
private int _layers;
- private int _firstLayer;
- private int _firstLevel;
+ private readonly int _firstLayer;
+ private readonly int _firstLevel;
private bool _hasData;
@@ -43,8 +40,8 @@ namespace Ryujinx.Graphics.Gpu.Image
public bool Modified { get; set; }
- public ulong Address => _info.Address;
- public ulong EndAddress => _info.Address + Size;
+ public ulong Address => Info.Address;
+ public ulong EndAddress => Info.Address + Size;
public ulong Size => (ulong)_sizeInfo.TotalSize;
@@ -127,13 +124,13 @@ namespace Ryujinx.Graphics.Gpu.Image
width <<= _firstLevel;
height <<= _firstLevel;
- if (_info.Target == Target.Texture3D)
+ if (Info.Target == Target.Texture3D)
{
depthOrLayers <<= _firstLevel;
}
else
{
- depthOrLayers = _viewStorage._info.DepthOrLayers;
+ depthOrLayers = _viewStorage.Info.DepthOrLayers;
}
_viewStorage.RecreateStorageOrView(width, height, depthOrLayers);
@@ -145,13 +142,13 @@ namespace Ryujinx.Graphics.Gpu.Image
int viewDepthOrLayers;
- if (view._info.Target == Target.Texture3D)
+ if (view.Info.Target == Target.Texture3D)
{
viewDepthOrLayers = Math.Max(1, depthOrLayers >> view._firstLevel);
}
else
{
- viewDepthOrLayers = view._info.DepthOrLayers;
+ viewDepthOrLayers = view.Info.DepthOrLayers;
}
view.RecreateStorageOrView(viewWidth, viewHeight, viewDepthOrLayers);
@@ -161,27 +158,27 @@ namespace Ryujinx.Graphics.Gpu.Image
private void RecreateStorageOrView(int width, int height, int depthOrLayers)
{
SetInfo(new TextureInfo(
- _info.Address,
+ Info.Address,
width,
height,
depthOrLayers,
- _info.Levels,
- _info.SamplesInX,
- _info.SamplesInY,
- _info.Stride,
- _info.IsLinear,
- _info.GobBlocksInY,
- _info.GobBlocksInZ,
- _info.GobBlocksInTileX,
- _info.Target,
- _info.FormatInfo,
- _info.DepthStencilMode,
- _info.SwizzleR,
- _info.SwizzleG,
- _info.SwizzleB,
- _info.SwizzleA));
-
- TextureCreateInfo createInfo = TextureManager.GetCreateInfo(_info, _context.Capabilities);
+ Info.Levels,
+ Info.SamplesInX,
+ Info.SamplesInY,
+ Info.Stride,
+ Info.IsLinear,
+ Info.GobBlocksInY,
+ Info.GobBlocksInZ,
+ Info.GobBlocksInTileX,
+ Info.Target,
+ Info.FormatInfo,
+ Info.DepthStencilMode,
+ Info.SwizzleR,
+ Info.SwizzleG,
+ Info.SwizzleB,
+ Info.SwizzleA));
+
+ TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities);
if (_viewStorage != this)
{
@@ -215,50 +212,50 @@ namespace Ryujinx.Graphics.Gpu.Image
Span<byte> data = _context.PhysicalMemory.Read(Address, Size);
- if (_info.IsLinear)
+ if (Info.IsLinear)
{
data = LayoutConverter.ConvertLinearStridedToLinear(
- _info.Width,
- _info.Height,
- _info.FormatInfo.BlockWidth,
- _info.FormatInfo.BlockHeight,
- _info.Stride,
- _info.FormatInfo.BytesPerPixel,
+ Info.Width,
+ Info.Height,
+ Info.FormatInfo.BlockWidth,
+ Info.FormatInfo.BlockHeight,
+ Info.Stride,
+ Info.FormatInfo.BytesPerPixel,
data);
}
else
{
data = LayoutConverter.ConvertBlockLinearToLinear(
- _info.Width,
- _info.Height,
+ Info.Width,
+ Info.Height,
_depth,
- _info.Levels,
+ Info.Levels,
_layers,
- _info.FormatInfo.BlockWidth,
- _info.FormatInfo.BlockHeight,
- _info.FormatInfo.BytesPerPixel,
- _info.GobBlocksInY,
- _info.GobBlocksInZ,
- _info.GobBlocksInTileX,
+ Info.FormatInfo.BlockWidth,
+ Info.FormatInfo.BlockHeight,
+ Info.FormatInfo.BytesPerPixel,
+ Info.GobBlocksInY,
+ Info.GobBlocksInZ,
+ Info.GobBlocksInTileX,
_sizeInfo,
data);
}
- if (!_context.Capabilities.SupportsAstcCompression && _info.FormatInfo.Format.IsAstc())
+ if (!_context.Capabilities.SupportsAstcCompression && Info.FormatInfo.Format.IsAstc())
{
if (!AstcDecoder.TryDecodeToRgba8(
data.ToArray(),
- _info.FormatInfo.BlockWidth,
- _info.FormatInfo.BlockHeight,
- _info.Width,
- _info.Height,
+ Info.FormatInfo.BlockWidth,
+ Info.FormatInfo.BlockHeight,
+ Info.Width,
+ Info.Height,
_depth,
- _info.Levels,
+ Info.Levels,
out Span<byte> decoded))
{
- string texInfo = $"{_info.Target} {_info.FormatInfo.Format} {_info.Width}x{_info.Height}x{_info.DepthOrLayers} levels {_info.Levels}";
+ string texInfo = $"{Info.Target} {Info.FormatInfo.Format} {Info.Width}x{Info.Height}x{Info.DepthOrLayers} levels {Info.Levels}";
- Logger.PrintError(LogClass.Gpu, $"Invalid ASTC texture at 0x{_info.Address:X} ({texInfo}).");
+ Logger.PrintError(LogClass.Gpu, $"Invalid ASTC texture at 0x{Info.Address:X} ({texInfo}).");
}
data = decoded;
@@ -273,31 +270,31 @@ namespace Ryujinx.Graphics.Gpu.Image
{
Span<byte> data = HostTexture.GetData();
- if (_info.IsLinear)
+ if (Info.IsLinear)
{
data = LayoutConverter.ConvertLinearToLinearStrided(
- _info.Width,
- _info.Height,
- _info.FormatInfo.BlockWidth,
- _info.FormatInfo.BlockHeight,
- _info.Stride,
- _info.FormatInfo.BytesPerPixel,
+ Info.Width,
+ Info.Height,
+ Info.FormatInfo.BlockWidth,
+ Info.FormatInfo.BlockHeight,
+ Info.Stride,
+ Info.FormatInfo.BytesPerPixel,
data);
}
else
{
data = LayoutConverter.ConvertLinearToBlockLinear(
- _info.Width,
- _info.Height,
+ Info.Width,
+ Info.Height,
_depth,
- _info.Levels,
+ Info.Levels,
_layers,
- _info.FormatInfo.BlockWidth,
- _info.FormatInfo.BlockHeight,
- _info.FormatInfo.BytesPerPixel,
- _info.GobBlocksInY,
- _info.GobBlocksInZ,
- _info.GobBlocksInTileX,
+ Info.FormatInfo.BlockWidth,
+ Info.FormatInfo.BlockHeight,
+ Info.FormatInfo.BytesPerPixel,
+ Info.GobBlocksInY,
+ Info.GobBlocksInZ,
+ Info.GobBlocksInTileX,
_sizeInfo,
data);
}
@@ -332,8 +329,7 @@ namespace Ryujinx.Graphics.Gpu.Image
if ((flags & TextureSearchFlags.IgnoreMs) != 0)
{
- bool msTargetCompatible = _info.Target == Target.Texture2DMultisample &&
- info.Target == Target.Texture2D;
+ bool msTargetCompatible = Info.Target == Target.Texture2DMultisample && info.Target == Target.Texture2D;
if (!msTargetCompatible && !TargetAndSamplesCompatible(info))
{
@@ -345,25 +341,24 @@ namespace Ryujinx.Graphics.Gpu.Image
return false;
}
- return _info.Address == info.Address && _info.Levels == info.Levels;
+ return Info.Address == info.Address && Info.Levels == info.Levels;
}
private bool FormatMatches(TextureInfo info, bool strict)
{
// D32F and R32F texture have the same representation internally,
// however the R32F format is used to sample from depth textures.
- if (_info.FormatInfo.Format == Format.D32Float &&
- info.FormatInfo.Format == Format.R32Float && !strict)
+ if (Info.FormatInfo.Format == Format.D32Float && info.FormatInfo.Format == Format.R32Float && !strict)
{
return true;
}
- return _info.FormatInfo.Format == info.FormatInfo.Format;
+ return Info.FormatInfo.Format == info.FormatInfo.Format;
}
private bool LayoutMatches(TextureInfo info)
{
- if (_info.IsLinear != info.IsLinear)
+ if (Info.IsLinear != info.IsLinear)
{
return false;
}
@@ -372,12 +367,12 @@ namespace Ryujinx.Graphics.Gpu.Image
// For block linear textures, the stride is ignored.
if (info.IsLinear)
{
- return _info.Stride == info.Stride;
+ return Info.Stride == info.Stride;
}
else
{
- return _info.GobBlocksInY == info.GobBlocksInY &&
- _info.GobBlocksInZ == info.GobBlocksInZ;
+ return Info.GobBlocksInY == info.GobBlocksInY &&
+ Info.GobBlocksInZ == info.GobBlocksInZ;
}
}
@@ -388,21 +383,21 @@ namespace Ryujinx.Graphics.Gpu.Image
public bool SizeMatches(TextureInfo info, int level)
{
- return Math.Max(1, _info.Width >> level) == info.Width &&
- Math.Max(1, _info.Height >> level) == info.Height &&
- Math.Max(1, _info.GetDepth() >> level) == info.GetDepth();
+ return Math.Max(1, Info.Width >> level) == info.Width &&
+ Math.Max(1, Info.Height >> level) == info.Height &&
+ Math.Max(1, Info.GetDepth() >> level) == info.GetDepth();
}
private bool SizeMatches(TextureInfo info, bool alignSizes)
{
- if (_info.GetLayers() != info.GetLayers())
+ if (Info.GetLayers() != info.GetLayers())
{
return false;
}
if (alignSizes)
{
- Size size0 = GetAlignedSize(_info);
+ Size size0 = GetAlignedSize(Info);
Size size1 = GetAlignedSize(info);
return size0.Width == size1.Width &&
@@ -411,26 +406,26 @@ namespace Ryujinx.Graphics.Gpu.Image
}
else
{
- return _info.Width == info.Width &&
- _info.Height == info.Height &&
- _info.GetDepth() == info.GetDepth();
+ return Info.Width == info.Width &&
+ Info.Height == info.Height &&
+ Info.GetDepth() == info.GetDepth();
}
}
private bool SamplerParamsMatches(TextureInfo info)
{
- return _info.DepthStencilMode == info.DepthStencilMode &&
- _info.SwizzleR == info.SwizzleR &&
- _info.SwizzleG == info.SwizzleG &&
- _info.SwizzleB == info.SwizzleB &&
- _info.SwizzleA == info.SwizzleA;
+ return Info.DepthStencilMode == info.DepthStencilMode &&
+ Info.SwizzleR == info.SwizzleR &&
+ Info.SwizzleG == info.SwizzleG &&
+ Info.SwizzleB == info.SwizzleB &&
+ Info.SwizzleA == info.SwizzleA;
}
private bool TargetAndSamplesCompatible(TextureInfo info)
{
- return _info.Target == info.Target &&
- _info.SamplesInX == info.SamplesInX &&
- _info.SamplesInY == info.SamplesInY;
+ return Info.Target == info.Target &&
+ Info.SamplesInX == info.SamplesInX &&
+ Info.SamplesInY == info.SamplesInY;
}
public bool IsViewCompatible(
@@ -485,13 +480,13 @@ namespace Ryujinx.Graphics.Gpu.Image
return false;
}
- return _info.SamplesInX == info.SamplesInX &&
- _info.SamplesInY == info.SamplesInY;
+ return Info.SamplesInX == info.SamplesInX &&
+ Info.SamplesInY == info.SamplesInY;
}
private bool ViewLayoutCompatible(TextureInfo info, int level)
{
- if (_info.IsLinear != info.IsLinear)
+ if (Info.IsLinear != info.IsLinear)
{
return false;
}
@@ -500,9 +495,9 @@ namespace Ryujinx.Graphics.Gpu.Image
// For block linear textures, the stride is ignored.
if (info.IsLinear)
{
- int width = Math.Max(1, _info.Width >> level);
+ int width = Math.Max(1, Info.Width >> level);
- int stride = width * _info.FormatInfo.BytesPerPixel;
+ int stride = width * Info.FormatInfo.BytesPerPixel;
stride = BitUtils.AlignUp(stride, 32);
@@ -510,15 +505,15 @@ namespace Ryujinx.Graphics.Gpu.Image
}
else
{
- int height = Math.Max(1, _info.Height >> level);
- int depth = Math.Max(1, _info.GetDepth() >> level);
+ int height = Math.Max(1, Info.Height >> level);
+ int depth = Math.Max(1, Info.GetDepth() >> level);
(int gobBlocksInY, int gobBlocksInZ) = SizeCalculator.GetMipGobBlockSizes(
height,
depth,
- _info.FormatInfo.BlockHeight,
- _info.GobBlocksInY,
- _info.GobBlocksInZ);
+ Info.FormatInfo.BlockHeight,
+ Info.GobBlocksInY,
+ Info.GobBlocksInZ);
return gobBlocksInY == info.GobBlocksInY &&
gobBlocksInZ == info.GobBlocksInZ;
@@ -527,12 +522,12 @@ namespace Ryujinx.Graphics.Gpu.Image
private bool ViewFormatCompatible(TextureInfo info)
{
- return TextureCompatibility.FormatCompatible(_info.FormatInfo, info.FormatInfo);
+ return TextureCompatibility.FormatCompatible(Info.FormatInfo, info.FormatInfo);
}
private bool ViewSizeMatches(TextureInfo info, int level, bool isCopy)
{
- Size size = GetAlignedSize(_info, level);
+ Size size = GetAlignedSize(Info, level);
Size otherSize = GetAlignedSize(info);
@@ -549,7 +544,7 @@ namespace Ryujinx.Graphics.Gpu.Image
private bool ViewTargetCompatible(TextureInfo info, bool isCopy)
{
- switch (_info.Target)
+ switch (Info.Target)
{
case Target.Texture1D:
case Target.Texture1DArray:
@@ -621,7 +616,7 @@ namespace Ryujinx.Graphics.Gpu.Image
public ITexture GetTargetTexture(Target target)
{
- if (target == _info.Target)
+ if (target == Info.Target)
{
return HostTexture;
}
@@ -629,21 +624,21 @@ namespace Ryujinx.Graphics.Gpu.Image
if (_arrayViewTexture == null && IsSameDimensionsTarget(target))
{
TextureCreateInfo createInfo = new TextureCreateInfo(
- _info.Width,
- _info.Height,
+ Info.Width,
+ Info.Height,
target == Target.CubemapArray ? 6 : 1,
- _info.Levels,
- _info.Samples,
- _info.FormatInfo.BlockWidth,
- _info.FormatInfo.BlockHeight,
- _info.FormatInfo.BytesPerPixel,
- _info.FormatInfo.Format,
- _info.DepthStencilMode,
+ Info.Levels,
+ Info.Samples,
+ Info.FormatInfo.BlockWidth,
+ Info.FormatInfo.BlockHeight,
+ Info.FormatInfo.BytesPerPixel,
+ Info.FormatInfo.Format,
+ Info.DepthStencilMode,
target,
- _info.SwizzleR,
- _info.SwizzleG,
- _info.SwizzleB,
- _info.SwizzleA);
+ Info.SwizzleR,
+ Info.SwizzleG,
+ Info.SwizzleB,
+ Info.SwizzleA);
ITexture viewTexture = HostTexture.CreateView(createInfo, 0, 0);
@@ -662,7 +657,7 @@ namespace Ryujinx.Graphics.Gpu.Image
private bool IsSameDimensionsTarget(Target target)
{
- switch (_info.Target)
+ switch (Info.Target)
{
case Target.Texture1D:
case Target.Texture1DArray:
@@ -702,7 +697,7 @@ namespace Ryujinx.Graphics.Gpu.Image
private void SetInfo(TextureInfo info)
{
- _info = info;
+ Info = info;
_depth = info.GetDepth();
_layers = info.GetLayers();