diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-04-08 17:09:41 -0300 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-04-08 17:09:41 -0300 |
| commit | 36dfd20c879967fc67721ed46ac773d341aa80d9 (patch) | |
| tree | 6f7569630d5cf5955358bc4ebcc0705f16912065 | |
| parent | b9aa3966c00b4bb3ff0292dc28ed53ad26cf284b (diff) | |
Use correct pitch value when decoding linear swizzle textures
| -rw-r--r-- | Ryujinx.Graphics/Gpu/LinearSwizzle.cs | 11 | ||||
| -rw-r--r-- | Ryujinx.Graphics/Gpu/Texture.cs | 3 | ||||
| -rw-r--r-- | Ryujinx.Graphics/Gpu/TextureFactory.cs | 3 | ||||
| -rw-r--r-- | Ryujinx.Graphics/Gpu/TextureReader.cs | 16 |
4 files changed, 19 insertions, 14 deletions
diff --git a/Ryujinx.Graphics/Gpu/LinearSwizzle.cs b/Ryujinx.Graphics/Gpu/LinearSwizzle.cs index 01f09f81..c7a6b304 100644 --- a/Ryujinx.Graphics/Gpu/LinearSwizzle.cs +++ b/Ryujinx.Graphics/Gpu/LinearSwizzle.cs @@ -2,19 +2,18 @@ namespace Ryujinx.Graphics.Gpu { class LinearSwizzle : ISwizzle { + private int Pitch; private int Bpp; - private int Stride; - public LinearSwizzle(int Width, int Bpp) + public LinearSwizzle(int Pitch, int Bpp) { - this.Bpp = Bpp; - - Stride = Width * Bpp; + this.Pitch = Pitch; + this.Bpp = Bpp; } public int GetSwizzleOffset(int X, int Y) { - return X * Bpp + Y * Stride; + return X * Bpp + Y * Pitch; } } }
\ No newline at end of file diff --git a/Ryujinx.Graphics/Gpu/Texture.cs b/Ryujinx.Graphics/Gpu/Texture.cs index c8d4e527..831c664d 100644 --- a/Ryujinx.Graphics/Gpu/Texture.cs +++ b/Ryujinx.Graphics/Gpu/Texture.cs @@ -8,6 +8,7 @@ namespace Ryujinx.Graphics.Gpu public int Width { get; private set; } public int Height { get; private set; } + public int Pitch { get; private set; } public int BlockHeight { get; private set; } @@ -19,6 +20,7 @@ namespace Ryujinx.Graphics.Gpu long Position, int Width, int Height, + int Pitch, int BlockHeight, TextureSwizzle Swizzle, GalTextureFormat Format) @@ -26,6 +28,7 @@ namespace Ryujinx.Graphics.Gpu this.Position = Position; this.Width = Width; this.Height = Height; + this.Pitch = Pitch; this.BlockHeight = BlockHeight; this.Swizzle = Swizzle; this.Format = Format; diff --git a/Ryujinx.Graphics/Gpu/TextureFactory.cs b/Ryujinx.Graphics/Gpu/TextureFactory.cs index 0a0497f3..7f8580d9 100644 --- a/Ryujinx.Graphics/Gpu/TextureFactory.cs +++ b/Ryujinx.Graphics/Gpu/TextureFactory.cs @@ -20,6 +20,8 @@ namespace Ryujinx.Graphics.Gpu TextureSwizzle Swizzle = (TextureSwizzle)((Tic[2] >> 21) & 7); + int Pitch = (Tic[3] & 0xffff) << 5; + int BlockHeightLog2 = (Tic[3] >> 3) & 7; int BlockHeight = 1 << BlockHeightLog2; @@ -31,6 +33,7 @@ namespace Ryujinx.Graphics.Gpu TextureAddress, Width, Height, + Pitch, BlockHeight, Swizzle, Format); diff --git a/Ryujinx.Graphics/Gpu/TextureReader.cs b/Ryujinx.Graphics/Gpu/TextureReader.cs index ce66e991..63dd2797 100644 --- a/Ryujinx.Graphics/Gpu/TextureReader.cs +++ b/Ryujinx.Graphics/Gpu/TextureReader.cs @@ -26,7 +26,7 @@ namespace Ryujinx.Graphics.Gpu byte[] Output = new byte[Width * Height * 4]; - ISwizzle Swizzle = GetSwizzle(Texture.Swizzle, Width, 4, Texture.BlockHeight); + ISwizzle Swizzle = GetSwizzle(Texture, 4); fixed (byte* BuffPtr = Output) { @@ -55,7 +55,7 @@ namespace Ryujinx.Graphics.Gpu byte[] Output = new byte[Width * Height * 8]; - ISwizzle Swizzle = GetSwizzle(Texture.Swizzle, Width, 8, Texture.BlockHeight); + ISwizzle Swizzle = GetSwizzle(Texture, 8); fixed (byte* BuffPtr = Output) { @@ -84,7 +84,7 @@ namespace Ryujinx.Graphics.Gpu byte[] Output = new byte[Width * Height * 16]; - ISwizzle Swizzle = GetSwizzle(Texture.Swizzle, Width, 16, Texture.BlockHeight); + ISwizzle Swizzle = GetSwizzle(Texture, 16); fixed (byte* BuffPtr = Output) { @@ -108,20 +108,20 @@ namespace Ryujinx.Graphics.Gpu return Output; } - private static ISwizzle GetSwizzle(TextureSwizzle Swizzle, int Width, int Bpp, int BlockHeight) + private static ISwizzle GetSwizzle(Texture Texture, int Bpp) { - switch (Swizzle) + switch (Texture.Swizzle) { case TextureSwizzle.Pitch: case TextureSwizzle.PitchColorKey: - return new LinearSwizzle(Width, Bpp); + return new LinearSwizzle(Texture.Pitch, Bpp); case TextureSwizzle.BlockLinear: case TextureSwizzle.BlockLinearColorKey: - return new BlockLinearSwizzle(Width, Bpp, BlockHeight); + return new BlockLinearSwizzle(Texture.Width, Bpp, Texture.BlockHeight); } - throw new NotImplementedException(Swizzle.ToString()); + throw new NotImplementedException(Texture.Swizzle.ToString()); } } }
\ No newline at end of file |
