diff --git a/Ryujinx.Graphics/Gal/GalTextureFormat.cs b/Ryujinx.Graphics/Gal/GalTextureFormat.cs index cf948526..5b642961 100644 --- a/Ryujinx.Graphics/Gal/GalTextureFormat.cs +++ b/Ryujinx.Graphics/Gal/GalTextureFormat.cs @@ -3,8 +3,9 @@ namespace Ryujinx.Graphics.Gal public enum GalTextureFormat { A8B8G8R8 = 0x8, + A1B5G5R5 = 0x14, BC1 = 0x24, BC2 = 0x25, BC3 = 0x26 } -} \ No newline at end of file +} diff --git a/Ryujinx.Graphics/Gpu/TextureReader.cs b/Ryujinx.Graphics/Gpu/TextureReader.cs index 63dd2797..60285aed 100644 --- a/Ryujinx.Graphics/Gpu/TextureReader.cs +++ b/Ryujinx.Graphics/Gpu/TextureReader.cs @@ -11,6 +11,7 @@ namespace Ryujinx.Graphics.Gpu switch (Texture.Format) { case GalTextureFormat.A8B8G8R8: return Read4Bpp (Memory, Texture); + case GalTextureFormat.A1B5G5R5: return Read2Bpp (Memory, Texture); case GalTextureFormat.BC1: return Read8Bpt4x4 (Memory, Texture); case GalTextureFormat.BC2: return Read16Bpt4x4(Memory, Texture); case GalTextureFormat.BC3: return Read16Bpt4x4(Memory, Texture); @@ -48,6 +49,35 @@ namespace Ryujinx.Graphics.Gpu return Output; } + private unsafe static byte[] Read2Bpp(AMemory Memory, Texture Texture) + { + int Width = Texture.Width; + int Height = Texture.Height; + + byte[] Output = new byte[Width * Height * 2]; + + ISwizzle Swizzle = GetSwizzle(Texture, 2); + + fixed (byte* BuffPtr = Output) + { + long OutOffs = 0; + + for (int Y = 0; Y < Height; Y++) + for (int X = 0; X < Width; X++) + { + long Offset = (uint)Swizzle.GetSwizzleOffset(X, Y); + + short Pixel = Memory.ReadInt16Unchecked(Texture.Position + Offset); + + *(short*)(BuffPtr + OutOffs) = Pixel; + + OutOffs += 2; + } + } + + return Output; + } + private unsafe static byte[] Read8Bpt4x4(AMemory Memory, Texture Texture) { int Width = (Texture.Width + 3) / 4; @@ -124,4 +154,4 @@ namespace Ryujinx.Graphics.Gpu throw new NotImplementedException(Texture.Swizzle.ToString()); } } -} \ No newline at end of file +}