Change yet again texture data and add G8R8 flipping

This commit is contained in:
ReinUsesLisp 2018-09-05 03:07:56 -03:00
parent da4bcfbf48
commit ca0fff4505
11 changed files with 168 additions and 149 deletions

View file

@ -37,6 +37,7 @@ namespace Ryujinx.Graphics.Gal
R4G4,
R4G4B4A4,
B4G4R4A4,
A4B4G4R4,
R5G6B5,
B5G6R5,
R5G5B5A1,
@ -44,6 +45,7 @@ namespace Ryujinx.Graphics.Gal
A1R5G5B5,
R8,
R8G8,
G8R8,
R8G8B8,
B8G8R8,
R8G8B8A8,
@ -87,11 +89,5 @@ namespace Ryujinx.Graphics.Gal
ETC2_R8G8B8A8,
EAC_R11,
EAC_R11G11,
REVERSED_BEGIN,
R4G4B4A4_REVERSED = REVERSED_BEGIN,
REVERSED_END
}
}

View file

@ -58,7 +58,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
int CurrentSize = Math.Max(ImageTable.GetImageSize(NewImage),
ImageTable.GetImageSize(Image));
GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyBuffer);
GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyBuffer);
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyBuffer);
if (CopyBufferSize < CurrentSize)
@ -113,8 +113,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
}
}
public bool HasColor { get => ImageTable.HasColor(Image); }
public bool HasDepth { get => ImageTable.HasDepth(Image); }
public bool HasStencil { get => ImageTable.HasStencil(Image); }
public bool HasColor => ImageTable.HasColor(Image.Format);
public bool HasDepth => ImageTable.HasDepth(Image.Format);
public bool HasStencil => ImageTable.HasStencil(Image.Format);
}
}

View file

@ -143,6 +143,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
case GalImageFormat.A8B8G8R8 | GalImageFormat.Sint: return (PixelInternalFormat.Rgba8i, PixelFormat.RgbaInteger, PixelType.Byte);
case GalImageFormat.A8B8G8R8 | GalImageFormat.Uint: return (PixelInternalFormat.Rgba8ui, PixelFormat.RgbaInteger, PixelType.UnsignedByte);
case GalImageFormat.A8B8G8R8_SRGB: return (PixelInternalFormat.Srgb8Alpha8, PixelFormat.Rgba, PixelType.UnsignedByte);
case GalImageFormat.A4B4G4R4 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba4, PixelFormat.Rgba, PixelType.UnsignedShort4444Reversed);
case GalImageFormat.A2B10G10R10 | GalImageFormat.Uint: return (PixelInternalFormat.Rgb10A2ui, PixelFormat.RgbaInteger, PixelType.UnsignedInt2101010Reversed);
case GalImageFormat.A2B10G10R10 | GalImageFormat.Unorm: return (PixelInternalFormat.Rgb10A2, PixelFormat.Rgba, PixelType.UnsignedInt2101010Reversed);
case GalImageFormat.R32 | GalImageFormat.Sfloat: return (PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float);
@ -169,8 +170,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
case GalImageFormat.R8 | GalImageFormat.Unorm: return (PixelInternalFormat.R8, PixelFormat.Red, PixelType.UnsignedByte);
case GalImageFormat.B10G11R11 | GalImageFormat.Sfloat: return (PixelInternalFormat.R11fG11fB10f, PixelFormat.Rgb, PixelType.UnsignedInt10F11F11FRev);
case GalImageFormat.R4G4B4A4_REVERSED | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba4, PixelFormat.Rgba, PixelType.UnsignedShort4444Reversed);
case GalImageFormat.D24_S8 | GalImageFormat.Unorm: return (PixelInternalFormat.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248);
case GalImageFormat.D32 | GalImageFormat.Sfloat: return (PixelInternalFormat.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float);
case GalImageFormat.D16 | GalImageFormat.Unorm: return (PixelInternalFormat.DepthComponent16, PixelFormat.DepthComponent, PixelType.UnsignedShort);

View file

@ -57,6 +57,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{
GalImageFormat TypeLess = Image.Format & GalImageFormat.FormatMask;
//TODO: Use KHR_texture_compression_astc_hdr when available
if (TypeLess >= GalImageFormat.ASTC_BEGIN && TypeLess <= GalImageFormat.ASTC_END)
{
int TextureBlockWidth = GetAstcBlockWidth(Image.Format);
@ -71,6 +72,16 @@ namespace Ryujinx.Graphics.Gal.OpenGL
Image.Format = GalImageFormat.A8B8G8R8 | GalImageFormat.Unorm;
}
else if (TypeLess == GalImageFormat.G8R8)
{
Data = ImageConverter.G8R8ToR8G8(
Data,
Image.Width,
Image.Height,
1);
Image.Format = GalImageFormat.R8G8 | (Image.Format & GalImageFormat.FormatMask);
}
(PixelInternalFormat InternalFormat, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(Image.Format);

View file

@ -103,7 +103,7 @@ namespace Ryujinx.Graphics
SrcPitch,
SrcBlockHeight, 1,
SrcSwizzle,
GalTextureFormat.A8B8G8R8);
GalImageFormat.A8B8G8R8 | GalImageFormat.Unorm);
}
TextureInfo DstTexture()
@ -115,7 +115,7 @@ namespace Ryujinx.Graphics
DstPitch,
DstBlockHeight, 1,
DstSwizzle,
GalTextureFormat.A8B8G8R8);
GalImageFormat.A8B8G8R8 | GalImageFormat.Unorm);
}
//TODO: fb -> fb copies, tex -> fb copies, formats other than RGBA8,

View file

@ -0,0 +1,24 @@
namespace Ryujinx.Graphics.Texture
{
static class ImageConverter
{
public static byte[] G8R8ToR8G8(
byte[] Data,
int Width,
int Height,
int Depth)
{
int Texels = Width * Height * Depth;
byte[] Output = new byte[Texels * 2];
for (int Texel = 0; Texel < Texels; Texel++)
{
Output[Texel * 2 + 0] = Data[Texel * 2 + 1];
Output[Texel * 2 + 1] = Data[Texel * 2 + 0];
}
return Output;
}
}
}

View file

@ -8,17 +8,21 @@ namespace Ryujinx.Graphics.Texture
{
struct ImageDescriptor
{
public TextureReaderDelegate Reader;
public bool HasColor;
public bool HasDepth;
public bool HasStencil;
public ImageDescriptor(
bool HasColor,
bool HasDepth,
bool HasStencil)
TextureReaderDelegate Reader,
bool HasColor,
bool HasDepth,
bool HasStencil)
{
this.HasColor = HasColor;
this.HasDepth = HasDepth;
this.Reader = Reader;
this.HasColor = HasColor;
this.HasDepth = HasDepth;
this.HasStencil = HasStencil;
}
}
@ -29,97 +33,96 @@ namespace Ryujinx.Graphics.Texture
private const GalImageFormat Uint = GalImageFormat.Uint;
private const GalImageFormat Sfloat = GalImageFormat.Sfloat;
private static readonly Dictionary<GalTextureFormat, TextureDescriptor> s_TextureTable =
new Dictionary<GalTextureFormat, TextureDescriptor>()
private static readonly Dictionary<GalTextureFormat, GalImageFormat> s_TextureTable =
new Dictionary<GalTextureFormat, GalImageFormat>()
{
{ GalTextureFormat.R32G32B32A32, new TextureDescriptor(TextureReader.Read16Bpp, GalImageFormat.R32G32B32A32 | Sint | Uint | Sfloat) },
{ GalTextureFormat.R16G16B16A16, new TextureDescriptor(TextureReader.Read8Bpp, GalImageFormat.R16G16B16A16 | Snorm | Unorm | Sint | Uint | Sfloat) },
{ GalTextureFormat.R32G32, new TextureDescriptor(TextureReader.Read8Bpp, GalImageFormat.R32G32 | Sint | Uint | Sfloat) },
{ GalTextureFormat.A8B8G8R8, new TextureDescriptor(TextureReader.Read4Bpp, GalImageFormat.A8B8G8R8 | Snorm | Unorm | Sint | Uint ) },
{ GalTextureFormat.A2B10G10R10, new TextureDescriptor(TextureReader.Read4Bpp, GalImageFormat.A2B10G10R10 | Snorm | Unorm | Sint | Uint ) },
{ GalTextureFormat.G8R8, new TextureDescriptor(TextureReader.Read2Bpp, GalImageFormat.R8G8 | Snorm | Unorm | Sint | Uint ) },
{ GalTextureFormat.R16, new TextureDescriptor(TextureReader.Read2Bpp, GalImageFormat.R16 | Snorm | Unorm | Sint | Uint | Sfloat) },
{ GalTextureFormat.R8, new TextureDescriptor(TextureReader.Read1Bpp, GalImageFormat.R8 | Snorm | Unorm | Sint | Uint ) },
{ GalTextureFormat.R32, new TextureDescriptor(TextureReader.Read4Bpp, GalImageFormat.R32 | Sint | Uint | Sfloat) },
//TODO: Reverse this one in the reader
{ GalTextureFormat.A4B4G4R4, new TextureDescriptor(TextureReader.Read2Bpp, GalImageFormat.R4G4B4A4_REVERSED | Unorm ) },
{ GalTextureFormat.A1B5G5R5, new TextureDescriptor(TextureReader.Read5551, GalImageFormat.A1R5G5B5 | Unorm ) },
{ GalTextureFormat.B5G6R5, new TextureDescriptor(TextureReader.Read565, GalImageFormat.B5G6R5 | Unorm ) },
{ GalTextureFormat.BF10GF11RF11, new TextureDescriptor(TextureReader.Read4Bpp, GalImageFormat.B10G11R11 | Sfloat) },
{ GalTextureFormat.Z24S8, new TextureDescriptor(TextureReader.Read4Bpp, GalImageFormat.D24_S8 | Unorm ) },
{ GalTextureFormat.ZF32, new TextureDescriptor(TextureReader.Read4Bpp, GalImageFormat.D32 | Sfloat) },
{ GalTextureFormat.ZF32_X24S8, new TextureDescriptor(TextureReader.Read8Bpp, GalImageFormat.D32_S8 | Unorm ) },
{ GalTextureFormat.R32G32B32A32, GalImageFormat.R32G32B32A32 | Sint | Uint | Sfloat },
{ GalTextureFormat.R16G16B16A16, GalImageFormat.R16G16B16A16 | Snorm | Unorm | Sint | Uint | Sfloat },
{ GalTextureFormat.R32G32, GalImageFormat.R32G32 | Sint | Uint | Sfloat },
{ GalTextureFormat.A8B8G8R8, GalImageFormat.A8B8G8R8 | Snorm | Unorm | Sint | Uint },
{ GalTextureFormat.A2B10G10R10, GalImageFormat.A2B10G10R10 | Snorm | Unorm | Sint | Uint },
{ GalTextureFormat.G8R8, GalImageFormat.G8R8 | Snorm | Unorm | Sint | Uint },
{ GalTextureFormat.R16, GalImageFormat.R16 | Snorm | Unorm | Sint | Uint | Sfloat },
{ GalTextureFormat.R8, GalImageFormat.R8 | Snorm | Unorm | Sint | Uint },
{ GalTextureFormat.R32, GalImageFormat.R32 | Sint | Uint | Sfloat },
{ GalTextureFormat.A4B4G4R4, GalImageFormat.A4B4G4R4 | Unorm },
{ GalTextureFormat.A1B5G5R5, GalImageFormat.A1R5G5B5 | Unorm },
{ GalTextureFormat.B5G6R5, GalImageFormat.B5G6R5 | Unorm },
{ GalTextureFormat.BF10GF11RF11, GalImageFormat.B10G11R11 | Sfloat },
{ GalTextureFormat.Z24S8, GalImageFormat.D24_S8 | Unorm },
{ GalTextureFormat.ZF32, GalImageFormat.D32 | Sfloat },
{ GalTextureFormat.ZF32_X24S8, GalImageFormat.D32_S8 | Unorm },
//Compressed formats
{ GalTextureFormat.BC6H_SF16, new TextureDescriptor(TextureReader.Read16BptCompressedTexture4x4, GalImageFormat.BC6H_SF16 | Unorm ) },
{ GalTextureFormat.BC6H_UF16, new TextureDescriptor(TextureReader.Read16BptCompressedTexture4x4, GalImageFormat.BC6H_UF16 | Unorm ) },
{ GalTextureFormat.BC7U, new TextureDescriptor(TextureReader.Read16BptCompressedTexture4x4, GalImageFormat.BC7 | Unorm ) },
{ GalTextureFormat.BC1, new TextureDescriptor(TextureReader.Read8Bpt4x4, GalImageFormat.BC1_RGBA | Unorm ) },
{ GalTextureFormat.BC2, new TextureDescriptor(TextureReader.Read16BptCompressedTexture4x4, GalImageFormat.BC2 | Unorm ) },
{ GalTextureFormat.BC3, new TextureDescriptor(TextureReader.Read16BptCompressedTexture4x4, GalImageFormat.BC3 | Unorm ) },
{ GalTextureFormat.BC4, new TextureDescriptor(TextureReader.Read8Bpt4x4, GalImageFormat.BC4 | Unorm | Snorm) },
{ GalTextureFormat.BC5, new TextureDescriptor(TextureReader.Read16BptCompressedTexture4x4, GalImageFormat.BC5 | Unorm | Snorm) },
{ GalTextureFormat.Astc2D4x4, new TextureDescriptor(TextureReader.Read16BptCompressedTexture4x4, GalImageFormat.ASTC_4x4 | Unorm ) },
{ GalTextureFormat.Astc2D5x5, new TextureDescriptor(TextureReader.Read16BptCompressedTexture5x5, GalImageFormat.ASTC_5x5 | Unorm ) },
{ GalTextureFormat.Astc2D6x6, new TextureDescriptor(TextureReader.Read16BptCompressedTexture6x6, GalImageFormat.ASTC_6x6 | Unorm ) },
{ GalTextureFormat.Astc2D8x8, new TextureDescriptor(TextureReader.Read16BptCompressedTexture8x8, GalImageFormat.ASTC_8x8 | Unorm ) },
{ GalTextureFormat.Astc2D10x10, new TextureDescriptor(TextureReader.Read16BptCompressedTexture10x10, GalImageFormat.ASTC_10x10 | Unorm ) },
{ GalTextureFormat.Astc2D12x12, new TextureDescriptor(TextureReader.Read16BptCompressedTexture12x12, GalImageFormat.ASTC_12x12 | Unorm ) },
{ GalTextureFormat.Astc2D5x4, new TextureDescriptor(TextureReader.Read16BptCompressedTexture5x4, GalImageFormat.ASTC_5x4 | Unorm ) },
{ GalTextureFormat.Astc2D6x5, new TextureDescriptor(TextureReader.Read16BptCompressedTexture6x5, GalImageFormat.ASTC_6x5 | Unorm ) },
{ GalTextureFormat.Astc2D8x6, new TextureDescriptor(TextureReader.Read16BptCompressedTexture8x6, GalImageFormat.ASTC_8x6 | Unorm ) },
{ GalTextureFormat.Astc2D10x8, new TextureDescriptor(TextureReader.Read16BptCompressedTexture10x8, GalImageFormat.ASTC_10x8 | Unorm ) },
{ GalTextureFormat.Astc2D12x10, new TextureDescriptor(TextureReader.Read16BptCompressedTexture12x10, GalImageFormat.ASTC_12x10 | Unorm ) },
{ GalTextureFormat.Astc2D8x5, new TextureDescriptor(TextureReader.Read16BptCompressedTexture8x5, GalImageFormat.ASTC_8x5 | Unorm ) },
{ GalTextureFormat.Astc2D10x5, new TextureDescriptor(TextureReader.Read16BptCompressedTexture10x5, GalImageFormat.ASTC_10x5 | Unorm ) },
{ GalTextureFormat.Astc2D10x6, new TextureDescriptor(TextureReader.Read16BptCompressedTexture10x6, GalImageFormat.ASTC_10x6 | Unorm ) }
{ GalTextureFormat.BC6H_SF16, GalImageFormat.BC6H_SF16 | Unorm },
{ GalTextureFormat.BC6H_UF16, GalImageFormat.BC6H_UF16 | Unorm },
{ GalTextureFormat.BC7U, GalImageFormat.BC7 | Unorm },
{ GalTextureFormat.BC1, GalImageFormat.BC1_RGBA | Unorm },
{ GalTextureFormat.BC2, GalImageFormat.BC2 | Unorm },
{ GalTextureFormat.BC3, GalImageFormat.BC3 | Unorm },
{ GalTextureFormat.BC4, GalImageFormat.BC4 | Unorm | Snorm },
{ GalTextureFormat.BC5, GalImageFormat.BC5 | Unorm | Snorm },
{ GalTextureFormat.Astc2D4x4, GalImageFormat.ASTC_4x4 | Unorm },
{ GalTextureFormat.Astc2D5x5, GalImageFormat.ASTC_5x5 | Unorm },
{ GalTextureFormat.Astc2D6x6, GalImageFormat.ASTC_6x6 | Unorm },
{ GalTextureFormat.Astc2D8x8, GalImageFormat.ASTC_8x8 | Unorm },
{ GalTextureFormat.Astc2D10x10, GalImageFormat.ASTC_10x10 | Unorm },
{ GalTextureFormat.Astc2D12x12, GalImageFormat.ASTC_12x12 | Unorm },
{ GalTextureFormat.Astc2D5x4, GalImageFormat.ASTC_5x4 | Unorm },
{ GalTextureFormat.Astc2D6x5, GalImageFormat.ASTC_6x5 | Unorm },
{ GalTextureFormat.Astc2D8x6, GalImageFormat.ASTC_8x6 | Unorm },
{ GalTextureFormat.Astc2D10x8, GalImageFormat.ASTC_10x8 | Unorm },
{ GalTextureFormat.Astc2D12x10, GalImageFormat.ASTC_12x10 | Unorm },
{ GalTextureFormat.Astc2D8x5, GalImageFormat.ASTC_8x5 | Unorm },
{ GalTextureFormat.Astc2D10x5, GalImageFormat.ASTC_10x5 | Unorm },
{ GalTextureFormat.Astc2D10x6, GalImageFormat.ASTC_10x6 | Unorm }
};
private static readonly Dictionary<GalImageFormat, ImageDescriptor> s_ImageTable =
new Dictionary<GalImageFormat, ImageDescriptor>()
{
{ GalImageFormat.R32G32B32A32, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R16G16B16A16, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R32G32, new ImageDescriptor(true, false, false) },
{ GalImageFormat.A8B8G8R8, new ImageDescriptor(true, false, false) },
{ GalImageFormat.A2B10G10R10, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R32, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC6H_SF16, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC6H_UF16, new ImageDescriptor(true, false, false) },
{ GalImageFormat.A1R5G5B5, new ImageDescriptor(true, false, false) },
{ GalImageFormat.B5G6R5, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC7, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R16G16, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R8G8, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R16, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R8, new ImageDescriptor(true, false, false) },
{ GalImageFormat.B10G11R11, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC1_RGBA, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC2, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC3, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC4, new ImageDescriptor(true, false, false) },
{ GalImageFormat.BC5, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_4x4, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_5x5, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_6x6, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_8x8, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_10x10, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_12x12, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_5x4, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_6x5, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_8x6, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_10x8, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_12x10, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_8x5, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_10x5, new ImageDescriptor(true, false, false) },
{ GalImageFormat.ASTC_10x6, new ImageDescriptor(true, false, false) },
{ GalImageFormat.R32G32B32A32, new ImageDescriptor(TextureReader.Read16Bpp, true, false, false) },
{ GalImageFormat.R16G16B16A16, new ImageDescriptor(TextureReader.Read8Bpp, true, false, false) },
{ GalImageFormat.R32G32, new ImageDescriptor(TextureReader.Read8Bpp, true, false, false) },
{ GalImageFormat.A8B8G8R8, new ImageDescriptor(TextureReader.Read4Bpp, true, false, false) },
{ GalImageFormat.A2B10G10R10, new ImageDescriptor(TextureReader.Read4Bpp, true, false, false) },
{ GalImageFormat.R32, new ImageDescriptor(TextureReader.Read4Bpp, true, false, false) },
{ GalImageFormat.A4B4G4R4, new ImageDescriptor(TextureReader.Read2Bpp, true, false, false) },
{ GalImageFormat.BC6H_SF16, new ImageDescriptor(TextureReader.Read16BptCompressedTexture4x4, true, false, false) },
{ GalImageFormat.BC6H_UF16, new ImageDescriptor(TextureReader.Read16BptCompressedTexture4x4, true, false, false) },
{ GalImageFormat.A1R5G5B5, new ImageDescriptor(TextureReader.Read5551, true, false, false) },
{ GalImageFormat.B5G6R5, new ImageDescriptor(TextureReader.Read565, true, false, false) },
{ GalImageFormat.BC7, new ImageDescriptor(TextureReader.Read16BptCompressedTexture4x4, true, false, false) },
{ GalImageFormat.R16G16, new ImageDescriptor(TextureReader.Read4Bpp, true, false, false) },
{ GalImageFormat.R8G8, new ImageDescriptor(TextureReader.Read2Bpp, true, false, false) },
{ GalImageFormat.G8R8, new ImageDescriptor(TextureReader.Read2Bpp, true, false, false) },
{ GalImageFormat.R16, new ImageDescriptor(TextureReader.Read2Bpp, true, false, false) },
{ GalImageFormat.R8, new ImageDescriptor(TextureReader.Read1Bpp, true, false, false) },
{ GalImageFormat.B10G11R11, new ImageDescriptor(TextureReader.Read4Bpp, true, false, false) },
{ GalImageFormat.BC1_RGBA, new ImageDescriptor(TextureReader.Read8Bpt4x4, true, false, false) },
{ GalImageFormat.BC2, new ImageDescriptor(TextureReader.Read16BptCompressedTexture4x4, true, false, false) },
{ GalImageFormat.BC3, new ImageDescriptor(TextureReader.Read16BptCompressedTexture4x4, true, false, false) },
{ GalImageFormat.BC4, new ImageDescriptor(TextureReader.Read8Bpt4x4, true, false, false) },
{ GalImageFormat.BC5, new ImageDescriptor(TextureReader.Read16BptCompressedTexture4x4, true, false, false) },
{ GalImageFormat.ASTC_4x4, new ImageDescriptor(TextureReader.Read16BptCompressedTexture4x4, true, false, false) },
{ GalImageFormat.ASTC_5x5, new ImageDescriptor(TextureReader.Read16BptCompressedTexture5x5, true, false, false) },
{ GalImageFormat.ASTC_6x6, new ImageDescriptor(TextureReader.Read16BptCompressedTexture6x6, true, false, false) },
{ GalImageFormat.ASTC_8x8, new ImageDescriptor(TextureReader.Read16BptCompressedTexture8x8, true, false, false) },
{ GalImageFormat.ASTC_10x10, new ImageDescriptor(TextureReader.Read16BptCompressedTexture10x10, true, false, false) },
{ GalImageFormat.ASTC_12x12, new ImageDescriptor(TextureReader.Read16BptCompressedTexture12x12, true, false, false) },
{ GalImageFormat.ASTC_5x4, new ImageDescriptor(TextureReader.Read16BptCompressedTexture5x4, true, false, false) },
{ GalImageFormat.ASTC_6x5, new ImageDescriptor(TextureReader.Read16BptCompressedTexture6x5, true, false, false) },
{ GalImageFormat.ASTC_8x6, new ImageDescriptor(TextureReader.Read16BptCompressedTexture8x6, true, false, false) },
{ GalImageFormat.ASTC_10x8, new ImageDescriptor(TextureReader.Read16BptCompressedTexture10x8, true, false, false) },
{ GalImageFormat.ASTC_12x10, new ImageDescriptor(TextureReader.Read16BptCompressedTexture12x10, true, false, false) },
{ GalImageFormat.ASTC_8x5, new ImageDescriptor(TextureReader.Read16BptCompressedTexture8x5, true, false, false) },
{ GalImageFormat.ASTC_10x5, new ImageDescriptor(TextureReader.Read16BptCompressedTexture10x5, true, false, false) },
{ GalImageFormat.ASTC_10x6, new ImageDescriptor(TextureReader.Read16BptCompressedTexture10x6, true, false, false) },
{ GalImageFormat.D24_S8, new ImageDescriptor(false, true, true) },
{ GalImageFormat.D32, new ImageDescriptor(false, true, false) },
{ GalImageFormat.D16, new ImageDescriptor(false, true, false) },
{ GalImageFormat.D32_S8, new ImageDescriptor(false, true, true) },
{ GalImageFormat.R4G4B4A4_REVERSED, new ImageDescriptor(true, false, false) }
{ GalImageFormat.D24_S8, new ImageDescriptor(TextureReader.Read4Bpp, false, true, true) },
{ GalImageFormat.D32, new ImageDescriptor(TextureReader.Read4Bpp, false, true, false) },
{ GalImageFormat.D16, new ImageDescriptor(TextureReader.Read2Bpp, false, true, false) },
{ GalImageFormat.D32_S8, new ImageDescriptor(TextureReader.Read8Bpp, false, true, true) },
};
public static GalImageFormat ConvertTexture(
@ -134,9 +137,12 @@ namespace Ryujinx.Graphics.Texture
throw new NotImplementedException("Per component types are not implemented");
}
GalTextureType Type = RType;
if (!s_TextureTable.TryGetValue(Format, out GalImageFormat ImageFormat))
{
throw new NotImplementedException("Texture with format " + ((int)Format).ToString("x2") + " not implemented");
}
GalImageFormat ImageFormat = GetTextureDescriptor(Format).Format;
GalTextureType Type = RType;
GalImageFormat FormatType = GetFormatType(RType);
@ -193,6 +199,11 @@ namespace Ryujinx.Graphics.Texture
throw new NotImplementedException(Format.ToString());
}
public static TextureReaderDelegate GetReader(GalImageFormat Format)
{
return GetImageDescriptor(Format).Reader;
}
public static int GetImageSize(GalImage Image)
{
switch (Image.Format & GalImageFormat.FormatMask)
@ -284,29 +295,19 @@ namespace Ryujinx.Graphics.Texture
throw new NotImplementedException((Image.Format & GalImageFormat.FormatMask).ToString());
}
public static bool HasColor(GalImage Image)
public static bool HasColor(GalImageFormat Format)
{
return GetImageDescriptor(Image.Format).HasColor;
return GetImageDescriptor(Format).HasColor;
}
public static bool HasDepth(GalImage Image)
public static bool HasDepth(GalImageFormat Format)
{
return GetImageDescriptor(Image.Format).HasDepth;
return GetImageDescriptor(Format).HasDepth;
}
public static bool HasStencil(GalImage Image)
public static bool HasStencil(GalImageFormat Format)
{
return GetImageDescriptor(Image.Format).HasStencil;
}
public static TextureDescriptor GetTextureDescriptor(GalTextureFormat Format)
{
if (s_TextureTable.TryGetValue(Format, out TextureDescriptor Descriptor))
{
return Descriptor;
}
throw new NotImplementedException("Texture with format code " + ((int)Format).ToString("x2") + " not implemented");
return GetImageDescriptor(Format).HasStencil;
}
private static ImageDescriptor GetImageDescriptor(GalImageFormat Format)

View file

@ -1,19 +0,0 @@
using Ryujinx.Graphics.Gal;
namespace Ryujinx.Graphics.Texture
{
struct TextureDescriptor
{
public TextureReaderDelegate Reader;
public GalImageFormat Format;
public TextureDescriptor(
TextureReaderDelegate Reader,
GalImageFormat Format)
{
this.Reader = Reader;
this.Format = Format;
}
}
}

View file

@ -10,12 +10,7 @@ namespace Ryujinx.Graphics.Texture
{
int[] Tic = ReadWords(Vmm, TicPosition, 8);
GalTextureType RType = (GalTextureType)((Tic[0] >> 7) & 7);
GalTextureType GType = (GalTextureType)((Tic[0] >> 10) & 7);
GalTextureType BType = (GalTextureType)((Tic[0] >> 13) & 7);
GalTextureType AType = (GalTextureType)((Tic[0] >> 16) & 7);
GalImageFormat Format = ImageTable.ConvertTexture((GalTextureFormat)(Tic[0] & 0x7f), RType, GType, BType, AType);
GalImageFormat Format = GetImageFormat(Tic);
GalTextureSource XSource = (GalTextureSource)((Tic[0] >> 19) & 7);
GalTextureSource YSource = (GalTextureSource)((Tic[0] >> 22) & 7);
@ -39,7 +34,7 @@ namespace Ryujinx.Graphics.Texture
{
int[] Tic = ReadWords(Vmm, TicPosition, 8);
GalTextureFormat Format = (GalTextureFormat)(Tic[0] & 0x7f);
GalImageFormat Format = GetImageFormat(Tic);
long TextureAddress = (uint)Tic[1];
@ -110,6 +105,18 @@ namespace Ryujinx.Graphics.Texture
BorderColor);
}
private static GalImageFormat GetImageFormat(int[] Tic)
{
GalTextureType RType = (GalTextureType)((Tic[0] >> 7) & 7);
GalTextureType GType = (GalTextureType)((Tic[0] >> 10) & 7);
GalTextureType BType = (GalTextureType)((Tic[0] >> 13) & 7);
GalTextureType AType = (GalTextureType)((Tic[0] >> 16) & 7);
GalTextureFormat Format = (GalTextureFormat)(Tic[0] & 0x7f);
return ImageTable.ConvertTexture(Format, RType, GType, BType, AType);
}
private static int[] ReadWords(NvGpuVmm Vmm, long Position, int Count)
{
int[] Words = new int[Count];

View file

@ -15,7 +15,7 @@ namespace Ryujinx.Graphics.Texture
public TextureSwizzle Swizzle { get; private set; }
public GalTextureFormat Format { get; private set; }
public GalImageFormat Format { get; private set; }
public TextureInfo(
long Position,
@ -34,7 +34,7 @@ namespace Ryujinx.Graphics.Texture
Swizzle = TextureSwizzle.BlockLinear;
Format = GalTextureFormat.A8B8G8R8;
Format = GalImageFormat.A8B8G8R8 | GalImageFormat.Unorm;
}
public TextureInfo(
@ -45,7 +45,7 @@ namespace Ryujinx.Graphics.Texture
int BlockHeight,
int TileWidth,
TextureSwizzle Swizzle,
GalTextureFormat Format)
GalImageFormat Format)
{
this.Position = Position;
this.Width = Width;

View file

@ -10,7 +10,7 @@ namespace Ryujinx.Graphics.Texture
{
public static byte[] Read(IAMemory Memory, TextureInfo Texture)
{
TextureReaderDelegate Reader = ImageTable.GetTextureDescriptor(Texture.Format).Reader;
TextureReaderDelegate Reader = ImageTable.GetReader(Texture.Format);
return Reader(Memory, Texture);
}