diff options
Diffstat (limited to 'Ryujinx.Graphics.Texture/OffsetCalculator.cs')
| -rw-r--r-- | Ryujinx.Graphics.Texture/OffsetCalculator.cs | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/Ryujinx.Graphics.Texture/OffsetCalculator.cs b/Ryujinx.Graphics.Texture/OffsetCalculator.cs index bb5d606c..1f5d9614 100644 --- a/Ryujinx.Graphics.Texture/OffsetCalculator.cs +++ b/Ryujinx.Graphics.Texture/OffsetCalculator.cs @@ -1,17 +1,22 @@ using Ryujinx.Common; - +using System.Runtime.CompilerServices; using static Ryujinx.Graphics.Texture.BlockLinearConstants; namespace Ryujinx.Graphics.Texture { public class OffsetCalculator { + private int _width; + private int _height; private int _stride; private bool _isLinear; private int _bytesPerPixel; private BlockLinearLayout _layoutConverter; + // Variables for built in iteration. + private int _yPart; + public OffsetCalculator( int width, int height, @@ -20,6 +25,8 @@ namespace Ryujinx.Graphics.Texture int gobBlocksInY, int bytesPerPixel) { + _width = width; + _height = height; _stride = stride; _isLinear = isLinear; _bytesPerPixel = bytesPerPixel; @@ -40,6 +47,18 @@ namespace Ryujinx.Graphics.Texture } } + public void SetY(int y) + { + if (_isLinear) + { + _yPart = y * _stride; + } + else + { + _layoutConverter.SetY(y); + } + } + public int GetOffset(int x, int y) { if (_isLinear) @@ -51,5 +70,48 @@ namespace Ryujinx.Graphics.Texture return _layoutConverter.GetOffset(x, y, 0); } } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int GetOffset(int x) + { + if (_isLinear) + { + return x * _bytesPerPixel + _yPart; + } + else + { + return _layoutConverter.GetOffset(x); + } + } + + public (int offset, int size) GetRectangleRange(int x, int y, int width, int height) + { + if (_isLinear) + { + int start = y * _stride + x * _bytesPerPixel; + int end = (y + height - 1) * _stride + (x + width) * _bytesPerPixel; + return (start, end - start); + } + else + { + return _layoutConverter.GetRectangleRange(x, y, width, height); + } + } + + public bool LayoutMatches(OffsetCalculator other) + { + if (_isLinear) + { + return other._isLinear && + _width == other._width && + _height == other._height && + _stride == other._stride && + _bytesPerPixel == other._bytesPerPixel; + } + else + { + return !other._isLinear && _layoutConverter.LayoutMatches(other._layoutConverter); + } + } } }
\ No newline at end of file |
