forked from Mirror/Ryujinx
Implement X8Z24 texture format (#6315)
This commit is contained in:
parent
74a18b7c18
commit
e37735ed26
11 changed files with 45 additions and 42 deletions
|
@ -148,6 +148,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
B8G8R8A8Unorm,
|
B8G8R8A8Unorm,
|
||||||
B8G8R8A8Srgb,
|
B8G8R8A8Srgb,
|
||||||
B10G10R10A2Unorm,
|
B10G10R10A2Unorm,
|
||||||
|
X8UintD24Unorm,
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class FormatExtensions
|
public static class FormatExtensions
|
||||||
|
@ -269,6 +270,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
case Format.D16Unorm:
|
case Format.D16Unorm:
|
||||||
return 2;
|
return 2;
|
||||||
case Format.S8UintD24Unorm:
|
case Format.S8UintD24Unorm:
|
||||||
|
case Format.X8UintD24Unorm:
|
||||||
case Format.D32Float:
|
case Format.D32Float:
|
||||||
case Format.D24UnormS8Uint:
|
case Format.D24UnormS8Uint:
|
||||||
return 4;
|
return 4;
|
||||||
|
@ -349,6 +351,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
case Format.D16Unorm:
|
case Format.D16Unorm:
|
||||||
case Format.D24UnormS8Uint:
|
case Format.D24UnormS8Uint:
|
||||||
case Format.S8UintD24Unorm:
|
case Format.S8UintD24Unorm:
|
||||||
|
case Format.X8UintD24Unorm:
|
||||||
case Format.D32Float:
|
case Format.D32Float:
|
||||||
case Format.D32FloatS8Uint:
|
case Format.D32FloatS8Uint:
|
||||||
return true;
|
return true;
|
||||||
|
@ -633,6 +636,7 @@ namespace Ryujinx.Graphics.GAL
|
||||||
case Format.D16Unorm:
|
case Format.D16Unorm:
|
||||||
case Format.D24UnormS8Uint:
|
case Format.D24UnormS8Uint:
|
||||||
case Format.S8UintD24Unorm:
|
case Format.S8UintD24Unorm:
|
||||||
|
case Format.X8UintD24Unorm:
|
||||||
case Format.D32Float:
|
case Format.D32Float:
|
||||||
case Format.D32FloatS8Uint:
|
case Format.D32FloatS8Uint:
|
||||||
case Format.S8Uint:
|
case Format.S8Uint:
|
||||||
|
|
|
@ -8,13 +8,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.Types
|
||||||
/// </summary>
|
/// </summary>
|
||||||
enum ZetaFormat
|
enum ZetaFormat
|
||||||
{
|
{
|
||||||
D32Float = 0xa,
|
Zf32 = 0xa,
|
||||||
D16Unorm = 0x13,
|
Z16 = 0x13,
|
||||||
D24UnormS8Uint = 0x14,
|
Z24S8 = 0x14,
|
||||||
D24Unorm = 0x15,
|
X8Z24 = 0x15,
|
||||||
S8UintD24Unorm = 0x16,
|
S8Z24 = 0x16,
|
||||||
S8Uint = 0x17,
|
S8Uint = 0x17,
|
||||||
D32FloatS8Uint = 0x19,
|
Zf32X24S8 = 0x19,
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ZetaFormatConverter
|
static class ZetaFormatConverter
|
||||||
|
@ -29,14 +29,14 @@ namespace Ryujinx.Graphics.Gpu.Engine.Types
|
||||||
return format switch
|
return format switch
|
||||||
{
|
{
|
||||||
#pragma warning disable IDE0055 // Disable formatting
|
#pragma warning disable IDE0055 // Disable formatting
|
||||||
ZetaFormat.D32Float => new FormatInfo(Format.D32Float, 1, 1, 4, 1),
|
ZetaFormat.Zf32 => new FormatInfo(Format.D32Float, 1, 1, 4, 1),
|
||||||
ZetaFormat.D16Unorm => new FormatInfo(Format.D16Unorm, 1, 1, 2, 1),
|
ZetaFormat.Z16 => new FormatInfo(Format.D16Unorm, 1, 1, 2, 1),
|
||||||
ZetaFormat.D24UnormS8Uint => new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2),
|
ZetaFormat.Z24S8 => new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2),
|
||||||
ZetaFormat.D24Unorm => new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 1),
|
ZetaFormat.X8Z24 => new FormatInfo(Format.X8UintD24Unorm, 1, 1, 4, 1),
|
||||||
ZetaFormat.S8UintD24Unorm => new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2),
|
ZetaFormat.S8Z24 => new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2),
|
||||||
ZetaFormat.S8Uint => new FormatInfo(Format.S8Uint, 1, 1, 1, 1),
|
ZetaFormat.S8Uint => new FormatInfo(Format.S8Uint, 1, 1, 1, 1),
|
||||||
ZetaFormat.D32FloatS8Uint => new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2),
|
ZetaFormat.Zf32X24S8 => new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2),
|
||||||
_ => FormatInfo.Default,
|
_ => FormatInfo.Default,
|
||||||
#pragma warning restore IDE0055
|
#pragma warning restore IDE0055
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,6 +185,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
G24R8RUintGUnormBUnormAUnorm = G24R8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a0e
|
G24R8RUintGUnormBUnormAUnorm = G24R8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a0e
|
||||||
Z24S8RUintGUnormBUnormAUnorm = Z24S8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a29
|
Z24S8RUintGUnormBUnormAUnorm = Z24S8 | RUint | GUnorm | BUnorm | AUnorm, // 0x24a29
|
||||||
Z24S8RUintGUnormBUintAUint = Z24S8 | RUint | GUnorm | BUint | AUint, // 0x48a29
|
Z24S8RUintGUnormBUintAUint = Z24S8 | RUint | GUnorm | BUint | AUint, // 0x48a29
|
||||||
|
X8Z24RUnormGUintBUintAUint = X8Z24 | RUnorm | GUint | BUint | AUint, // 0x4912a
|
||||||
S8Z24RUnormGUintBUintAUint = S8Z24 | RUnorm | GUint | BUint | AUint, // 0x4912b
|
S8Z24RUnormGUintBUintAUint = S8Z24 | RUnorm | GUint | BUint | AUint, // 0x4912b
|
||||||
R32B24G8RFloatGUintBUnormAUnorm = R32B24G8 | RFloat | GUint | BUnorm | AUnorm, // 0x25385
|
R32B24G8RFloatGUintBUnormAUnorm = R32B24G8 | RFloat | GUint | BUnorm | AUnorm, // 0x25385
|
||||||
Zf32X24S8RFloatGUintBUnormAUnorm = Zf32X24S8 | RFloat | GUint | BUnorm | AUnorm, // 0x253b0
|
Zf32X24S8RFloatGUintBUnormAUnorm = Zf32X24S8 | RFloat | GUint | BUnorm | AUnorm, // 0x253b0
|
||||||
|
@ -410,6 +411,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
{ TextureFormat.G24R8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
{ TextureFormat.G24R8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.Z24S8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
{ TextureFormat.Z24S8RUintGUnormBUnormAUnorm, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.Z24S8RUintGUnormBUintAUint, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
{ TextureFormat.Z24S8RUintGUnormBUintAUint, new FormatInfo(Format.D24UnormS8Uint, 1, 1, 4, 2) },
|
||||||
|
{ TextureFormat.X8Z24RUnormGUintBUintAUint, new FormatInfo(Format.X8UintD24Unorm, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.S8Z24RUnormGUintBUintAUint, new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2) },
|
{ TextureFormat.S8Z24RUnormGUintBUintAUint, new FormatInfo(Format.S8UintD24Unorm, 1, 1, 4, 2) },
|
||||||
{ TextureFormat.R32B24G8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
{ TextureFormat.R32B24G8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
||||||
{ TextureFormat.Zf32X24S8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
{ TextureFormat.Zf32X24S8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint, 1, 1, 8, 2) },
|
||||||
|
|
|
@ -242,7 +242,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
return TextureMatchQuality.FormatAlias;
|
return TextureMatchQuality.FormatAlias;
|
||||||
}
|
}
|
||||||
else if ((lhs.FormatInfo.Format == Format.D24UnormS8Uint ||
|
else if ((lhs.FormatInfo.Format == Format.D24UnormS8Uint ||
|
||||||
lhs.FormatInfo.Format == Format.S8UintD24Unorm) && rhs.FormatInfo.Format == Format.B8G8R8A8Unorm)
|
lhs.FormatInfo.Format == Format.S8UintD24Unorm ||
|
||||||
|
lhs.FormatInfo.Format == Format.X8UintD24Unorm) && rhs.FormatInfo.Format == Format.B8G8R8A8Unorm)
|
||||||
{
|
{
|
||||||
return TextureMatchQuality.FormatAlias;
|
return TextureMatchQuality.FormatAlias;
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
Add(Format.S8Uint, new FormatInfo(1, false, false, All.StencilIndex8, PixelFormat.StencilIndex, PixelType.UnsignedByte));
|
Add(Format.S8Uint, new FormatInfo(1, false, false, All.StencilIndex8, PixelFormat.StencilIndex, PixelType.UnsignedByte));
|
||||||
Add(Format.D16Unorm, new FormatInfo(1, false, false, All.DepthComponent16, PixelFormat.DepthComponent, PixelType.UnsignedShort));
|
Add(Format.D16Unorm, new FormatInfo(1, false, false, All.DepthComponent16, PixelFormat.DepthComponent, PixelType.UnsignedShort));
|
||||||
Add(Format.S8UintD24Unorm, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
Add(Format.S8UintD24Unorm, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
||||||
|
Add(Format.X8UintD24Unorm, new FormatInfo(1, false, false, All.DepthComponent24, PixelFormat.DepthComponent, PixelType.UnsignedInt));
|
||||||
Add(Format.D32Float, new FormatInfo(1, false, false, All.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float));
|
Add(Format.D32Float, new FormatInfo(1, false, false, All.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float));
|
||||||
Add(Format.D24UnormS8Uint, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
Add(Format.D24UnormS8Uint, new FormatInfo(1, false, false, All.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248));
|
||||||
Add(Format.D32FloatS8Uint, new FormatInfo(1, false, false, All.Depth32fStencil8, PixelFormat.DepthStencil, PixelType.Float32UnsignedInt248Rev));
|
Add(Format.D32FloatS8Uint, new FormatInfo(1, false, false, All.Depth32fStencil8, PixelFormat.DepthStencil, PixelType.Float32UnsignedInt248Rev));
|
||||||
|
@ -224,5 +225,17 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
{
|
{
|
||||||
return _tableImage[(int)format];
|
return _tableImage[(int)format];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsPackedDepthStencil(Format format)
|
||||||
|
{
|
||||||
|
return format == Format.D24UnormS8Uint ||
|
||||||
|
format == Format.D32FloatS8Uint ||
|
||||||
|
format == Format.S8UintD24Unorm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsDepthOnly(Format format)
|
||||||
|
{
|
||||||
|
return format == Format.D16Unorm || format == Format.D32Float || format == Format.X8UintD24Unorm;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,11 +119,11 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
|
|
||||||
private static FramebufferAttachment GetAttachment(Format format)
|
private static FramebufferAttachment GetAttachment(Format format)
|
||||||
{
|
{
|
||||||
if (IsPackedDepthStencilFormat(format))
|
if (FormatTable.IsPackedDepthStencil(format))
|
||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthStencilAttachment;
|
return FramebufferAttachment.DepthStencilAttachment;
|
||||||
}
|
}
|
||||||
else if (IsDepthOnlyFormat(format))
|
else if (FormatTable.IsDepthOnly(format))
|
||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthAttachment;
|
return FramebufferAttachment.DepthAttachment;
|
||||||
}
|
}
|
||||||
|
@ -133,18 +133,6 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsPackedDepthStencilFormat(Format format)
|
|
||||||
{
|
|
||||||
return format == Format.D24UnormS8Uint ||
|
|
||||||
format == Format.D32FloatS8Uint ||
|
|
||||||
format == Format.S8UintD24Unorm;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsDepthOnlyFormat(Format format)
|
|
||||||
{
|
|
||||||
return format == Format.D16Unorm || format == Format.D32Float;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetColorLayerCount(int index)
|
public int GetColorLayerCount(int index)
|
||||||
{
|
{
|
||||||
return _colors[index]?.Info.GetDepthOrLayers() ?? 0;
|
return _colors[index]?.Info.GetDepthOrLayers() ?? 0;
|
||||||
|
|
|
@ -294,7 +294,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthStencilAttachment;
|
return FramebufferAttachment.DepthStencilAttachment;
|
||||||
}
|
}
|
||||||
else if (IsDepthOnly(format))
|
else if (FormatTable.IsDepthOnly(format))
|
||||||
{
|
{
|
||||||
return FramebufferAttachment.DepthAttachment;
|
return FramebufferAttachment.DepthAttachment;
|
||||||
}
|
}
|
||||||
|
@ -324,11 +324,11 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
|
|
||||||
private static ClearBufferMask GetMask(Format format)
|
private static ClearBufferMask GetMask(Format format)
|
||||||
{
|
{
|
||||||
if (format == Format.D24UnormS8Uint || format == Format.D32FloatS8Uint || format == Format.S8UintD24Unorm)
|
if (FormatTable.IsPackedDepthStencil(format))
|
||||||
{
|
{
|
||||||
return ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit;
|
return ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit;
|
||||||
}
|
}
|
||||||
else if (IsDepthOnly(format))
|
else if (FormatTable.IsDepthOnly(format))
|
||||||
{
|
{
|
||||||
return ClearBufferMask.DepthBufferBit;
|
return ClearBufferMask.DepthBufferBit;
|
||||||
}
|
}
|
||||||
|
@ -342,11 +342,6 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsDepthOnly(Format format)
|
|
||||||
{
|
|
||||||
return format == Format.D16Unorm || format == Format.D32Float;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextureView BgraSwap(TextureView from)
|
public TextureView BgraSwap(TextureView from)
|
||||||
{
|
{
|
||||||
TextureView to = (TextureView)_renderer.CreateTexture(from.Info);
|
TextureView to = (TextureView)_renderer.CreateTexture(from.Info);
|
||||||
|
|
|
@ -376,7 +376,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
return format switch
|
return format switch
|
||||||
{
|
{
|
||||||
Format.D16Unorm or Format.D32Float => ImageAspectFlags.DepthBit,
|
Format.D16Unorm or Format.D32Float or Format.X8UintD24Unorm => ImageAspectFlags.DepthBit,
|
||||||
Format.S8Uint => ImageAspectFlags.StencilBit,
|
Format.S8Uint => ImageAspectFlags.StencilBit,
|
||||||
Format.D24UnormS8Uint or
|
Format.D24UnormS8Uint or
|
||||||
Format.D32FloatS8Uint or
|
Format.D32FloatS8Uint or
|
||||||
|
@ -389,7 +389,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
return format switch
|
return format switch
|
||||||
{
|
{
|
||||||
Format.D16Unorm or Format.D32Float => ImageAspectFlags.DepthBit,
|
Format.D16Unorm or Format.D32Float or Format.X8UintD24Unorm => ImageAspectFlags.DepthBit,
|
||||||
Format.S8Uint => ImageAspectFlags.StencilBit,
|
Format.S8Uint => ImageAspectFlags.StencilBit,
|
||||||
Format.D24UnormS8Uint or
|
Format.D24UnormS8Uint or
|
||||||
Format.D32FloatS8Uint or
|
Format.D32FloatS8Uint or
|
||||||
|
|
|
@ -220,7 +220,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
public static bool IsD24S8(Format format)
|
public static bool IsD24S8(Format format)
|
||||||
{
|
{
|
||||||
return format == Format.D24UnormS8Uint || format == Format.S8UintD24Unorm;
|
return format == Format.D24UnormS8Uint || format == Format.S8UintD24Unorm || format == Format.X8UintD24Unorm;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsRGB16IntFloat(Format format)
|
private static bool IsRGB16IntFloat(Format format)
|
||||||
|
|
|
@ -67,6 +67,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
Add(Format.S8Uint, VkFormat.S8Uint);
|
Add(Format.S8Uint, VkFormat.S8Uint);
|
||||||
Add(Format.D16Unorm, VkFormat.D16Unorm);
|
Add(Format.D16Unorm, VkFormat.D16Unorm);
|
||||||
Add(Format.S8UintD24Unorm, VkFormat.D24UnormS8Uint);
|
Add(Format.S8UintD24Unorm, VkFormat.D24UnormS8Uint);
|
||||||
|
Add(Format.X8UintD24Unorm, VkFormat.X8D24UnormPack32);
|
||||||
Add(Format.D32Float, VkFormat.D32Sfloat);
|
Add(Format.D32Float, VkFormat.D32Sfloat);
|
||||||
Add(Format.D24UnormS8Uint, VkFormat.D24UnormS8Uint);
|
Add(Format.D24UnormS8Uint, VkFormat.D24UnormS8Uint);
|
||||||
Add(Format.D32FloatS8Uint, VkFormat.D32SfloatS8Uint);
|
Add(Format.D32FloatS8Uint, VkFormat.D32SfloatS8Uint);
|
||||||
|
|
|
@ -154,9 +154,8 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
Format.S8Uint => Format.R8Unorm,
|
Format.S8Uint => Format.R8Unorm,
|
||||||
Format.D16Unorm => Format.R16Unorm,
|
Format.D16Unorm => Format.R16Unorm,
|
||||||
Format.S8UintD24Unorm => Format.R8G8B8A8Unorm,
|
Format.D24UnormS8Uint or Format.S8UintD24Unorm or Format.X8UintD24Unorm => Format.R8G8B8A8Unorm,
|
||||||
Format.D32Float => Format.R32Float,
|
Format.D32Float => Format.R32Float,
|
||||||
Format.D24UnormS8Uint => Format.R8G8B8A8Unorm,
|
|
||||||
Format.D32FloatS8Uint => Format.R32G32Float,
|
Format.D32FloatS8Uint => Format.R32G32Float,
|
||||||
_ => throw new ArgumentException($"\"{format}\" is not a supported depth or stencil format."),
|
_ => throw new ArgumentException($"\"{format}\" is not a supported depth or stencil format."),
|
||||||
};
|
};
|
||||||
|
|
Reference in a new issue