aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/Gpu/Texture
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-07-19 02:30:21 -0300
committerGitHub <noreply@github.com>2018-07-19 02:30:21 -0300
commit60f2198a1e8e61fe1cfb8da30a6afcd86a672a85 (patch)
treebe608a9f483e751d6d4bf4d9037048c94d495b0d /Ryujinx.HLE/Gpu/Texture
parent8b685b12f0b7a901139999dff17b24b049b9084b (diff)
Support deswizzle of sparse tiled textures and some frame buffer fixes (#275)
* Attempt to support deswizzle of sparse tiled textures * Use correct frame buffer and viewport sizes, started to clean up the copy engine * Correct texture width alignment * Use Scale/Translate registers to calculate viewport rect * Allow texture copy between frame buffers
Diffstat (limited to 'Ryujinx.HLE/Gpu/Texture')
-rw-r--r--Ryujinx.HLE/Gpu/Texture/TextureFactory.cs5
-rw-r--r--Ryujinx.HLE/Gpu/Texture/TextureHelper.cs8
-rw-r--r--Ryujinx.HLE/Gpu/Texture/TextureInfo.cs19
-rw-r--r--Ryujinx.HLE/Gpu/Texture/TextureReader.cs18
-rw-r--r--Ryujinx.HLE/Gpu/Texture/TextureWriter.cs28
5 files changed, 36 insertions, 42 deletions
diff --git a/Ryujinx.HLE/Gpu/Texture/TextureFactory.cs b/Ryujinx.HLE/Gpu/Texture/TextureFactory.cs
index 9df0b600..4db0b6f1 100644
--- a/Ryujinx.HLE/Gpu/Texture/TextureFactory.cs
+++ b/Ryujinx.HLE/Gpu/Texture/TextureFactory.cs
@@ -55,9 +55,11 @@ namespace Ryujinx.HLE.Gpu.Texture
int Pitch = (Tic[3] & 0xffff) << 5;
- int BlockHeightLog2 = (Tic[3] >> 3) & 7;
+ int BlockHeightLog2 = (Tic[3] >> 3) & 7;
+ int TileWidthLog2 = (Tic[3] >> 10) & 7;
int BlockHeight = 1 << BlockHeightLog2;
+ int TileWidth = 1 << TileWidthLog2;
int Width = (Tic[4] & 0xffff) + 1;
int Height = (Tic[5] & 0xffff) + 1;
@@ -68,6 +70,7 @@ namespace Ryujinx.HLE.Gpu.Texture
Height,
Pitch,
BlockHeight,
+ TileWidth,
Swizzle,
Format);
diff --git a/Ryujinx.HLE/Gpu/Texture/TextureHelper.cs b/Ryujinx.HLE/Gpu/Texture/TextureHelper.cs
index de26c397..ecf2b6bf 100644
--- a/Ryujinx.HLE/Gpu/Texture/TextureHelper.cs
+++ b/Ryujinx.HLE/Gpu/Texture/TextureHelper.cs
@@ -7,8 +7,14 @@ namespace Ryujinx.HLE.Gpu.Texture
{
static class TextureHelper
{
- public static ISwizzle GetSwizzle(TextureInfo Texture, int Width, int Bpp)
+ public static ISwizzle GetSwizzle(TextureInfo Texture, int BlockWidth, int Bpp)
{
+ int Width = (Texture.Width + (BlockWidth - 1)) / BlockWidth;
+
+ int AlignMask = Texture.TileWidth * (64 / Bpp) - 1;
+
+ Width = (Width + AlignMask) & ~AlignMask;
+
switch (Texture.Swizzle)
{
case TextureSwizzle._1dBuffer:
diff --git a/Ryujinx.HLE/Gpu/Texture/TextureInfo.cs b/Ryujinx.HLE/Gpu/Texture/TextureInfo.cs
index 31784bbc..2a98ce00 100644
--- a/Ryujinx.HLE/Gpu/Texture/TextureInfo.cs
+++ b/Ryujinx.HLE/Gpu/Texture/TextureInfo.cs
@@ -11,6 +11,7 @@ namespace Ryujinx.HLE.Gpu.Texture
public int Pitch { get; private set; }
public int BlockHeight { get; private set; }
+ public int TileWidth { get; private set; }
public TextureSwizzle Swizzle { get; private set; }
@@ -29,6 +30,8 @@ namespace Ryujinx.HLE.Gpu.Texture
BlockHeight = 16;
+ TileWidth = 1;
+
Swizzle = TextureSwizzle.BlockLinear;
Format = GalTextureFormat.A8B8G8R8;
@@ -40,16 +43,18 @@ namespace Ryujinx.HLE.Gpu.Texture
int Height,
int Pitch,
int BlockHeight,
+ int TileWidth,
TextureSwizzle Swizzle,
GalTextureFormat Format)
{
- this.Position = Position;
- this.Width = Width;
- this.Height = Height;
- this.Pitch = Pitch;
- this.BlockHeight = BlockHeight;
- this.Swizzle = Swizzle;
- this.Format = Format;
+ this.Position = Position;
+ this.Width = Width;
+ this.Height = Height;
+ this.Pitch = Pitch;
+ this.BlockHeight = BlockHeight;
+ this.TileWidth = TileWidth;
+ this.Swizzle = Swizzle;
+ this.Format = Format;
}
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/Gpu/Texture/TextureReader.cs b/Ryujinx.HLE/Gpu/Texture/TextureReader.cs
index 26129877..350ab825 100644
--- a/Ryujinx.HLE/Gpu/Texture/TextureReader.cs
+++ b/Ryujinx.HLE/Gpu/Texture/TextureReader.cs
@@ -56,7 +56,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 1);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 1);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -89,7 +89,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 2];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 2);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 2);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -127,7 +127,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 2];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 2);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 2);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -164,7 +164,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 2];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 2);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 2);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -197,7 +197,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 4];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 4);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 4);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -230,7 +230,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 8];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 8);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 8);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -263,7 +263,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 16];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 16);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 16);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -298,7 +298,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 8];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 8);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 4, 8);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -331,7 +331,7 @@ namespace Ryujinx.HLE.Gpu.Texture
byte[] Output = new byte[Width * Height * 16];
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 16);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, BlockWidth, 16);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
diff --git a/Ryujinx.HLE/Gpu/Texture/TextureWriter.cs b/Ryujinx.HLE/Gpu/Texture/TextureWriter.cs
index b64302a5..a87d4545 100644
--- a/Ryujinx.HLE/Gpu/Texture/TextureWriter.cs
+++ b/Ryujinx.HLE/Gpu/Texture/TextureWriter.cs
@@ -6,29 +6,9 @@ namespace Ryujinx.HLE.Gpu.Texture
{
static class TextureWriter
{
- public static void Write(
- IAMemory Memory,
- TextureInfo Texture,
- byte[] Data,
- int Width,
- int Height)
+ public unsafe static void Write(IAMemory Memory, TextureInfo Texture, byte[] Data)
{
- switch (Texture.Format)
- {
- case GalTextureFormat.A8B8G8R8: Write4Bpp(Memory, Texture, Data, Width, Height); break;
-
- default: throw new NotImplementedException(Texture.Format.ToString());
- }
- }
-
- private unsafe static void Write4Bpp(
- IAMemory Memory,
- TextureInfo Texture,
- byte[] Data,
- int Width,
- int Height)
- {
- ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, Width, 4);
+ ISwizzle Swizzle = TextureHelper.GetSwizzle(Texture, 1, 4);
(AMemory CpuMem, long Position) = TextureHelper.GetMemoryAndPosition(
Memory,
@@ -38,8 +18,8 @@ namespace Ryujinx.HLE.Gpu.Texture
{
long InOffs = 0;
- for (int Y = 0; Y < Height; Y++)
- for (int X = 0; X < Width; X++)
+ for (int Y = 0; Y < Texture.Height; Y++)
+ for (int X = 0; X < Texture.Width; X++)
{
long Offset = (uint)Swizzle.GetSwizzleOffset(X, Y);