aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-04-08 17:09:41 -0300
committergdkchan <gab.dark.100@gmail.com>2018-04-08 17:09:41 -0300
commit36dfd20c879967fc67721ed46ac773d341aa80d9 (patch)
tree6f7569630d5cf5955358bc4ebcc0705f16912065
parentb9aa3966c00b4bb3ff0292dc28ed53ad26cf284b (diff)
Use correct pitch value when decoding linear swizzle textures
-rw-r--r--Ryujinx.Graphics/Gpu/LinearSwizzle.cs11
-rw-r--r--Ryujinx.Graphics/Gpu/Texture.cs3
-rw-r--r--Ryujinx.Graphics/Gpu/TextureFactory.cs3
-rw-r--r--Ryujinx.Graphics/Gpu/TextureReader.cs16
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