1
0
Fork 0
forked from suyu/suyu

Merge pull request #4324 from ReinUsesLisp/formats

video_core: Fix, add and rename pixel formats
This commit is contained in:
bunnei 2020-07-21 00:13:04 -04:00 committed by GitHub
commit 3d13d7f48f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 1112 additions and 1101 deletions

View file

@ -17,101 +17,94 @@ namespace {
// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_view.txt // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_view.txt
constexpr std::array VIEW_CLASS_128_BITS = { constexpr std::array VIEW_CLASS_128_BITS = {
PixelFormat::RGBA32F, PixelFormat::R32G32B32A32_FLOAT,
PixelFormat::RGBA32UI, PixelFormat::R32G32B32A32_UINT,
PixelFormat::R32G32B32A32_SINT,
}; };
// Missing formats:
// PixelFormat::RGBA32I
constexpr std::array VIEW_CLASS_96_BITS = { constexpr std::array VIEW_CLASS_96_BITS = {
PixelFormat::RGB32F, PixelFormat::R32G32B32_FLOAT,
}; };
// Missing formats: // Missing formats:
// PixelFormat::RGB32UI, // PixelFormat::RGB32UI,
// PixelFormat::RGB32I, // PixelFormat::RGB32I,
constexpr std::array VIEW_CLASS_64_BITS = { constexpr std::array VIEW_CLASS_64_BITS = {
PixelFormat::RGBA16F, PixelFormat::RG32F, PixelFormat::RGBA16UI, PixelFormat::RG32UI, PixelFormat::R32G32_FLOAT, PixelFormat::R32G32_UINT,
PixelFormat::RGBA16U, PixelFormat::RGBA16F, PixelFormat::RGBA16S, PixelFormat::R32G32_SINT, PixelFormat::R16G16B16A16_FLOAT,
PixelFormat::R16G16B16A16_UNORM, PixelFormat::R16G16B16A16_SNORM,
PixelFormat::R16G16B16A16_UINT, PixelFormat::R16G16B16A16_SINT,
}; };
// Missing formats:
// PixelFormat::RGBA16I
// PixelFormat::RG32I
// TODO: How should we handle 48 bits? // TODO: How should we handle 48 bits?
constexpr std::array VIEW_CLASS_32_BITS = { constexpr std::array VIEW_CLASS_32_BITS = {
PixelFormat::RG16F, PixelFormat::R11FG11FB10F, PixelFormat::R32F, PixelFormat::R16G16_FLOAT, PixelFormat::B10G11R11_FLOAT, PixelFormat::R32_FLOAT,
PixelFormat::A2B10G10R10U, PixelFormat::RG16UI, PixelFormat::R32UI, PixelFormat::A2B10G10R10_UNORM, PixelFormat::R16G16_UINT, PixelFormat::R32_UINT,
PixelFormat::RG16I, PixelFormat::R32I, PixelFormat::ABGR8U, PixelFormat::R16G16_SINT, PixelFormat::R32_SINT, PixelFormat::A8B8G8R8_UNORM,
PixelFormat::RG16, PixelFormat::ABGR8S, PixelFormat::RG16S, PixelFormat::R16G16_UNORM, PixelFormat::A8B8G8R8_SNORM, PixelFormat::R16G16_SNORM,
PixelFormat::RGBA8_SRGB, PixelFormat::E5B9G9R9F, PixelFormat::BGRA8, PixelFormat::A8B8G8R8_SRGB, PixelFormat::E5B9G9R9_FLOAT, PixelFormat::B8G8R8A8_UNORM,
PixelFormat::BGRA8_SRGB, PixelFormat::B8G8R8A8_SRGB, PixelFormat::A8B8G8R8_UINT, PixelFormat::A8B8G8R8_SINT,
PixelFormat::A2B10G10R10_UINT,
}; };
// Missing formats:
// PixelFormat::RGBA8UI
// PixelFormat::RGBA8I
// PixelFormat::RGB10_A2_UI
// TODO: How should we handle 24 bits? // TODO: How should we handle 24 bits?
constexpr std::array VIEW_CLASS_16_BITS = { constexpr std::array VIEW_CLASS_16_BITS = {
PixelFormat::R16F, PixelFormat::RG8UI, PixelFormat::R16UI, PixelFormat::R16I, PixelFormat::R16_FLOAT, PixelFormat::R8G8_UINT, PixelFormat::R16_UINT,
PixelFormat::RG8U, PixelFormat::R16U, PixelFormat::RG8S, PixelFormat::R16S, PixelFormat::R16_SINT, PixelFormat::R8G8_UNORM, PixelFormat::R16_UNORM,
PixelFormat::R8G8_SNORM, PixelFormat::R16_SNORM, PixelFormat::R8G8_SINT,
}; };
// Missing formats:
// PixelFormat::RG8I
constexpr std::array VIEW_CLASS_8_BITS = { constexpr std::array VIEW_CLASS_8_BITS = {
PixelFormat::R8UI, PixelFormat::R8_UINT,
PixelFormat::R8U, PixelFormat::R8_UNORM,
PixelFormat::R8_SINT,
PixelFormat::R8_SNORM,
}; };
// Missing formats:
// PixelFormat::R8I
// PixelFormat::R8S
constexpr std::array VIEW_CLASS_RGTC1_RED = { constexpr std::array VIEW_CLASS_RGTC1_RED = {
PixelFormat::DXN1, PixelFormat::BC4_UNORM,
PixelFormat::BC4_SNORM,
}; };
// Missing formats:
// COMPRESSED_SIGNED_RED_RGTC1
constexpr std::array VIEW_CLASS_RGTC2_RG = { constexpr std::array VIEW_CLASS_RGTC2_RG = {
PixelFormat::DXN2UNORM, PixelFormat::BC5_UNORM,
PixelFormat::DXN2SNORM, PixelFormat::BC5_SNORM,
}; };
constexpr std::array VIEW_CLASS_BPTC_UNORM = { constexpr std::array VIEW_CLASS_BPTC_UNORM = {
PixelFormat::BC7U, PixelFormat::BC7_UNORM,
PixelFormat::BC7U_SRGB, PixelFormat::BC7_SRGB,
}; };
constexpr std::array VIEW_CLASS_BPTC_FLOAT = { constexpr std::array VIEW_CLASS_BPTC_FLOAT = {
PixelFormat::BC6H_SF16, PixelFormat::BC6H_SFLOAT,
PixelFormat::BC6H_UF16, PixelFormat::BC6H_UFLOAT,
}; };
// Compatibility table taken from Table 4.X.1 in: // Compatibility table taken from Table 4.X.1 in:
// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_copy_image.txt // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_copy_image.txt
constexpr std::array COPY_CLASS_128_BITS = { constexpr std::array COPY_CLASS_128_BITS = {
PixelFormat::RGBA32UI, PixelFormat::RGBA32F, PixelFormat::DXT23, PixelFormat::R32G32B32A32_UINT, PixelFormat::R32G32B32A32_FLOAT, PixelFormat::R32G32B32A32_SINT,
PixelFormat::DXT23_SRGB, PixelFormat::DXT45, PixelFormat::DXT45_SRGB, PixelFormat::BC2_UNORM, PixelFormat::BC2_SRGB, PixelFormat::BC3_UNORM,
PixelFormat::DXN2SNORM, PixelFormat::BC7U, PixelFormat::BC7U_SRGB, PixelFormat::BC3_SRGB, PixelFormat::BC5_UNORM, PixelFormat::BC5_SNORM,
PixelFormat::BC6H_SF16, PixelFormat::BC6H_UF16, PixelFormat::BC7_UNORM, PixelFormat::BC7_SRGB, PixelFormat::BC6H_SFLOAT,
PixelFormat::BC6H_UFLOAT,
}; };
// Missing formats: // Missing formats:
// PixelFormat::RGBA32I // PixelFormat::RGBA32I
// COMPRESSED_RG_RGTC2 // COMPRESSED_RG_RGTC2
constexpr std::array COPY_CLASS_64_BITS = { constexpr std::array COPY_CLASS_64_BITS = {
PixelFormat::RGBA16F, PixelFormat::RG32F, PixelFormat::RGBA16UI, PixelFormat::RG32UI, PixelFormat::R16G16B16A16_FLOAT, PixelFormat::R16G16B16A16_UINT,
PixelFormat::RGBA16U, PixelFormat::RGBA16S, PixelFormat::DXT1_SRGB, PixelFormat::DXT1, PixelFormat::R16G16B16A16_UNORM, PixelFormat::R16G16B16A16_SNORM,
PixelFormat::R16G16B16A16_SINT, PixelFormat::R32G32_UINT,
PixelFormat::R32G32_FLOAT, PixelFormat::R32G32_SINT,
PixelFormat::BC1_RGBA_UNORM, PixelFormat::BC1_RGBA_SRGB,
}; };
// Missing formats: // Missing formats:
// PixelFormat::RGBA16I
// PixelFormat::RG32I,
// COMPRESSED_RGB_S3TC_DXT1_EXT // COMPRESSED_RGB_S3TC_DXT1_EXT
// COMPRESSED_SRGB_S3TC_DXT1_EXT // COMPRESSED_SRGB_S3TC_DXT1_EXT
// COMPRESSED_RGBA_S3TC_DXT1_EXT // COMPRESSED_RGBA_S3TC_DXT1_EXT

View file

@ -40,53 +40,61 @@ namespace Tegra {
enum class RenderTargetFormat : u32 { enum class RenderTargetFormat : u32 {
NONE = 0x0, NONE = 0x0,
RGBA32_FLOAT = 0xC0, R32B32G32A32_FLOAT = 0xC0,
RGBA32_UINT = 0xC2, R32G32B32A32_SINT = 0xC1,
RGBA16_UNORM = 0xC6, R32G32B32A32_UINT = 0xC2,
RGBA16_SNORM = 0xC7, R16G16B16A16_UNORM = 0xC6,
RGBA16_UINT = 0xC9, R16G16B16A16_SNORM = 0xC7,
RGBA16_FLOAT = 0xCA, R16G16B16A16_SINT = 0xC8,
RG32_FLOAT = 0xCB, R16G16B16A16_UINT = 0xC9,
RG32_UINT = 0xCD, R16G16B16A16_FLOAT = 0xCA,
RGBX16_FLOAT = 0xCE, R32G32_FLOAT = 0xCB,
BGRA8_UNORM = 0xCF, R32G32_SINT = 0xCC,
BGRA8_SRGB = 0xD0, R32G32_UINT = 0xCD,
RGB10_A2_UNORM = 0xD1, R16G16B16X16_FLOAT = 0xCE,
RGBA8_UNORM = 0xD5, B8G8R8A8_UNORM = 0xCF,
RGBA8_SRGB = 0xD6, B8G8R8A8_SRGB = 0xD0,
RGBA8_SNORM = 0xD7, A2B10G10R10_UNORM = 0xD1,
RGBA8_UINT = 0xD9, A2B10G10R10_UINT = 0xD2,
RG16_UNORM = 0xDA, A8B8G8R8_UNORM = 0xD5,
RG16_SNORM = 0xDB, A8B8G8R8_SRGB = 0xD6,
RG16_SINT = 0xDC, A8B8G8R8_SNORM = 0xD7,
RG16_UINT = 0xDD, A8B8G8R8_SINT = 0xD8,
RG16_FLOAT = 0xDE, A8B8G8R8_UINT = 0xD9,
R11G11B10_FLOAT = 0xE0, R16G16_UNORM = 0xDA,
R16G16_SNORM = 0xDB,
R16G16_SINT = 0xDC,
R16G16_UINT = 0xDD,
R16G16_FLOAT = 0xDE,
B10G11R11_FLOAT = 0xE0,
R32_SINT = 0xE3, R32_SINT = 0xE3,
R32_UINT = 0xE4, R32_UINT = 0xE4,
R32_FLOAT = 0xE5, R32_FLOAT = 0xE5,
B5G6R5_UNORM = 0xE8, R5G6B5_UNORM = 0xE8,
BGR5A1_UNORM = 0xE9, A1R5G5B5_UNORM = 0xE9,
RG8_UNORM = 0xEA, R8G8_UNORM = 0xEA,
RG8_SNORM = 0xEB, R8G8_SNORM = 0xEB,
RG8_UINT = 0xED, R8G8_SINT = 0xEC,
R8G8_UINT = 0xED,
R16_UNORM = 0xEE, R16_UNORM = 0xEE,
R16_SNORM = 0xEF, R16_SNORM = 0xEF,
R16_SINT = 0xF0, R16_SINT = 0xF0,
R16_UINT = 0xF1, R16_UINT = 0xF1,
R16_FLOAT = 0xF2, R16_FLOAT = 0xF2,
R8_UNORM = 0xF3, R8_UNORM = 0xF3,
R8_SNORM = 0xF4,
R8_SINT = 0xF5,
R8_UINT = 0xF6, R8_UINT = 0xF6,
}; };
enum class DepthFormat : u32 { enum class DepthFormat : u32 {
Z32_FLOAT = 0xA, D32_FLOAT = 0xA,
Z16_UNORM = 0x13, D16_UNORM = 0x13,
S8_Z24_UNORM = 0x14, S8_UINT_Z24_UNORM = 0x14,
Z24_X8_UNORM = 0x15, D24X8_UNORM = 0x15,
Z24_S8_UNORM = 0x16, D24S8_UNORM = 0x16,
Z24_C8_UNORM = 0x18, D24C8_UNORM = 0x18,
Z32_S8_X24_FLOAT = 0x19, D32_FLOAT_S8X24_UINT = 0x19,
}; };
struct CommandListHeader; struct CommandListHeader;
@ -97,9 +105,9 @@ class DebugContext;
*/ */
struct FramebufferConfig { struct FramebufferConfig {
enum class PixelFormat : u32 { enum class PixelFormat : u32 {
ABGR8 = 1, A8B8G8R8_UNORM = 1,
RGB565 = 4, RGB565_UNORM = 4,
BGRA8 = 5, B8G8R8A8_UNORM = 5,
}; };
VAddr address; VAddr address;

View file

@ -41,146 +41,168 @@ static void MortonCopy(u32 stride, u32 block_height, u32 height, u32 block_depth
} }
static constexpr ConversionArray morton_to_linear_fns = { static constexpr ConversionArray morton_to_linear_fns = {
MortonCopy<true, PixelFormat::ABGR8U>, MortonCopy<true, PixelFormat::A8B8G8R8_UNORM>,
MortonCopy<true, PixelFormat::ABGR8S>, MortonCopy<true, PixelFormat::A8B8G8R8_SNORM>,
MortonCopy<true, PixelFormat::ABGR8UI>, MortonCopy<true, PixelFormat::A8B8G8R8_SINT>,
MortonCopy<true, PixelFormat::B5G6R5U>, MortonCopy<true, PixelFormat::A8B8G8R8_UINT>,
MortonCopy<true, PixelFormat::A2B10G10R10U>, MortonCopy<true, PixelFormat::R5G6B5_UNORM>,
MortonCopy<true, PixelFormat::A1B5G5R5U>, MortonCopy<true, PixelFormat::B5G6R5_UNORM>,
MortonCopy<true, PixelFormat::R8U>, MortonCopy<true, PixelFormat::A1R5G5B5_UNORM>,
MortonCopy<true, PixelFormat::R8UI>, MortonCopy<true, PixelFormat::A2B10G10R10_UNORM>,
MortonCopy<true, PixelFormat::RGBA16F>, MortonCopy<true, PixelFormat::A2B10G10R10_UINT>,
MortonCopy<true, PixelFormat::RGBA16U>, MortonCopy<true, PixelFormat::A1B5G5R5_UNORM>,
MortonCopy<true, PixelFormat::RGBA16S>, MortonCopy<true, PixelFormat::R8_UNORM>,
MortonCopy<true, PixelFormat::RGBA16UI>, MortonCopy<true, PixelFormat::R8_SNORM>,
MortonCopy<true, PixelFormat::R11FG11FB10F>, MortonCopy<true, PixelFormat::R8_SINT>,
MortonCopy<true, PixelFormat::RGBA32UI>, MortonCopy<true, PixelFormat::R8_UINT>,
MortonCopy<true, PixelFormat::DXT1>, MortonCopy<true, PixelFormat::R16G16B16A16_FLOAT>,
MortonCopy<true, PixelFormat::DXT23>, MortonCopy<true, PixelFormat::R16G16B16A16_UNORM>,
MortonCopy<true, PixelFormat::DXT45>, MortonCopy<true, PixelFormat::R16G16B16A16_SNORM>,
MortonCopy<true, PixelFormat::DXN1>, MortonCopy<true, PixelFormat::R16G16B16A16_SINT>,
MortonCopy<true, PixelFormat::DXN2UNORM>, MortonCopy<true, PixelFormat::R16G16B16A16_UINT>,
MortonCopy<true, PixelFormat::DXN2SNORM>, MortonCopy<true, PixelFormat::B10G11R11_FLOAT>,
MortonCopy<true, PixelFormat::BC7U>, MortonCopy<true, PixelFormat::R32G32B32A32_UINT>,
MortonCopy<true, PixelFormat::BC6H_UF16>, MortonCopy<true, PixelFormat::BC1_RGBA_UNORM>,
MortonCopy<true, PixelFormat::BC6H_SF16>, MortonCopy<true, PixelFormat::BC2_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_4X4>, MortonCopy<true, PixelFormat::BC3_UNORM>,
MortonCopy<true, PixelFormat::BGRA8>, MortonCopy<true, PixelFormat::BC4_UNORM>,
MortonCopy<true, PixelFormat::RGBA32F>, MortonCopy<true, PixelFormat::BC4_SNORM>,
MortonCopy<true, PixelFormat::RG32F>, MortonCopy<true, PixelFormat::BC5_UNORM>,
MortonCopy<true, PixelFormat::R32F>, MortonCopy<true, PixelFormat::BC5_SNORM>,
MortonCopy<true, PixelFormat::R16F>, MortonCopy<true, PixelFormat::BC7_UNORM>,
MortonCopy<true, PixelFormat::R16U>, MortonCopy<true, PixelFormat::BC6H_UFLOAT>,
MortonCopy<true, PixelFormat::R16S>, MortonCopy<true, PixelFormat::BC6H_SFLOAT>,
MortonCopy<true, PixelFormat::R16UI>, MortonCopy<true, PixelFormat::ASTC_2D_4X4_UNORM>,
MortonCopy<true, PixelFormat::R16I>, MortonCopy<true, PixelFormat::B8G8R8A8_UNORM>,
MortonCopy<true, PixelFormat::RG16>, MortonCopy<true, PixelFormat::R32G32B32A32_FLOAT>,
MortonCopy<true, PixelFormat::RG16F>, MortonCopy<true, PixelFormat::R32G32B32A32_SINT>,
MortonCopy<true, PixelFormat::RG16UI>, MortonCopy<true, PixelFormat::R32G32_FLOAT>,
MortonCopy<true, PixelFormat::RG16I>, MortonCopy<true, PixelFormat::R32G32_SINT>,
MortonCopy<true, PixelFormat::RG16S>, MortonCopy<true, PixelFormat::R32_FLOAT>,
MortonCopy<true, PixelFormat::RGB32F>, MortonCopy<true, PixelFormat::R16_FLOAT>,
MortonCopy<true, PixelFormat::RGBA8_SRGB>, MortonCopy<true, PixelFormat::R16_UNORM>,
MortonCopy<true, PixelFormat::RG8U>, MortonCopy<true, PixelFormat::R16_SNORM>,
MortonCopy<true, PixelFormat::RG8S>, MortonCopy<true, PixelFormat::R16_UINT>,
MortonCopy<true, PixelFormat::RG8UI>, MortonCopy<true, PixelFormat::R16_SINT>,
MortonCopy<true, PixelFormat::RG32UI>, MortonCopy<true, PixelFormat::R16G16_UNORM>,
MortonCopy<true, PixelFormat::RGBX16F>, MortonCopy<true, PixelFormat::R16G16_FLOAT>,
MortonCopy<true, PixelFormat::R32UI>, MortonCopy<true, PixelFormat::R16G16_UINT>,
MortonCopy<true, PixelFormat::R32I>, MortonCopy<true, PixelFormat::R16G16_SINT>,
MortonCopy<true, PixelFormat::ASTC_2D_8X8>, MortonCopy<true, PixelFormat::R16G16_SNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_8X5>, MortonCopy<true, PixelFormat::R32G32B32_FLOAT>,
MortonCopy<true, PixelFormat::ASTC_2D_5X4>, MortonCopy<true, PixelFormat::A8B8G8R8_SRGB>,
MortonCopy<true, PixelFormat::BGRA8_SRGB>, MortonCopy<true, PixelFormat::R8G8_UNORM>,
MortonCopy<true, PixelFormat::DXT1_SRGB>, MortonCopy<true, PixelFormat::R8G8_SNORM>,
MortonCopy<true, PixelFormat::DXT23_SRGB>, MortonCopy<true, PixelFormat::R8G8_SINT>,
MortonCopy<true, PixelFormat::DXT45_SRGB>, MortonCopy<true, PixelFormat::R8G8_UINT>,
MortonCopy<true, PixelFormat::BC7U_SRGB>, MortonCopy<true, PixelFormat::R32G32_UINT>,
MortonCopy<true, PixelFormat::R4G4B4A4U>, MortonCopy<true, PixelFormat::R16G16B16X16_FLOAT>,
MortonCopy<true, PixelFormat::R32_UINT>,
MortonCopy<true, PixelFormat::R32_SINT>,
MortonCopy<true, PixelFormat::ASTC_2D_8X8_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_8X5_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_5X4_UNORM>,
MortonCopy<true, PixelFormat::B8G8R8A8_SRGB>,
MortonCopy<true, PixelFormat::BC1_RGBA_SRGB>,
MortonCopy<true, PixelFormat::BC2_SRGB>,
MortonCopy<true, PixelFormat::BC3_SRGB>,
MortonCopy<true, PixelFormat::BC7_SRGB>,
MortonCopy<true, PixelFormat::A4B4G4R4_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_4X4_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_4X4_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_8X8_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_8X8_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_8X5_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_8X5_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_5X4_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_5X4_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_5X5>, MortonCopy<true, PixelFormat::ASTC_2D_5X5_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_5X5_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_5X5_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_10X8>, MortonCopy<true, PixelFormat::ASTC_2D_10X8_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_10X8_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_10X8_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_6X6>, MortonCopy<true, PixelFormat::ASTC_2D_6X6_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_6X6_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_6X6_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_10X10>, MortonCopy<true, PixelFormat::ASTC_2D_10X10_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_10X10_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_10X10_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_12X12>, MortonCopy<true, PixelFormat::ASTC_2D_12X12_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_12X12_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_12X12_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_8X6>, MortonCopy<true, PixelFormat::ASTC_2D_8X6_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_8X6_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_8X6_SRGB>,
MortonCopy<true, PixelFormat::ASTC_2D_6X5>, MortonCopy<true, PixelFormat::ASTC_2D_6X5_UNORM>,
MortonCopy<true, PixelFormat::ASTC_2D_6X5_SRGB>, MortonCopy<true, PixelFormat::ASTC_2D_6X5_SRGB>,
MortonCopy<true, PixelFormat::E5B9G9R9F>, MortonCopy<true, PixelFormat::E5B9G9R9_FLOAT>,
MortonCopy<true, PixelFormat::Z32F>, MortonCopy<true, PixelFormat::D32_FLOAT>,
MortonCopy<true, PixelFormat::Z16>, MortonCopy<true, PixelFormat::D16_UNORM>,
MortonCopy<true, PixelFormat::Z24S8>, MortonCopy<true, PixelFormat::D24_UNORM_S8_UINT>,
MortonCopy<true, PixelFormat::S8Z24>, MortonCopy<true, PixelFormat::S8_UINT_D24_UNORM>,
MortonCopy<true, PixelFormat::Z32FS8>, MortonCopy<true, PixelFormat::D32_FLOAT_S8_UINT>,
}; };
static constexpr ConversionArray linear_to_morton_fns = { static constexpr ConversionArray linear_to_morton_fns = {
MortonCopy<false, PixelFormat::ABGR8U>, MortonCopy<false, PixelFormat::A8B8G8R8_UNORM>,
MortonCopy<false, PixelFormat::ABGR8S>, MortonCopy<false, PixelFormat::A8B8G8R8_SNORM>,
MortonCopy<false, PixelFormat::ABGR8UI>, MortonCopy<false, PixelFormat::A8B8G8R8_SINT>,
MortonCopy<false, PixelFormat::B5G6R5U>, MortonCopy<false, PixelFormat::A8B8G8R8_UINT>,
MortonCopy<false, PixelFormat::A2B10G10R10U>, MortonCopy<false, PixelFormat::R5G6B5_UNORM>,
MortonCopy<false, PixelFormat::A1B5G5R5U>, MortonCopy<false, PixelFormat::B5G6R5_UNORM>,
MortonCopy<false, PixelFormat::R8U>, MortonCopy<false, PixelFormat::A1R5G5B5_UNORM>,
MortonCopy<false, PixelFormat::R8UI>, MortonCopy<false, PixelFormat::A2B10G10R10_UNORM>,
MortonCopy<false, PixelFormat::RGBA16F>, MortonCopy<false, PixelFormat::A2B10G10R10_UINT>,
MortonCopy<false, PixelFormat::RGBA16S>, MortonCopy<false, PixelFormat::A1B5G5R5_UNORM>,
MortonCopy<false, PixelFormat::RGBA16U>, MortonCopy<false, PixelFormat::R8_UNORM>,
MortonCopy<false, PixelFormat::RGBA16UI>, MortonCopy<false, PixelFormat::R8_SNORM>,
MortonCopy<false, PixelFormat::R11FG11FB10F>, MortonCopy<false, PixelFormat::R8_SINT>,
MortonCopy<false, PixelFormat::RGBA32UI>, MortonCopy<false, PixelFormat::R8_UINT>,
MortonCopy<false, PixelFormat::DXT1>, MortonCopy<false, PixelFormat::R16G16B16A16_FLOAT>,
MortonCopy<false, PixelFormat::DXT23>, MortonCopy<false, PixelFormat::R16G16B16A16_SNORM>,
MortonCopy<false, PixelFormat::DXT45>, MortonCopy<false, PixelFormat::R16G16B16A16_SINT>,
MortonCopy<false, PixelFormat::DXN1>, MortonCopy<false, PixelFormat::R16G16B16A16_UNORM>,
MortonCopy<false, PixelFormat::DXN2UNORM>, MortonCopy<false, PixelFormat::R16G16B16A16_UINT>,
MortonCopy<false, PixelFormat::DXN2SNORM>, MortonCopy<false, PixelFormat::B10G11R11_FLOAT>,
MortonCopy<false, PixelFormat::BC7U>, MortonCopy<false, PixelFormat::R32G32B32A32_UINT>,
MortonCopy<false, PixelFormat::BC6H_UF16>, MortonCopy<false, PixelFormat::BC1_RGBA_UNORM>,
MortonCopy<false, PixelFormat::BC6H_SF16>, MortonCopy<false, PixelFormat::BC2_UNORM>,
MortonCopy<false, PixelFormat::BC3_UNORM>,
MortonCopy<false, PixelFormat::BC4_UNORM>,
MortonCopy<false, PixelFormat::BC4_SNORM>,
MortonCopy<false, PixelFormat::BC5_UNORM>,
MortonCopy<false, PixelFormat::BC5_SNORM>,
MortonCopy<false, PixelFormat::BC7_UNORM>,
MortonCopy<false, PixelFormat::BC6H_UFLOAT>,
MortonCopy<false, PixelFormat::BC6H_SFLOAT>,
// TODO(Subv): Swizzling ASTC formats are not supported // TODO(Subv): Swizzling ASTC formats are not supported
nullptr, nullptr,
MortonCopy<false, PixelFormat::BGRA8>, MortonCopy<false, PixelFormat::B8G8R8A8_UNORM>,
MortonCopy<false, PixelFormat::RGBA32F>, MortonCopy<false, PixelFormat::R32G32B32A32_FLOAT>,
MortonCopy<false, PixelFormat::RG32F>, MortonCopy<false, PixelFormat::R32G32B32A32_SINT>,
MortonCopy<false, PixelFormat::R32F>, MortonCopy<false, PixelFormat::R32G32_FLOAT>,
MortonCopy<false, PixelFormat::R16F>, MortonCopy<false, PixelFormat::R32G32_SINT>,
MortonCopy<false, PixelFormat::R16U>, MortonCopy<false, PixelFormat::R32_FLOAT>,
MortonCopy<false, PixelFormat::R16S>, MortonCopy<false, PixelFormat::R16_FLOAT>,
MortonCopy<false, PixelFormat::R16UI>, MortonCopy<false, PixelFormat::R16_UNORM>,
MortonCopy<false, PixelFormat::R16I>, MortonCopy<false, PixelFormat::R16_SNORM>,
MortonCopy<false, PixelFormat::RG16>, MortonCopy<false, PixelFormat::R16_UINT>,
MortonCopy<false, PixelFormat::RG16F>, MortonCopy<false, PixelFormat::R16_SINT>,
MortonCopy<false, PixelFormat::RG16UI>, MortonCopy<false, PixelFormat::R16G16_UNORM>,
MortonCopy<false, PixelFormat::RG16I>, MortonCopy<false, PixelFormat::R16G16_FLOAT>,
MortonCopy<false, PixelFormat::RG16S>, MortonCopy<false, PixelFormat::R16G16_UINT>,
MortonCopy<false, PixelFormat::RGB32F>, MortonCopy<false, PixelFormat::R16G16_SINT>,
MortonCopy<false, PixelFormat::RGBA8_SRGB>, MortonCopy<false, PixelFormat::R16G16_SNORM>,
MortonCopy<false, PixelFormat::RG8U>, MortonCopy<false, PixelFormat::R32G32B32_FLOAT>,
MortonCopy<false, PixelFormat::RG8S>, MortonCopy<false, PixelFormat::A8B8G8R8_SRGB>,
MortonCopy<false, PixelFormat::RG8UI>, MortonCopy<false, PixelFormat::R8G8_UNORM>,
MortonCopy<false, PixelFormat::RG32UI>, MortonCopy<false, PixelFormat::R8G8_SNORM>,
MortonCopy<false, PixelFormat::RGBX16F>, MortonCopy<false, PixelFormat::R8G8_SINT>,
MortonCopy<false, PixelFormat::R32UI>, MortonCopy<false, PixelFormat::R8G8_UINT>,
MortonCopy<false, PixelFormat::R32I>, MortonCopy<false, PixelFormat::R32G32_UINT>,
MortonCopy<false, PixelFormat::R16G16B16X16_FLOAT>,
MortonCopy<false, PixelFormat::R32_UINT>,
MortonCopy<false, PixelFormat::R32_SINT>,
nullptr, nullptr,
nullptr, nullptr,
nullptr, nullptr,
MortonCopy<false, PixelFormat::BGRA8_SRGB>, MortonCopy<false, PixelFormat::B8G8R8A8_SRGB>,
MortonCopy<false, PixelFormat::DXT1_SRGB>, MortonCopy<false, PixelFormat::BC1_RGBA_SRGB>,
MortonCopy<false, PixelFormat::DXT23_SRGB>, MortonCopy<false, PixelFormat::BC2_SRGB>,
MortonCopy<false, PixelFormat::DXT45_SRGB>, MortonCopy<false, PixelFormat::BC3_SRGB>,
MortonCopy<false, PixelFormat::BC7U_SRGB>, MortonCopy<false, PixelFormat::BC7_SRGB>,
MortonCopy<false, PixelFormat::R4G4B4A4U>, MortonCopy<false, PixelFormat::A4B4G4R4_UNORM>,
nullptr, nullptr,
nullptr, nullptr,
nullptr, nullptr,
@ -199,12 +221,12 @@ static constexpr ConversionArray linear_to_morton_fns = {
nullptr, nullptr,
nullptr, nullptr,
nullptr, nullptr,
MortonCopy<false, PixelFormat::E5B9G9R9F>, MortonCopy<false, PixelFormat::E5B9G9R9_FLOAT>,
MortonCopy<false, PixelFormat::Z32F>, MortonCopy<false, PixelFormat::D32_FLOAT>,
MortonCopy<false, PixelFormat::Z16>, MortonCopy<false, PixelFormat::D16_UNORM>,
MortonCopy<false, PixelFormat::Z24S8>, MortonCopy<false, PixelFormat::D24_UNORM_S8_UINT>,
MortonCopy<false, PixelFormat::S8Z24>, MortonCopy<false, PixelFormat::S8_UINT_D24_UNORM>,
MortonCopy<false, PixelFormat::Z32FS8>, MortonCopy<false, PixelFormat::D32_FLOAT_S8_UINT>,
}; };
static MortonCopyFn GetSwizzleFunction(MortonSwizzleMode mode, Surface::PixelFormat format) { static MortonCopyFn GetSwizzleFunction(MortonSwizzleMode mode, Surface::PixelFormat format) {

View file

@ -41,91 +41,103 @@ struct FormatTuple {
}; };
constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> tex_format_tuples = {{ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> tex_format_tuples = {{
{GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // ABGR8U {GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // A8B8G8R8_UNORM
{GL_RGBA8_SNORM, GL_RGBA, GL_BYTE}, // ABGR8S {GL_RGBA8_SNORM, GL_RGBA, GL_BYTE}, // A8B8G8R8_SNORM
{GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE}, // ABGR8UI {GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE}, // A8B8G8R8_SINT
{GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV}, // B5G6R5U {GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE}, // A8B8G8R8_UINT
{GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10U {GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5}, // R5G6B5_UNORM
{GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5U {GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV}, // B5G6R5_UNORM
{GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8U {GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1R5G5B5_UNORM
{GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE}, // R8UI {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM
{GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT}, // RGBA16F {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT
{GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT}, // RGBA16U {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM
{GL_RGBA16_SNORM, GL_RGBA, GL_SHORT}, // RGBA16S {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM
{GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT}, // RGBA16UI {GL_R8_SNORM, GL_RED, GL_BYTE}, // R8_SNORM
{GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV}, // R11FG11FB10F {GL_R8I, GL_RED_INTEGER, GL_BYTE}, // R8_SINT
{GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT}, // RGBA32UI {GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE}, // R8_UINT
{GL_COMPRESSED_RGBA_S3TC_DXT1_EXT}, // DXT1 {GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT}, // R16G16B16A16_FLOAT
{GL_COMPRESSED_RGBA_S3TC_DXT3_EXT}, // DXT23 {GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT}, // R16G16B16A16_UNORM
{GL_COMPRESSED_RGBA_S3TC_DXT5_EXT}, // DXT45 {GL_RGBA16_SNORM, GL_RGBA, GL_SHORT}, // R16G16B16A16_SNORM
{GL_COMPRESSED_RED_RGTC1}, // DXN1 {GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT}, // R16G16B16A16_SINT
{GL_COMPRESSED_RG_RGTC2}, // DXN2UNORM {GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT}, // R16G16B16A16_UINT
{GL_COMPRESSED_SIGNED_RG_RGTC2}, // DXN2SNORM {GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV}, // B10G11R11_FLOAT
{GL_COMPRESSED_RGBA_BPTC_UNORM}, // BC7U {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT}, // R32G32B32A32_UINT
{GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}, // BC6H_UF16 {GL_COMPRESSED_RGBA_S3TC_DXT1_EXT}, // BC1_RGBA_UNORM
{GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT}, // BC6H_SF16 {GL_COMPRESSED_RGBA_S3TC_DXT3_EXT}, // BC2_UNORM
{GL_COMPRESSED_RGBA_ASTC_4x4_KHR}, // ASTC_2D_4X4 {GL_COMPRESSED_RGBA_S3TC_DXT5_EXT}, // BC3_UNORM
{GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE}, // BGRA8 {GL_COMPRESSED_RED_RGTC1}, // BC4_UNORM
{GL_RGBA32F, GL_RGBA, GL_FLOAT}, // RGBA32F {GL_COMPRESSED_SIGNED_RED_RGTC1}, // BC4_SNORM
{GL_RG32F, GL_RG, GL_FLOAT}, // RG32F {GL_COMPRESSED_RG_RGTC2}, // BC5_UNORM
{GL_R32F, GL_RED, GL_FLOAT}, // R32F {GL_COMPRESSED_SIGNED_RG_RGTC2}, // BC5_SNORM
{GL_R16F, GL_RED, GL_HALF_FLOAT}, // R16F {GL_COMPRESSED_RGBA_BPTC_UNORM}, // BC7_UNORM
{GL_R16, GL_RED, GL_UNSIGNED_SHORT}, // R16U {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}, // BC6H_UFLOAT
{GL_R16_SNORM, GL_RED, GL_SHORT}, // R16S {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT}, // BC6H_SFLOAT
{GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT}, // R16UI {GL_COMPRESSED_RGBA_ASTC_4x4_KHR}, // ASTC_2D_4X4_UNORM
{GL_R16I, GL_RED_INTEGER, GL_SHORT}, // R16I {GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE}, // B8G8R8A8_UNORM
{GL_RG16, GL_RG, GL_UNSIGNED_SHORT}, // RG16 {GL_RGBA32F, GL_RGBA, GL_FLOAT}, // R32G32B32A32_FLOAT
{GL_RG16F, GL_RG, GL_HALF_FLOAT}, // RG16F {GL_RGBA32I, GL_RGBA_INTEGER, GL_INT}, // R32G32B32A32_SINT
{GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT}, // RG16UI {GL_RG32F, GL_RG, GL_FLOAT}, // R32G32_FLOAT
{GL_RG16I, GL_RG_INTEGER, GL_SHORT}, // RG16I {GL_RG32I, GL_RG_INTEGER, GL_INT}, // R32G32_SINT
{GL_RG16_SNORM, GL_RG, GL_SHORT}, // RG16S {GL_R32F, GL_RED, GL_FLOAT}, // R32_FLOAT
{GL_RGB32F, GL_RGB, GL_FLOAT}, // RGB32F {GL_R16F, GL_RED, GL_HALF_FLOAT}, // R16_FLOAT
{GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // RGBA8_SRGB {GL_R16, GL_RED, GL_UNSIGNED_SHORT}, // R16_UNORM
{GL_RG8, GL_RG, GL_UNSIGNED_BYTE}, // RG8U {GL_R16_SNORM, GL_RED, GL_SHORT}, // R16_SNORM
{GL_RG8_SNORM, GL_RG, GL_BYTE}, // RG8S {GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT}, // R16_UINT
{GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_INT}, // RG8UI {GL_R16I, GL_RED_INTEGER, GL_SHORT}, // R16_SINT
{GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT}, // RG32UI {GL_RG16, GL_RG, GL_UNSIGNED_SHORT}, // R16G16_UNORM
{GL_RGB16F, GL_RGBA, GL_HALF_FLOAT}, // RGBX16F {GL_RG16F, GL_RG, GL_HALF_FLOAT}, // R16G16_FLOAT
{GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT}, // R32UI {GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT}, // R16G16_UINT
{GL_R32I, GL_RED_INTEGER, GL_INT}, // R32I {GL_RG16I, GL_RG_INTEGER, GL_SHORT}, // R16G16_SINT
{GL_COMPRESSED_RGBA_ASTC_8x8_KHR}, // ASTC_2D_8X8 {GL_RG16_SNORM, GL_RG, GL_SHORT}, // R16G16_SNORM
{GL_COMPRESSED_RGBA_ASTC_8x5_KHR}, // ASTC_2D_8X5 {GL_RGB32F, GL_RGB, GL_FLOAT}, // R32G32B32_FLOAT
{GL_COMPRESSED_RGBA_ASTC_5x4_KHR}, // ASTC_2D_5X4 {GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // A8B8G8R8_SRGB
{GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE}, // BGRA8 {GL_RG8, GL_RG, GL_UNSIGNED_BYTE}, // R8G8_UNORM
{GL_RG8_SNORM, GL_RG, GL_BYTE}, // R8G8_SNORM
{GL_RG8I, GL_RG_INTEGER, GL_BYTE}, // R8G8_SINT
{GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE}, // R8G8_UINT
{GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT}, // R32G32_UINT
{GL_RGB16F, GL_RGBA, GL_HALF_FLOAT}, // R16G16B16X16_FLOAT
{GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT}, // R32_UINT
{GL_R32I, GL_RED_INTEGER, GL_INT}, // R32_SINT
{GL_COMPRESSED_RGBA_ASTC_8x8_KHR}, // ASTC_2D_8X8_UNORM
{GL_COMPRESSED_RGBA_ASTC_8x5_KHR}, // ASTC_2D_8X5_UNORM
{GL_COMPRESSED_RGBA_ASTC_5x4_KHR}, // ASTC_2D_5X4_UNORM
{GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE}, // B8G8R8A8_UNORM
// Compressed sRGB formats // Compressed sRGB formats
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT}, // DXT1_SRGB {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT}, // BC1_RGBA_SRGB
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT}, // DXT23_SRGB {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT}, // BC2_SRGB
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // DXT45_SRGB {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB
{GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7U_SRGB {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7_SRGB
{GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // R4G4B4A4U {GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // A4B4G4R4_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR}, // ASTC_2D_5X4_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR}, // ASTC_2D_5X4_SRGB
{GL_COMPRESSED_RGBA_ASTC_5x5_KHR}, // ASTC_2D_5X5 {GL_COMPRESSED_RGBA_ASTC_5x5_KHR}, // ASTC_2D_5X5_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR}, // ASTC_2D_5X5_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR}, // ASTC_2D_5X5_SRGB
{GL_COMPRESSED_RGBA_ASTC_10x8_KHR}, // ASTC_2D_10X8 {GL_COMPRESSED_RGBA_ASTC_10x8_KHR}, // ASTC_2D_10X8_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR}, // ASTC_2D_10X8_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR}, // ASTC_2D_10X8_SRGB
{GL_COMPRESSED_RGBA_ASTC_6x6_KHR}, // ASTC_2D_6X6 {GL_COMPRESSED_RGBA_ASTC_6x6_KHR}, // ASTC_2D_6X6_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR}, // ASTC_2D_6X6_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR}, // ASTC_2D_6X6_SRGB
{GL_COMPRESSED_RGBA_ASTC_10x10_KHR}, // ASTC_2D_10X10 {GL_COMPRESSED_RGBA_ASTC_10x10_KHR}, // ASTC_2D_10X10_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR}, // ASTC_2D_10X10_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR}, // ASTC_2D_10X10_SRGB
{GL_COMPRESSED_RGBA_ASTC_12x12_KHR}, // ASTC_2D_12X12 {GL_COMPRESSED_RGBA_ASTC_12x12_KHR}, // ASTC_2D_12X12_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR}, // ASTC_2D_12X12_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR}, // ASTC_2D_12X12_SRGB
{GL_COMPRESSED_RGBA_ASTC_8x6_KHR}, // ASTC_2D_8X6 {GL_COMPRESSED_RGBA_ASTC_8x6_KHR}, // ASTC_2D_8X6_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR}, // ASTC_2D_8X6_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR}, // ASTC_2D_8X6_SRGB
{GL_COMPRESSED_RGBA_ASTC_6x5_KHR}, // ASTC_2D_6X5 {GL_COMPRESSED_RGBA_ASTC_6x5_KHR}, // ASTC_2D_6X5_UNORM
{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR}, // ASTC_2D_6X5_SRGB {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR}, // ASTC_2D_6X5_SRGB
{GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV}, // E5B9G9R9F {GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV}, // E5B9G9R9_FLOAT
// Depth formats // Depth formats
{GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT}, // Z32F {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT}, // D32_FLOAT
{GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // Z16 {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // D16_UNORM
// DepthStencil formats // DepthStencil formats
{GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // Z24S8 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // D24_UNORM_S8_UINT
{GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // S8Z24 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // S8_UINT_D24_UNORM
{GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // Z32FS8 {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL,
GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // D32_FLOAT_S8_UINT
}}; }};
const FormatTuple& GetFormatTuple(PixelFormat pixel_format) { const FormatTuple& GetFormatTuple(PixelFormat pixel_format) {
@ -178,10 +190,10 @@ GLint GetSwizzleSource(SwizzleSource source) {
GLenum GetComponent(PixelFormat format, bool is_first) { GLenum GetComponent(PixelFormat format, bool is_first) {
switch (format) { switch (format) {
case PixelFormat::Z24S8: case PixelFormat::D24_UNORM_S8_UINT:
case PixelFormat::Z32FS8: case PixelFormat::D32_FLOAT_S8_UINT:
return is_first ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX; return is_first ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX;
case PixelFormat::S8Z24: case PixelFormat::S8_UINT_D24_UNORM:
return is_first ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT; return is_first ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT;
default: default:
UNREACHABLE(); UNREACHABLE();
@ -482,9 +494,9 @@ GLuint CachedSurfaceView::GetTexture(SwizzleSource x_source, SwizzleSource y_sou
std::array swizzle{x_source, y_source, z_source, w_source}; std::array swizzle{x_source, y_source, z_source, w_source};
switch (const PixelFormat format = GetSurfaceParams().pixel_format) { switch (const PixelFormat format = GetSurfaceParams().pixel_format) {
case PixelFormat::Z24S8: case PixelFormat::D24_UNORM_S8_UINT:
case PixelFormat::Z32FS8: case PixelFormat::D32_FLOAT_S8_UINT:
case PixelFormat::S8Z24: case PixelFormat::S8_UINT_D24_UNORM:
UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G); UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G);
glTextureParameteri(view.handle, GL_DEPTH_STENCIL_TEXTURE_MODE, glTextureParameteri(view.handle, GL_DEPTH_STENCIL_TEXTURE_MODE,
GetComponent(format, x_source == SwizzleSource::R)); GetComponent(format, x_source == SwizzleSource::R));

View file

@ -535,12 +535,12 @@ void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
GLint internal_format; GLint internal_format;
switch (framebuffer.pixel_format) { switch (framebuffer.pixel_format) {
case Tegra::FramebufferConfig::PixelFormat::ABGR8: case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
internal_format = GL_RGBA8; internal_format = GL_RGBA8;
texture.gl_format = GL_RGBA; texture.gl_format = GL_RGBA;
texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
break; break;
case Tegra::FramebufferConfig::PixelFormat::RGB565: case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
internal_format = GL_RGB565; internal_format = GL_RGB565;
texture.gl_format = GL_RGB; texture.gl_format = GL_RGB;
texture.gl_type = GL_UNSIGNED_SHORT_5_6_5; texture.gl_type = GL_UNSIGNED_SHORT_5_6_5;

View file

@ -117,90 +117,101 @@ struct FormatTuple {
VkFormat format; ///< Vulkan format VkFormat format; ///< Vulkan format
int usage = 0; ///< Describes image format usage int usage = 0; ///< Describes image format usage
} constexpr tex_format_tuples[] = { } constexpr tex_format_tuples[] = {
{VK_FORMAT_A8B8G8R8_UNORM_PACK32, Attachable | Storage}, // ABGR8U {VK_FORMAT_A8B8G8R8_UNORM_PACK32, Attachable | Storage}, // A8B8G8R8_UNORM
{VK_FORMAT_A8B8G8R8_SNORM_PACK32, Attachable | Storage}, // ABGR8S {VK_FORMAT_A8B8G8R8_SNORM_PACK32, Attachable | Storage}, // A8B8G8R8_SNORM
{VK_FORMAT_A8B8G8R8_UINT_PACK32, Attachable | Storage}, // ABGR8UI {VK_FORMAT_A8B8G8R8_SINT_PACK32, Attachable | Storage}, // A8B8G8R8_SINT
{VK_FORMAT_B5G6R5_UNORM_PACK16}, // B5G6R5U {VK_FORMAT_A8B8G8R8_UINT_PACK32, Attachable | Storage}, // A8B8G8R8_UINT
{VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10U {VK_FORMAT_R5G6B5_UNORM_PACK16, Attachable}, // R5G6B5_UNORM
{VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5U (flipped with swizzle) {VK_FORMAT_B5G6R5_UNORM_PACK16, Attachable}, // B5G6R5_UNORM
{VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8U {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM
{VK_FORMAT_R8_UINT, Attachable | Storage}, // R8UI {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM
{VK_FORMAT_R16G16B16A16_SFLOAT, Attachable | Storage}, // RGBA16F {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT
{VK_FORMAT_R16G16B16A16_UNORM, Attachable | Storage}, // RGBA16U {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle)
{VK_FORMAT_R16G16B16A16_SNORM, Attachable | Storage}, // RGBA16S {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM
{VK_FORMAT_R16G16B16A16_UINT, Attachable | Storage}, // RGBA16UI {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM
{VK_FORMAT_B10G11R11_UFLOAT_PACK32, Attachable | Storage}, // R11FG11FB10F {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT
{VK_FORMAT_R32G32B32A32_UINT, Attachable | Storage}, // RGBA32UI {VK_FORMAT_R8_UINT, Attachable | Storage}, // R8_UINT
{VK_FORMAT_BC1_RGBA_UNORM_BLOCK}, // DXT1 {VK_FORMAT_R16G16B16A16_SFLOAT, Attachable | Storage}, // R16G16B16A16_FLOAT
{VK_FORMAT_BC2_UNORM_BLOCK}, // DXT23 {VK_FORMAT_R16G16B16A16_UNORM, Attachable | Storage}, // R16G16B16A16_UNORM
{VK_FORMAT_BC3_UNORM_BLOCK}, // DXT45 {VK_FORMAT_R16G16B16A16_SNORM, Attachable | Storage}, // R16G16B16A16_SNORM
{VK_FORMAT_BC4_UNORM_BLOCK}, // DXN1 {VK_FORMAT_R16G16B16A16_SINT, Attachable | Storage}, // R16G16B16A16_SINT
{VK_FORMAT_BC5_UNORM_BLOCK}, // DXN2UNORM {VK_FORMAT_R16G16B16A16_UINT, Attachable | Storage}, // R16G16B16A16_UINT
{VK_FORMAT_BC5_SNORM_BLOCK}, // DXN2SNORM {VK_FORMAT_B10G11R11_UFLOAT_PACK32, Attachable | Storage}, // B10G11R11_FLOAT
{VK_FORMAT_BC7_UNORM_BLOCK}, // BC7U {VK_FORMAT_R32G32B32A32_UINT, Attachable | Storage}, // R32G32B32A32_UINT
{VK_FORMAT_BC6H_UFLOAT_BLOCK}, // BC6H_UF16 {VK_FORMAT_BC1_RGBA_UNORM_BLOCK}, // BC1_RGBA_UNORM
{VK_FORMAT_BC6H_SFLOAT_BLOCK}, // BC6H_SF16 {VK_FORMAT_BC2_UNORM_BLOCK}, // BC2_UNORM
{VK_FORMAT_ASTC_4x4_UNORM_BLOCK}, // ASTC_2D_4X4 {VK_FORMAT_BC3_UNORM_BLOCK}, // BC3_UNORM
{VK_FORMAT_B8G8R8A8_UNORM, Attachable}, // BGRA8 {VK_FORMAT_BC4_UNORM_BLOCK}, // BC4_UNORM
{VK_FORMAT_R32G32B32A32_SFLOAT, Attachable | Storage}, // RGBA32F {VK_FORMAT_BC4_SNORM_BLOCK}, // BC4_SNORM
{VK_FORMAT_R32G32_SFLOAT, Attachable | Storage}, // RG32F {VK_FORMAT_BC5_UNORM_BLOCK}, // BC5_UNORM
{VK_FORMAT_R32_SFLOAT, Attachable | Storage}, // R32F {VK_FORMAT_BC5_SNORM_BLOCK}, // BC5_SNORM
{VK_FORMAT_R16_SFLOAT, Attachable | Storage}, // R16F {VK_FORMAT_BC7_UNORM_BLOCK}, // BC7_UNORM
{VK_FORMAT_R16_UNORM, Attachable | Storage}, // R16U {VK_FORMAT_BC6H_UFLOAT_BLOCK}, // BC6H_UFLOAT
{VK_FORMAT_UNDEFINED}, // R16S {VK_FORMAT_BC6H_SFLOAT_BLOCK}, // BC6H_SFLOAT
{VK_FORMAT_R16_UINT, Attachable | Storage}, // R16UI {VK_FORMAT_ASTC_4x4_UNORM_BLOCK}, // ASTC_2D_4X4_UNORM
{VK_FORMAT_UNDEFINED}, // R16I {VK_FORMAT_B8G8R8A8_UNORM, Attachable}, // B8G8R8A8_UNORM
{VK_FORMAT_R16G16_UNORM, Attachable | Storage}, // RG16 {VK_FORMAT_R32G32B32A32_SFLOAT, Attachable | Storage}, // R32G32B32A32_FLOAT
{VK_FORMAT_R16G16_SFLOAT, Attachable | Storage}, // RG16F {VK_FORMAT_R32G32B32A32_SINT, Attachable | Storage}, // R32G32B32A32_SINT
{VK_FORMAT_UNDEFINED}, // RG16UI {VK_FORMAT_R32G32_SFLOAT, Attachable | Storage}, // R32G32_FLOAT
{VK_FORMAT_UNDEFINED}, // RG16I {VK_FORMAT_R32G32_SINT, Attachable | Storage}, // R32G32_SINT
{VK_FORMAT_R16G16_SNORM, Attachable | Storage}, // RG16S {VK_FORMAT_R32_SFLOAT, Attachable | Storage}, // R32_FLOAT
{VK_FORMAT_UNDEFINED}, // RGB32F {VK_FORMAT_R16_SFLOAT, Attachable | Storage}, // R16_FLOAT
{VK_FORMAT_R8G8B8A8_SRGB, Attachable}, // RGBA8_SRGB {VK_FORMAT_R16_UNORM, Attachable | Storage}, // R16_UNORM
{VK_FORMAT_R8G8_UNORM, Attachable | Storage}, // RG8U {VK_FORMAT_UNDEFINED}, // R16_SNORM
{VK_FORMAT_R8G8_SNORM, Attachable | Storage}, // RG8S {VK_FORMAT_R16_UINT, Attachable | Storage}, // R16_UINT
{VK_FORMAT_R8G8_UINT, Attachable | Storage}, // RG8UI {VK_FORMAT_UNDEFINED}, // R16_SINT
{VK_FORMAT_R32G32_UINT, Attachable | Storage}, // RG32UI {VK_FORMAT_R16G16_UNORM, Attachable | Storage}, // R16G16_UNORM
{VK_FORMAT_UNDEFINED}, // RGBX16F {VK_FORMAT_R16G16_SFLOAT, Attachable | Storage}, // R16G16_FLOAT
{VK_FORMAT_R32_UINT, Attachable | Storage}, // R32UI {VK_FORMAT_UNDEFINED}, // R16G16_UINT
{VK_FORMAT_R32_SINT, Attachable | Storage}, // R32I {VK_FORMAT_UNDEFINED}, // R16G16_SINT
{VK_FORMAT_ASTC_8x8_UNORM_BLOCK}, // ASTC_2D_8X8 {VK_FORMAT_R16G16_SNORM, Attachable | Storage}, // R16G16_SNORM
{VK_FORMAT_UNDEFINED}, // ASTC_2D_8X5 {VK_FORMAT_UNDEFINED}, // R32G32B32_FLOAT
{VK_FORMAT_UNDEFINED}, // ASTC_2D_5X4 {VK_FORMAT_R8G8B8A8_SRGB, Attachable}, // A8B8G8R8_SRGB
{VK_FORMAT_B8G8R8A8_SRGB, Attachable}, // BGRA8_SRGB {VK_FORMAT_R8G8_UNORM, Attachable | Storage}, // R8G8_UNORM
{VK_FORMAT_BC1_RGBA_SRGB_BLOCK}, // DXT1_SRGB {VK_FORMAT_R8G8_SNORM, Attachable | Storage}, // R8G8_SNORM
{VK_FORMAT_BC2_SRGB_BLOCK}, // DXT23_SRGB {VK_FORMAT_R8G8_SINT, Attachable | Storage}, // R8G8_SINT
{VK_FORMAT_BC3_SRGB_BLOCK}, // DXT45_SRGB {VK_FORMAT_R8G8_UINT, Attachable | Storage}, // R8G8_UINT
{VK_FORMAT_BC7_SRGB_BLOCK}, // BC7U_SRGB {VK_FORMAT_R32G32_UINT, Attachable | Storage}, // R32G32_UINT
{VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // R4G4B4A4U {VK_FORMAT_UNDEFINED}, // R16G16B16X16_FLOAT
{VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB {VK_FORMAT_R32_UINT, Attachable | Storage}, // R32_UINT
{VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB {VK_FORMAT_R32_SINT, Attachable | Storage}, // R32_SINT
{VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB {VK_FORMAT_ASTC_8x8_UNORM_BLOCK}, // ASTC_2D_8X8_UNORM
{VK_FORMAT_ASTC_5x4_SRGB_BLOCK}, // ASTC_2D_5X4_SRGB {VK_FORMAT_UNDEFINED}, // ASTC_2D_8X5_UNORM
{VK_FORMAT_ASTC_5x5_UNORM_BLOCK}, // ASTC_2D_5X5 {VK_FORMAT_UNDEFINED}, // ASTC_2D_5X4_UNORM
{VK_FORMAT_ASTC_5x5_SRGB_BLOCK}, // ASTC_2D_5X5_SRGB {VK_FORMAT_B8G8R8A8_SRGB, Attachable}, // B8G8R8A8_SRGB
{VK_FORMAT_ASTC_10x8_UNORM_BLOCK}, // ASTC_2D_10X8 {VK_FORMAT_BC1_RGBA_SRGB_BLOCK}, // BC1_RGBA_SRGB
{VK_FORMAT_ASTC_10x8_SRGB_BLOCK}, // ASTC_2D_10X8_SRGB {VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB
{VK_FORMAT_ASTC_6x6_UNORM_BLOCK}, // ASTC_2D_6X6 {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB
{VK_FORMAT_ASTC_6x6_SRGB_BLOCK}, // ASTC_2D_6X6_SRGB {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB
{VK_FORMAT_ASTC_10x10_UNORM_BLOCK}, // ASTC_2D_10X10 {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM
{VK_FORMAT_ASTC_10x10_SRGB_BLOCK}, // ASTC_2D_10X10_SRGB {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB
{VK_FORMAT_ASTC_12x12_UNORM_BLOCK}, // ASTC_2D_12X12 {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB
{VK_FORMAT_ASTC_12x12_SRGB_BLOCK}, // ASTC_2D_12X12_SRGB {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB
{VK_FORMAT_ASTC_8x6_UNORM_BLOCK}, // ASTC_2D_8X6 {VK_FORMAT_ASTC_5x4_SRGB_BLOCK}, // ASTC_2D_5X4_SRGB
{VK_FORMAT_ASTC_8x6_SRGB_BLOCK}, // ASTC_2D_8X6_SRGB {VK_FORMAT_ASTC_5x5_UNORM_BLOCK}, // ASTC_2D_5X5_UNORM
{VK_FORMAT_ASTC_6x5_UNORM_BLOCK}, // ASTC_2D_6X5 {VK_FORMAT_ASTC_5x5_SRGB_BLOCK}, // ASTC_2D_5X5_SRGB
{VK_FORMAT_ASTC_6x5_SRGB_BLOCK}, // ASTC_2D_6X5_SRGB {VK_FORMAT_ASTC_10x8_UNORM_BLOCK}, // ASTC_2D_10X8_UNORM
{VK_FORMAT_E5B9G9R9_UFLOAT_PACK32}, // E5B9G9R9F {VK_FORMAT_ASTC_10x8_SRGB_BLOCK}, // ASTC_2D_10X8_SRGB
{VK_FORMAT_ASTC_6x6_UNORM_BLOCK}, // ASTC_2D_6X6_UNORM
{VK_FORMAT_ASTC_6x6_SRGB_BLOCK}, // ASTC_2D_6X6_SRGB
{VK_FORMAT_ASTC_10x10_UNORM_BLOCK}, // ASTC_2D_10X10_UNORM
{VK_FORMAT_ASTC_10x10_SRGB_BLOCK}, // ASTC_2D_10X10_SRGB
{VK_FORMAT_ASTC_12x12_UNORM_BLOCK}, // ASTC_2D_12X12_UNORM
{VK_FORMAT_ASTC_12x12_SRGB_BLOCK}, // ASTC_2D_12X12_SRGB
{VK_FORMAT_ASTC_8x6_UNORM_BLOCK}, // ASTC_2D_8X6_UNORM
{VK_FORMAT_ASTC_8x6_SRGB_BLOCK}, // ASTC_2D_8X6_SRGB
{VK_FORMAT_ASTC_6x5_UNORM_BLOCK}, // ASTC_2D_6X5_UNORM
{VK_FORMAT_ASTC_6x5_SRGB_BLOCK}, // ASTC_2D_6X5_SRGB
{VK_FORMAT_E5B9G9R9_UFLOAT_PACK32}, // E5B9G9R9_FLOAT
// Depth formats // Depth formats
{VK_FORMAT_D32_SFLOAT, Attachable}, // Z32F {VK_FORMAT_D32_SFLOAT, Attachable}, // D32_FLOAT
{VK_FORMAT_D16_UNORM, Attachable}, // Z16 {VK_FORMAT_D16_UNORM, Attachable}, // D16_UNORM
// DepthStencil formats // DepthStencil formats
{VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // Z24S8 {VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // D24_UNORM_S8_UINT
{VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // S8Z24 (emulated) {VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // S8_UINT_D24_UNORM (emulated)
{VK_FORMAT_D32_SFLOAT_S8_UINT, Attachable}, // Z32FS8 {VK_FORMAT_D32_SFLOAT_S8_UINT, Attachable}, // D32_FLOAT_S8_UINT
}; };
static_assert(std::size(tex_format_tuples) == VideoCore::Surface::MaxPixelFormat); static_assert(std::size(tex_format_tuples) == VideoCore::Surface::MaxPixelFormat);
@ -221,7 +232,7 @@ FormatInfo SurfaceFormat(const VKDevice& device, FormatType format_type, PixelFo
return {VK_FORMAT_A8B8G8R8_UNORM_PACK32, true, true}; return {VK_FORMAT_A8B8G8R8_UNORM_PACK32, true, true};
} }
// Use ABGR8 on hardware that doesn't support ASTC natively // Use A8B8G8R8_UNORM on hardware that doesn't support ASTC natively
if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) { if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) {
tuple.format = VideoCore::Surface::IsPixelFormatSRGB(pixel_format) tuple.format = VideoCore::Surface::IsPixelFormatSRGB(pixel_format)
? VK_FORMAT_A8B8G8R8_SRGB_PACK32 ? VK_FORMAT_A8B8G8R8_SRGB_PACK32

View file

@ -187,9 +187,9 @@ std::size_t GetSizeInBytes(const Tegra::FramebufferConfig& framebuffer) {
VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) { VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) {
switch (framebuffer.pixel_format) { switch (framebuffer.pixel_format) {
case Tegra::FramebufferConfig::PixelFormat::ABGR8: case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
return VK_FORMAT_A8B8G8R8_UNORM_PACK32; return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
case Tegra::FramebufferConfig::PixelFormat::RGB565: case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
return VK_FORMAT_R5G6B5_UNORM_PACK16; return VK_FORMAT_R5G6B5_UNORM_PACK16;
default: default:
UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}", UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}",

View file

@ -84,14 +84,19 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(
VK_FORMAT_A8B8G8R8_UNORM_PACK32, VK_FORMAT_A8B8G8R8_UNORM_PACK32,
VK_FORMAT_A8B8G8R8_UINT_PACK32, VK_FORMAT_A8B8G8R8_UINT_PACK32,
VK_FORMAT_A8B8G8R8_SNORM_PACK32, VK_FORMAT_A8B8G8R8_SNORM_PACK32,
VK_FORMAT_A8B8G8R8_SINT_PACK32,
VK_FORMAT_A8B8G8R8_SRGB_PACK32, VK_FORMAT_A8B8G8R8_SRGB_PACK32,
VK_FORMAT_B5G6R5_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16,
VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32,
VK_FORMAT_A2B10G10R10_UINT_PACK32,
VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_A1R5G5B5_UNORM_PACK16,
VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
VK_FORMAT_R32G32B32A32_SINT,
VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_R32G32B32A32_UINT,
VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
VK_FORMAT_R32G32_SINT,
VK_FORMAT_R32G32_UINT, VK_FORMAT_R32G32_UINT,
VK_FORMAT_R16G16B16A16_SINT,
VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT,
VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_SNORM,
VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_UNORM,
@ -103,8 +108,11 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(
VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_R8G8B8A8_SRGB,
VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8G8_UNORM,
VK_FORMAT_R8G8_SNORM, VK_FORMAT_R8G8_SNORM,
VK_FORMAT_R8G8_SINT,
VK_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_UINT,
VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM,
VK_FORMAT_R8_SNORM,
VK_FORMAT_R8_SINT,
VK_FORMAT_R8_UINT, VK_FORMAT_R8_UINT,
VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10G11R11_UFLOAT_PACK32,
VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT,
@ -124,6 +132,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(
VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_BC2_UNORM_BLOCK,
VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_BC3_UNORM_BLOCK,
VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_BC4_UNORM_BLOCK,
VK_FORMAT_BC4_SNORM_BLOCK,
VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_BC5_UNORM_BLOCK,
VK_FORMAT_BC5_SNORM_BLOCK, VK_FORMAT_BC5_SNORM_BLOCK,
VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_BC7_UNORM_BLOCK,

View file

@ -235,7 +235,7 @@ void CachedSurface::UploadTexture(const std::vector<u8>& staging_buffer) {
void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) { void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) {
UNIMPLEMENTED_IF(params.IsBuffer()); UNIMPLEMENTED_IF(params.IsBuffer());
if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5U) { if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5_UNORM) {
LOG_WARNING(Render_Vulkan, "A1B5G5R5 flushing is stubbed"); LOG_WARNING(Render_Vulkan, "A1B5G5R5 flushing is stubbed");
} }
@ -385,7 +385,7 @@ VkImageView CachedSurfaceView::GetImageView(SwizzleSource x_source, SwizzleSourc
std::array swizzle{MaxwellToVK::SwizzleSource(x_source), MaxwellToVK::SwizzleSource(y_source), std::array swizzle{MaxwellToVK::SwizzleSource(x_source), MaxwellToVK::SwizzleSource(y_source),
MaxwellToVK::SwizzleSource(z_source), MaxwellToVK::SwizzleSource(w_source)}; MaxwellToVK::SwizzleSource(z_source), MaxwellToVK::SwizzleSource(w_source)};
if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5U) { if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5_UNORM) {
// A1B5G5R5 is implemented as A1R5G5B5, we have to change the swizzle here. // A1B5G5R5 is implemented as A1R5G5B5, we have to change the swizzle here.
std::swap(swizzle[0], swizzle[2]); std::swap(swizzle[0], swizzle[2]);
} }
@ -397,11 +397,11 @@ VkImageView CachedSurfaceView::GetImageView(SwizzleSource x_source, SwizzleSourc
UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G); UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G);
const bool is_first = x_source == SwizzleSource::R; const bool is_first = x_source == SwizzleSource::R;
switch (params.pixel_format) { switch (params.pixel_format) {
case VideoCore::Surface::PixelFormat::Z24S8: case VideoCore::Surface::PixelFormat::D24_UNORM_S8_UINT:
case VideoCore::Surface::PixelFormat::Z32FS8: case VideoCore::Surface::PixelFormat::D32_FLOAT_S8_UINT:
aspect = is_first ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT; aspect = is_first ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT;
break; break;
case VideoCore::Surface::PixelFormat::S8Z24: case VideoCore::Surface::PixelFormat::S8_UINT_D24_UNORM:
aspect = is_first ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT; aspect = is_first ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT;
break; break;
default: default:

View file

@ -31,11 +31,11 @@ ComponentType GetComponentType(Tegra::Engines::SamplerDescriptor descriptor,
std::size_t component) { std::size_t component) {
const TextureFormat format{descriptor.format}; const TextureFormat format{descriptor.format};
switch (format) { switch (format) {
case TextureFormat::R16_G16_B16_A16: case TextureFormat::R16G16B16A16:
case TextureFormat::R32_G32_B32_A32: case TextureFormat::R32G32B32A32:
case TextureFormat::R32_G32_B32: case TextureFormat::R32G32B32:
case TextureFormat::R32_G32: case TextureFormat::R32G32:
case TextureFormat::R16_G16: case TextureFormat::R16G16:
case TextureFormat::R32: case TextureFormat::R32:
case TextureFormat::R16: case TextureFormat::R16:
case TextureFormat::R8: case TextureFormat::R8:
@ -97,7 +97,7 @@ ComponentType GetComponentType(Tegra::Engines::SamplerDescriptor descriptor,
break; break;
case TextureFormat::B5G6R5: case TextureFormat::B5G6R5:
case TextureFormat::B6G5R5: case TextureFormat::B6G5R5:
case TextureFormat::BF10GF11RF11: case TextureFormat::B10G11R11:
if (component == 0) { if (component == 0) {
return descriptor.b_type; return descriptor.b_type;
} }
@ -108,9 +108,9 @@ ComponentType GetComponentType(Tegra::Engines::SamplerDescriptor descriptor,
return descriptor.r_type; return descriptor.r_type;
} }
break; break;
case TextureFormat::G8R24: case TextureFormat::R24G8:
case TextureFormat::G24R8: case TextureFormat::R8G24:
case TextureFormat::G8R8: case TextureFormat::R8G8:
case TextureFormat::G4R4: case TextureFormat::G4R4:
if (component == 0) { if (component == 0) {
return descriptor.g_type; return descriptor.g_type;
@ -137,15 +137,15 @@ bool IsComponentEnabled(std::size_t component_mask, std::size_t component) {
u32 GetComponentSize(TextureFormat format, std::size_t component) { u32 GetComponentSize(TextureFormat format, std::size_t component) {
switch (format) { switch (format) {
case TextureFormat::R32_G32_B32_A32: case TextureFormat::R32G32B32A32:
return 32; return 32;
case TextureFormat::R16_G16_B16_A16: case TextureFormat::R16G16B16A16:
return 16; return 16;
case TextureFormat::R32_G32_B32: case TextureFormat::R32G32B32:
return component <= 2 ? 32 : 0; return component <= 2 ? 32 : 0;
case TextureFormat::R32_G32: case TextureFormat::R32G32:
return component <= 1 ? 32 : 0; return component <= 1 ? 32 : 0;
case TextureFormat::R16_G16: case TextureFormat::R16G16:
return component <= 1 ? 16 : 0; return component <= 1 ? 16 : 0;
case TextureFormat::R32: case TextureFormat::R32:
return component == 0 ? 32 : 0; return component == 0 ? 32 : 0;
@ -192,7 +192,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
return 6; return 6;
} }
return 0; return 0;
case TextureFormat::BF10GF11RF11: case TextureFormat::B10G11R11:
if (component == 1 || component == 2) { if (component == 1 || component == 2) {
return 11; return 11;
} }
@ -200,7 +200,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
return 10; return 10;
} }
return 0; return 0;
case TextureFormat::G8R24: case TextureFormat::R24G8:
if (component == 0) { if (component == 0) {
return 8; return 8;
} }
@ -208,7 +208,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
return 24; return 24;
} }
return 0; return 0;
case TextureFormat::G24R8: case TextureFormat::R8G24:
if (component == 0) { if (component == 0) {
return 8; return 8;
} }
@ -216,7 +216,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
return 24; return 24;
} }
return 0; return 0;
case TextureFormat::G8R8: case TextureFormat::R8G8:
return (component == 0 || component == 1) ? 8 : 0; return (component == 0 || component == 1) ? 8 : 0;
case TextureFormat::G4R4: case TextureFormat::G4R4:
return (component == 0 || component == 1) ? 4 : 0; return (component == 0 || component == 1) ? 4 : 0;
@ -231,25 +231,25 @@ std::size_t GetImageComponentMask(TextureFormat format) {
constexpr u8 B = 0b0100; constexpr u8 B = 0b0100;
constexpr u8 A = 0b1000; constexpr u8 A = 0b1000;
switch (format) { switch (format) {
case TextureFormat::R32_G32_B32_A32: case TextureFormat::R32G32B32A32:
case TextureFormat::R16_G16_B16_A16: case TextureFormat::R16G16B16A16:
case TextureFormat::A8R8G8B8: case TextureFormat::A8R8G8B8:
case TextureFormat::A2B10G10R10: case TextureFormat::A2B10G10R10:
case TextureFormat::A4B4G4R4: case TextureFormat::A4B4G4R4:
case TextureFormat::A5B5G5R1: case TextureFormat::A5B5G5R1:
case TextureFormat::A1B5G5R5: case TextureFormat::A1B5G5R5:
return std::size_t{R | G | B | A}; return std::size_t{R | G | B | A};
case TextureFormat::R32_G32_B32: case TextureFormat::R32G32B32:
case TextureFormat::R32_B24G8: case TextureFormat::R32_B24G8:
case TextureFormat::B5G6R5: case TextureFormat::B5G6R5:
case TextureFormat::B6G5R5: case TextureFormat::B6G5R5:
case TextureFormat::BF10GF11RF11: case TextureFormat::B10G11R11:
return std::size_t{R | G | B}; return std::size_t{R | G | B};
case TextureFormat::R32_G32: case TextureFormat::R32G32:
case TextureFormat::R16_G16: case TextureFormat::R16G16:
case TextureFormat::G8R24: case TextureFormat::R24G8:
case TextureFormat::G24R8: case TextureFormat::R8G24:
case TextureFormat::G8R8: case TextureFormat::R8G8:
case TextureFormat::G4R4: case TextureFormat::G4R4:
return std::size_t{R | G}; return std::size_t{R | G};
case TextureFormat::R32: case TextureFormat::R32:

View file

@ -74,117 +74,131 @@ bool SurfaceTargetIsArray(SurfaceTarget target) {
PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) { PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
switch (format) { switch (format) {
case Tegra::DepthFormat::S8_Z24_UNORM: case Tegra::DepthFormat::S8_UINT_Z24_UNORM:
return PixelFormat::S8Z24; return PixelFormat::S8_UINT_D24_UNORM;
case Tegra::DepthFormat::Z24_S8_UNORM: case Tegra::DepthFormat::D24S8_UNORM:
return PixelFormat::Z24S8; return PixelFormat::D24_UNORM_S8_UINT;
case Tegra::DepthFormat::Z32_FLOAT: case Tegra::DepthFormat::D32_FLOAT:
return PixelFormat::Z32F; return PixelFormat::D32_FLOAT;
case Tegra::DepthFormat::Z16_UNORM: case Tegra::DepthFormat::D16_UNORM:
return PixelFormat::Z16; return PixelFormat::D16_UNORM;
case Tegra::DepthFormat::Z32_S8_X24_FLOAT: case Tegra::DepthFormat::D32_FLOAT_S8X24_UINT:
return PixelFormat::Z32FS8; return PixelFormat::D32_FLOAT_S8_UINT;
default: default:
LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<u32>(format));
UNREACHABLE(); return PixelFormat::S8_UINT_D24_UNORM;
return PixelFormat::S8Z24;
} }
} }
PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) { PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) {
switch (format) { switch (format) {
case Tegra::RenderTargetFormat::RGBA8_SRGB: case Tegra::RenderTargetFormat::R32B32G32A32_FLOAT:
return PixelFormat::RGBA8_SRGB; return PixelFormat::R32G32B32A32_FLOAT;
case Tegra::RenderTargetFormat::RGBA8_UNORM: case Tegra::RenderTargetFormat::R32G32B32A32_SINT:
return PixelFormat::ABGR8U; return PixelFormat::R32G32B32A32_SINT;
case Tegra::RenderTargetFormat::RGBA8_SNORM: case Tegra::RenderTargetFormat::R32G32B32A32_UINT:
return PixelFormat::ABGR8S; return PixelFormat::R32G32B32A32_UINT;
case Tegra::RenderTargetFormat::RGBA8_UINT: case Tegra::RenderTargetFormat::R16G16B16A16_UNORM:
return PixelFormat::ABGR8UI; return PixelFormat::R16G16B16A16_UNORM;
case Tegra::RenderTargetFormat::BGRA8_SRGB: case Tegra::RenderTargetFormat::R16G16B16A16_SNORM:
return PixelFormat::BGRA8_SRGB; return PixelFormat::R16G16B16A16_SNORM;
case Tegra::RenderTargetFormat::BGRA8_UNORM: case Tegra::RenderTargetFormat::R16G16B16A16_SINT:
return PixelFormat::BGRA8; return PixelFormat::R16G16B16A16_SINT;
case Tegra::RenderTargetFormat::RGB10_A2_UNORM: case Tegra::RenderTargetFormat::R16G16B16A16_UINT:
return PixelFormat::A2B10G10R10U; return PixelFormat::R16G16B16A16_UINT;
case Tegra::RenderTargetFormat::RGBA16_FLOAT: case Tegra::RenderTargetFormat::R16G16B16A16_FLOAT:
return PixelFormat::RGBA16F; return PixelFormat::R16G16B16A16_FLOAT;
case Tegra::RenderTargetFormat::RGBA16_UNORM: case Tegra::RenderTargetFormat::R32G32_FLOAT:
return PixelFormat::RGBA16U; return PixelFormat::R32G32_FLOAT;
case Tegra::RenderTargetFormat::RGBA16_SNORM: case Tegra::RenderTargetFormat::R32G32_SINT:
return PixelFormat::RGBA16S; return PixelFormat::R32G32_SINT;
case Tegra::RenderTargetFormat::RGBA16_UINT: case Tegra::RenderTargetFormat::R32G32_UINT:
return PixelFormat::RGBA16UI; return PixelFormat::R32G32_UINT;
case Tegra::RenderTargetFormat::RGBA32_FLOAT: case Tegra::RenderTargetFormat::R16G16B16X16_FLOAT:
return PixelFormat::RGBA32F; return PixelFormat::R16G16B16X16_FLOAT;
case Tegra::RenderTargetFormat::RG32_FLOAT: case Tegra::RenderTargetFormat::B8G8R8A8_UNORM:
return PixelFormat::RG32F; return PixelFormat::B8G8R8A8_UNORM;
case Tegra::RenderTargetFormat::R11G11B10_FLOAT: case Tegra::RenderTargetFormat::B8G8R8A8_SRGB:
return PixelFormat::R11FG11FB10F; return PixelFormat::B8G8R8A8_SRGB;
case Tegra::RenderTargetFormat::B5G6R5_UNORM: case Tegra::RenderTargetFormat::A2B10G10R10_UNORM:
return PixelFormat::B5G6R5U; return PixelFormat::A2B10G10R10_UNORM;
case Tegra::RenderTargetFormat::BGR5A1_UNORM: case Tegra::RenderTargetFormat::A2B10G10R10_UINT:
return PixelFormat::A1B5G5R5U; return PixelFormat::A2B10G10R10_UINT;
case Tegra::RenderTargetFormat::RGBA32_UINT: case Tegra::RenderTargetFormat::A8B8G8R8_UNORM:
return PixelFormat::RGBA32UI; return PixelFormat::A8B8G8R8_UNORM;
case Tegra::RenderTargetFormat::R8_UNORM: case Tegra::RenderTargetFormat::A8B8G8R8_SRGB:
return PixelFormat::R8U; return PixelFormat::A8B8G8R8_SRGB;
case Tegra::RenderTargetFormat::R8_UINT: case Tegra::RenderTargetFormat::A8B8G8R8_SNORM:
return PixelFormat::R8UI; return PixelFormat::A8B8G8R8_SNORM;
case Tegra::RenderTargetFormat::RG16_FLOAT: case Tegra::RenderTargetFormat::A8B8G8R8_SINT:
return PixelFormat::RG16F; return PixelFormat::A8B8G8R8_SINT;
case Tegra::RenderTargetFormat::RG16_UINT: case Tegra::RenderTargetFormat::A8B8G8R8_UINT:
return PixelFormat::RG16UI; return PixelFormat::A8B8G8R8_UINT;
case Tegra::RenderTargetFormat::RG16_SINT: case Tegra::RenderTargetFormat::R16G16_UNORM:
return PixelFormat::RG16I; return PixelFormat::R16G16_UNORM;
case Tegra::RenderTargetFormat::RG16_UNORM: case Tegra::RenderTargetFormat::R16G16_SNORM:
return PixelFormat::RG16; return PixelFormat::R16G16_SNORM;
case Tegra::RenderTargetFormat::RG16_SNORM: case Tegra::RenderTargetFormat::R16G16_SINT:
return PixelFormat::RG16S; return PixelFormat::R16G16_SINT;
case Tegra::RenderTargetFormat::RG8_UNORM: case Tegra::RenderTargetFormat::R16G16_UINT:
return PixelFormat::RG8U; return PixelFormat::R16G16_UINT;
case Tegra::RenderTargetFormat::RG8_SNORM: case Tegra::RenderTargetFormat::R16G16_FLOAT:
return PixelFormat::RG8S; return PixelFormat::R16G16_FLOAT;
case Tegra::RenderTargetFormat::RG8_UINT: case Tegra::RenderTargetFormat::B10G11R11_FLOAT:
return PixelFormat::RG8UI; return PixelFormat::B10G11R11_FLOAT;
case Tegra::RenderTargetFormat::R16_FLOAT:
return PixelFormat::R16F;
case Tegra::RenderTargetFormat::R16_UNORM:
return PixelFormat::R16U;
case Tegra::RenderTargetFormat::R16_SNORM:
return PixelFormat::R16S;
case Tegra::RenderTargetFormat::R16_UINT:
return PixelFormat::R16UI;
case Tegra::RenderTargetFormat::R16_SINT:
return PixelFormat::R16I;
case Tegra::RenderTargetFormat::R32_FLOAT:
return PixelFormat::R32F;
case Tegra::RenderTargetFormat::R32_SINT: case Tegra::RenderTargetFormat::R32_SINT:
return PixelFormat::R32I; return PixelFormat::R32_SINT;
case Tegra::RenderTargetFormat::R32_UINT: case Tegra::RenderTargetFormat::R32_UINT:
return PixelFormat::R32UI; return PixelFormat::R32_UINT;
case Tegra::RenderTargetFormat::RG32_UINT: case Tegra::RenderTargetFormat::R32_FLOAT:
return PixelFormat::RG32UI; return PixelFormat::R32_FLOAT;
case Tegra::RenderTargetFormat::RGBX16_FLOAT: case Tegra::RenderTargetFormat::R5G6B5_UNORM:
return PixelFormat::RGBX16F; return PixelFormat::R5G6B5_UNORM;
case Tegra::RenderTargetFormat::A1R5G5B5_UNORM:
return PixelFormat::A1R5G5B5_UNORM;
case Tegra::RenderTargetFormat::R8G8_UNORM:
return PixelFormat::R8G8_UNORM;
case Tegra::RenderTargetFormat::R8G8_SNORM:
return PixelFormat::R8G8_SNORM;
case Tegra::RenderTargetFormat::R8G8_SINT:
return PixelFormat::R8G8_SINT;
case Tegra::RenderTargetFormat::R8G8_UINT:
return PixelFormat::R8G8_UINT;
case Tegra::RenderTargetFormat::R16_UNORM:
return PixelFormat::R16_UNORM;
case Tegra::RenderTargetFormat::R16_SNORM:
return PixelFormat::R16_SNORM;
case Tegra::RenderTargetFormat::R16_SINT:
return PixelFormat::R16_SINT;
case Tegra::RenderTargetFormat::R16_UINT:
return PixelFormat::R16_UINT;
case Tegra::RenderTargetFormat::R16_FLOAT:
return PixelFormat::R16_FLOAT;
case Tegra::RenderTargetFormat::R8_UNORM:
return PixelFormat::R8_UNORM;
case Tegra::RenderTargetFormat::R8_SNORM:
return PixelFormat::R8_SNORM;
case Tegra::RenderTargetFormat::R8_SINT:
return PixelFormat::R8_SINT;
case Tegra::RenderTargetFormat::R8_UINT:
return PixelFormat::R8_UINT;
default: default:
LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<int>(format));
UNREACHABLE(); return PixelFormat::A8B8G8R8_UNORM;
return PixelFormat::RGBA8_SRGB;
} }
} }
PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format) { PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format) {
switch (format) { switch (format) {
case Tegra::FramebufferConfig::PixelFormat::ABGR8: case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
return PixelFormat::ABGR8U; return PixelFormat::A8B8G8R8_UNORM;
case Tegra::FramebufferConfig::PixelFormat::RGB565: case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
return PixelFormat::B5G6R5U; return PixelFormat::R5G6B5_UNORM;
case Tegra::FramebufferConfig::PixelFormat::BGRA8: case Tegra::FramebufferConfig::PixelFormat::B8G8R8A8_UNORM:
return PixelFormat::BGRA8; return PixelFormat::B8G8R8A8_UNORM;
default: default:
UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<u32>(format)); UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<u32>(format));
return PixelFormat::ABGR8U; return PixelFormat::A8B8G8R8_UNORM;
} }
} }
@ -212,27 +226,27 @@ SurfaceType GetFormatType(PixelFormat pixel_format) {
bool IsPixelFormatASTC(PixelFormat format) { bool IsPixelFormatASTC(PixelFormat format) {
switch (format) { switch (format) {
case PixelFormat::ASTC_2D_4X4: case PixelFormat::ASTC_2D_4X4_UNORM:
case PixelFormat::ASTC_2D_5X4: case PixelFormat::ASTC_2D_5X4_UNORM:
case PixelFormat::ASTC_2D_5X5: case PixelFormat::ASTC_2D_5X5_UNORM:
case PixelFormat::ASTC_2D_8X8: case PixelFormat::ASTC_2D_8X8_UNORM:
case PixelFormat::ASTC_2D_8X5: case PixelFormat::ASTC_2D_8X5_UNORM:
case PixelFormat::ASTC_2D_4X4_SRGB: case PixelFormat::ASTC_2D_4X4_SRGB:
case PixelFormat::ASTC_2D_5X4_SRGB: case PixelFormat::ASTC_2D_5X4_SRGB:
case PixelFormat::ASTC_2D_5X5_SRGB: case PixelFormat::ASTC_2D_5X5_SRGB:
case PixelFormat::ASTC_2D_8X8_SRGB: case PixelFormat::ASTC_2D_8X8_SRGB:
case PixelFormat::ASTC_2D_8X5_SRGB: case PixelFormat::ASTC_2D_8X5_SRGB:
case PixelFormat::ASTC_2D_10X8: case PixelFormat::ASTC_2D_10X8_UNORM:
case PixelFormat::ASTC_2D_10X8_SRGB: case PixelFormat::ASTC_2D_10X8_SRGB:
case PixelFormat::ASTC_2D_6X6: case PixelFormat::ASTC_2D_6X6_UNORM:
case PixelFormat::ASTC_2D_6X6_SRGB: case PixelFormat::ASTC_2D_6X6_SRGB:
case PixelFormat::ASTC_2D_10X10: case PixelFormat::ASTC_2D_10X10_UNORM:
case PixelFormat::ASTC_2D_10X10_SRGB: case PixelFormat::ASTC_2D_10X10_SRGB:
case PixelFormat::ASTC_2D_12X12: case PixelFormat::ASTC_2D_12X12_UNORM:
case PixelFormat::ASTC_2D_12X12_SRGB: case PixelFormat::ASTC_2D_12X12_SRGB:
case PixelFormat::ASTC_2D_8X6: case PixelFormat::ASTC_2D_8X6_UNORM:
case PixelFormat::ASTC_2D_8X6_SRGB: case PixelFormat::ASTC_2D_8X6_SRGB:
case PixelFormat::ASTC_2D_6X5: case PixelFormat::ASTC_2D_6X5_UNORM:
case PixelFormat::ASTC_2D_6X5_SRGB: case PixelFormat::ASTC_2D_6X5_SRGB:
return true; return true;
default: default:
@ -242,12 +256,12 @@ bool IsPixelFormatASTC(PixelFormat format) {
bool IsPixelFormatSRGB(PixelFormat format) { bool IsPixelFormatSRGB(PixelFormat format) {
switch (format) { switch (format) {
case PixelFormat::RGBA8_SRGB: case PixelFormat::A8B8G8R8_SRGB:
case PixelFormat::BGRA8_SRGB: case PixelFormat::B8G8R8A8_SRGB:
case PixelFormat::DXT1_SRGB: case PixelFormat::BC1_RGBA_SRGB:
case PixelFormat::DXT23_SRGB: case PixelFormat::BC2_SRGB:
case PixelFormat::DXT45_SRGB: case PixelFormat::BC3_SRGB:
case PixelFormat::BC7U_SRGB: case PixelFormat::BC7_SRGB:
case PixelFormat::ASTC_2D_4X4_SRGB: case PixelFormat::ASTC_2D_4X4_SRGB:
case PixelFormat::ASTC_2D_8X8_SRGB: case PixelFormat::ASTC_2D_8X8_SRGB:
case PixelFormat::ASTC_2D_8X5_SRGB: case PixelFormat::ASTC_2D_8X5_SRGB:
@ -269,25 +283,4 @@ std::pair<u32, u32> GetASTCBlockSize(PixelFormat format) {
return {GetDefaultBlockWidth(format), GetDefaultBlockHeight(format)}; return {GetDefaultBlockWidth(format), GetDefaultBlockHeight(format)};
} }
bool IsFormatBCn(PixelFormat format) {
switch (format) {
case PixelFormat::DXT1:
case PixelFormat::DXT23:
case PixelFormat::DXT45:
case PixelFormat::DXN1:
case PixelFormat::DXN2SNORM:
case PixelFormat::DXN2UNORM:
case PixelFormat::BC7U:
case PixelFormat::BC6H_UF16:
case PixelFormat::BC6H_SF16:
case PixelFormat::DXT1_SRGB:
case PixelFormat::DXT23_SRGB:
case PixelFormat::DXT45_SRGB:
case PixelFormat::BC7U_SRGB:
return true;
default:
return false;
}
}
} // namespace VideoCore::Surface } // namespace VideoCore::Surface

View file

@ -15,94 +15,105 @@
namespace VideoCore::Surface { namespace VideoCore::Surface {
enum class PixelFormat { enum class PixelFormat {
ABGR8U = 0, A8B8G8R8_UNORM,
ABGR8S = 1, A8B8G8R8_SNORM,
ABGR8UI = 2, A8B8G8R8_SINT,
B5G6R5U = 3, A8B8G8R8_UINT,
A2B10G10R10U = 4, R5G6B5_UNORM,
A1B5G5R5U = 5, B5G6R5_UNORM,
R8U = 6, A1R5G5B5_UNORM,
R8UI = 7, A2B10G10R10_UNORM,
RGBA16F = 8, A2B10G10R10_UINT,
RGBA16U = 9, A1B5G5R5_UNORM,
RGBA16S = 10, R8_UNORM,
RGBA16UI = 11, R8_SNORM,
R11FG11FB10F = 12, R8_SINT,
RGBA32UI = 13, R8_UINT,
DXT1 = 14, R16G16B16A16_FLOAT,
DXT23 = 15, R16G16B16A16_UNORM,
DXT45 = 16, R16G16B16A16_SNORM,
DXN1 = 17, // This is also known as BC4 R16G16B16A16_SINT,
DXN2UNORM = 18, R16G16B16A16_UINT,
DXN2SNORM = 19, B10G11R11_FLOAT,
BC7U = 20, R32G32B32A32_UINT,
BC6H_UF16 = 21, BC1_RGBA_UNORM,
BC6H_SF16 = 22, BC2_UNORM,
ASTC_2D_4X4 = 23, BC3_UNORM,
BGRA8 = 24, BC4_UNORM,
RGBA32F = 25, BC4_SNORM,
RG32F = 26, BC5_UNORM,
R32F = 27, BC5_SNORM,
R16F = 28, BC7_UNORM,
R16U = 29, BC6H_UFLOAT,
R16S = 30, BC6H_SFLOAT,
R16UI = 31, ASTC_2D_4X4_UNORM,
R16I = 32, B8G8R8A8_UNORM,
RG16 = 33, R32G32B32A32_FLOAT,
RG16F = 34, R32G32B32A32_SINT,
RG16UI = 35, R32G32_FLOAT,
RG16I = 36, R32G32_SINT,
RG16S = 37, R32_FLOAT,
RGB32F = 38, R16_FLOAT,
RGBA8_SRGB = 39, R16_UNORM,
RG8U = 40, R16_SNORM,
RG8S = 41, R16_UINT,
RG8UI = 42, R16_SINT,
RG32UI = 43, R16G16_UNORM,
RGBX16F = 44, R16G16_FLOAT,
R32UI = 45, R16G16_UINT,
R32I = 46, R16G16_SINT,
ASTC_2D_8X8 = 47, R16G16_SNORM,
ASTC_2D_8X5 = 48, R32G32B32_FLOAT,
ASTC_2D_5X4 = 49, A8B8G8R8_SRGB,
BGRA8_SRGB = 50, R8G8_UNORM,
DXT1_SRGB = 51, R8G8_SNORM,
DXT23_SRGB = 52, R8G8_SINT,
DXT45_SRGB = 53, R8G8_UINT,
BC7U_SRGB = 54, R32G32_UINT,
R4G4B4A4U = 55, R16G16B16X16_FLOAT,
ASTC_2D_4X4_SRGB = 56, R32_UINT,
ASTC_2D_8X8_SRGB = 57, R32_SINT,
ASTC_2D_8X5_SRGB = 58, ASTC_2D_8X8_UNORM,
ASTC_2D_5X4_SRGB = 59, ASTC_2D_8X5_UNORM,
ASTC_2D_5X5 = 60, ASTC_2D_5X4_UNORM,
ASTC_2D_5X5_SRGB = 61, B8G8R8A8_SRGB,
ASTC_2D_10X8 = 62, BC1_RGBA_SRGB,
ASTC_2D_10X8_SRGB = 63, BC2_SRGB,
ASTC_2D_6X6 = 64, BC3_SRGB,
ASTC_2D_6X6_SRGB = 65, BC7_SRGB,
ASTC_2D_10X10 = 66, A4B4G4R4_UNORM,
ASTC_2D_10X10_SRGB = 67, ASTC_2D_4X4_SRGB,
ASTC_2D_12X12 = 68, ASTC_2D_8X8_SRGB,
ASTC_2D_12X12_SRGB = 69, ASTC_2D_8X5_SRGB,
ASTC_2D_8X6 = 70, ASTC_2D_5X4_SRGB,
ASTC_2D_8X6_SRGB = 71, ASTC_2D_5X5_UNORM,
ASTC_2D_6X5 = 72, ASTC_2D_5X5_SRGB,
ASTC_2D_6X5_SRGB = 73, ASTC_2D_10X8_UNORM,
E5B9G9R9F = 74, ASTC_2D_10X8_SRGB,
ASTC_2D_6X6_UNORM,
ASTC_2D_6X6_SRGB,
ASTC_2D_10X10_UNORM,
ASTC_2D_10X10_SRGB,
ASTC_2D_12X12_UNORM,
ASTC_2D_12X12_SRGB,
ASTC_2D_8X6_UNORM,
ASTC_2D_8X6_SRGB,
ASTC_2D_6X5_UNORM,
ASTC_2D_6X5_SRGB,
E5B9G9R9_FLOAT,
MaxColorFormat, MaxColorFormat,
// Depth formats // Depth formats
Z32F = 75, D32_FLOAT = MaxColorFormat,
Z16 = 76, D16_UNORM,
MaxDepthFormat, MaxDepthFormat,
// DepthStencil formats // DepthStencil formats
Z24S8 = 77, D24_UNORM_S8_UINT = MaxDepthFormat,
S8Z24 = 78, S8_UINT_D24_UNORM,
Z32FS8 = 79, D32_FLOAT_S8_UINT,
MaxDepthStencilFormat, MaxDepthStencilFormat,
@ -130,86 +141,97 @@ enum class SurfaceTarget {
}; };
constexpr std::array<u32, MaxPixelFormat> compression_factor_shift_table = {{ constexpr std::array<u32, MaxPixelFormat> compression_factor_shift_table = {{
0, // ABGR8U 0, // A8B8G8R8_UNORM
0, // ABGR8S 0, // A8B8G8R8_SNORM
0, // ABGR8UI 0, // A8B8G8R8_SINT
0, // B5G6R5U 0, // A8B8G8R8_UINT
0, // A2B10G10R10U 0, // R5G6B5_UNORM
0, // A1B5G5R5U 0, // B5G6R5_UNORM
0, // R8U 0, // A1R5G5B5_UNORM
0, // R8UI 0, // A2B10G10R10_UNORM
0, // RGBA16F 0, // A2B10G10R10_UINT
0, // RGBA16U 0, // A1B5G5R5_UNORM
0, // RGBA16S 0, // R8_UNORM
0, // RGBA16UI 0, // R8_SNORM
0, // R11FG11FB10F 0, // R8_SINT
0, // RGBA32UI 0, // R8_UINT
2, // DXT1 0, // R16G16B16A16_FLOAT
2, // DXT23 0, // R16G16B16A16_UNORM
2, // DXT45 0, // R16G16B16A16_SNORM
2, // DXN1 0, // R16G16B16A16_SINT
2, // DXN2UNORM 0, // R16G16B16A16_UINT
2, // DXN2SNORM 0, // B10G11R11_FLOAT
2, // BC7U 0, // R32G32B32A32_UINT
2, // BC6H_UF16 2, // BC1_RGBA_UNORM
2, // BC6H_SF16 2, // BC2_UNORM
2, // ASTC_2D_4X4 2, // BC3_UNORM
0, // BGRA8 2, // BC4_UNORM
0, // RGBA32F 2, // BC4_SNORM
0, // RG32F 2, // BC5_UNORM
0, // R32F 2, // BC5_SNORM
0, // R16F 2, // BC7_UNORM
0, // R16U 2, // BC6H_UFLOAT
0, // R16S 2, // BC6H_SFLOAT
0, // R16UI 2, // ASTC_2D_4X4_UNORM
0, // R16I 0, // B8G8R8A8_UNORM
0, // RG16 0, // R32G32B32A32_FLOAT
0, // RG16F 0, // R32G32B32A32_SINT
0, // RG16UI 0, // R32G32_FLOAT
0, // RG16I 0, // R32G32_SINT
0, // RG16S 0, // R32_FLOAT
0, // RGB32F 0, // R16_FLOAT
0, // RGBA8_SRGB 0, // R16_UNORM
0, // RG8U 0, // R16_SNORM
0, // RG8S 0, // R16_UINT
0, // RG8UI 0, // R16_SINT
0, // RG32UI 0, // R16G16_UNORM
0, // RGBX16F 0, // R16G16_FLOAT
0, // R32UI 0, // R16G16_UINT
0, // R32I 0, // R16G16_SINT
2, // ASTC_2D_8X8 0, // R16G16_SNORM
2, // ASTC_2D_8X5 0, // R32G32B32_FLOAT
2, // ASTC_2D_5X4 0, // A8B8G8R8_SRGB
0, // BGRA8_SRGB 0, // R8G8_UNORM
2, // DXT1_SRGB 0, // R8G8_SNORM
2, // DXT23_SRGB 0, // R8G8_SINT
2, // DXT45_SRGB 0, // R8G8_UINT
2, // BC7U_SRGB 0, // R32G32_UINT
0, // R4G4B4A4U 0, // R16G16B16X16_FLOAT
0, // R32_UINT
0, // R32_SINT
2, // ASTC_2D_8X8_UNORM
2, // ASTC_2D_8X5_UNORM
2, // ASTC_2D_5X4_UNORM
0, // B8G8R8A8_SRGB
2, // BC1_RGBA_SRGB
2, // BC2_SRGB
2, // BC3_SRGB
2, // BC7_SRGB
0, // A4B4G4R4_UNORM
2, // ASTC_2D_4X4_SRGB 2, // ASTC_2D_4X4_SRGB
2, // ASTC_2D_8X8_SRGB 2, // ASTC_2D_8X8_SRGB
2, // ASTC_2D_8X5_SRGB 2, // ASTC_2D_8X5_SRGB
2, // ASTC_2D_5X4_SRGB 2, // ASTC_2D_5X4_SRGB
2, // ASTC_2D_5X5 2, // ASTC_2D_5X5_UNORM
2, // ASTC_2D_5X5_SRGB 2, // ASTC_2D_5X5_SRGB
2, // ASTC_2D_10X8 2, // ASTC_2D_10X8_UNORM
2, // ASTC_2D_10X8_SRGB 2, // ASTC_2D_10X8_SRGB
2, // ASTC_2D_6X6 2, // ASTC_2D_6X6_UNORM
2, // ASTC_2D_6X6_SRGB 2, // ASTC_2D_6X6_SRGB
2, // ASTC_2D_10X10 2, // ASTC_2D_10X10_UNORM
2, // ASTC_2D_10X10_SRGB 2, // ASTC_2D_10X10_SRGB
2, // ASTC_2D_12X12 2, // ASTC_2D_12X12_UNORM
2, // ASTC_2D_12X12_SRGB 2, // ASTC_2D_12X12_SRGB
2, // ASTC_2D_8X6 2, // ASTC_2D_8X6_UNORM
2, // ASTC_2D_8X6_SRGB 2, // ASTC_2D_8X6_SRGB
2, // ASTC_2D_6X5 2, // ASTC_2D_6X5_UNORM
2, // ASTC_2D_6X5_SRGB 2, // ASTC_2D_6X5_SRGB
0, // E5B9G9R9F 0, // E5B9G9R9_FLOAT
0, // Z32F 0, // D32_FLOAT
0, // Z16 0, // D16_UNORM
0, // Z24S8 0, // D24_UNORM_S8_UINT
0, // S8Z24 0, // S8_UINT_D24_UNORM
0, // Z32FS8 0, // D32_FLOAT_S8_UINT
}}; }};
/** /**
@ -229,86 +251,97 @@ inline constexpr u32 GetCompressionFactor(PixelFormat format) {
} }
constexpr std::array<u32, MaxPixelFormat> block_width_table = {{ constexpr std::array<u32, MaxPixelFormat> block_width_table = {{
1, // ABGR8U 1, // A8B8G8R8_UNORM
1, // ABGR8S 1, // A8B8G8R8_SNORM
1, // ABGR8UI 1, // A8B8G8R8_SINT
1, // B5G6R5U 1, // A8B8G8R8_UINT
1, // A2B10G10R10U 1, // R5G6B5_UNORM
1, // A1B5G5R5U 1, // B5G6R5_UNORM
1, // R8U 1, // A1R5G5B5_UNORM
1, // R8UI 1, // A2B10G10R10_UNORM
1, // RGBA16F 1, // A2B10G10R10_UINT
1, // RGBA16U 1, // A1B5G5R5_UNORM
1, // RGBA16S 1, // R8_UNORM
1, // RGBA16UI 1, // R8_SNORM
1, // R11FG11FB10F 1, // R8_SINT
1, // RGBA32UI 1, // R8_UINT
4, // DXT1 1, // R16G16B16A16_FLOAT
4, // DXT23 1, // R16G16B16A16_UNORM
4, // DXT45 1, // R16G16B16A16_SNORM
4, // DXN1 1, // R16G16B16A16_SINT
4, // DXN2UNORM 1, // R16G16B16A16_UINT
4, // DXN2SNORM 1, // B10G11R11_FLOAT
4, // BC7U 1, // R32G32B32A32_UINT
4, // BC6H_UF16 4, // BC1_RGBA_UNORM
4, // BC6H_SF16 4, // BC2_UNORM
4, // ASTC_2D_4X4 4, // BC3_UNORM
1, // BGRA8 4, // BC4_UNORM
1, // RGBA32F 4, // BC4_SNORM
1, // RG32F 4, // BC5_UNORM
1, // R32F 4, // BC5_SNORM
1, // R16F 4, // BC7_UNORM
1, // R16U 4, // BC6H_UFLOAT
1, // R16S 4, // BC6H_SFLOAT
1, // R16UI 4, // ASTC_2D_4X4_UNORM
1, // R16I 1, // B8G8R8A8_UNORM
1, // RG16 1, // R32G32B32A32_FLOAT
1, // RG16F 1, // R32G32B32A32_SINT
1, // RG16UI 1, // R32G32_FLOAT
1, // RG16I 1, // R32G32_SINT
1, // RG16S 1, // R32_FLOAT
1, // RGB32F 1, // R16_FLOAT
1, // RGBA8_SRGB 1, // R16_UNORM
1, // RG8U 1, // R16_SNORM
1, // RG8S 1, // R16_UINT
1, // RG8UI 1, // R16_SINT
1, // RG32UI 1, // R16G16_UNORM
1, // RGBX16F 1, // R16G16_FLOAT
1, // R32UI 1, // R16G16_UINT
1, // R32I 1, // R16G16_SINT
8, // ASTC_2D_8X8 1, // R16G16_SNORM
8, // ASTC_2D_8X5 1, // R32G32B32_FLOAT
5, // ASTC_2D_5X4 1, // A8B8G8R8_SRGB
1, // BGRA8_SRGB 1, // R8G8_UNORM
4, // DXT1_SRGB 1, // R8G8_SNORM
4, // DXT23_SRGB 1, // R8G8_SINT
4, // DXT45_SRGB 1, // R8G8_UINT
4, // BC7U_SRGB 1, // R32G32_UINT
1, // R4G4B4A4U 1, // R16G16B16X16_FLOAT
1, // R32_UINT
1, // R32_SINT
8, // ASTC_2D_8X8_UNORM
8, // ASTC_2D_8X5_UNORM
5, // ASTC_2D_5X4_UNORM
1, // B8G8R8A8_SRGB
4, // BC1_RGBA_SRGB
4, // BC2_SRGB
4, // BC3_SRGB
4, // BC7_SRGB
1, // A4B4G4R4_UNORM
4, // ASTC_2D_4X4_SRGB 4, // ASTC_2D_4X4_SRGB
8, // ASTC_2D_8X8_SRGB 8, // ASTC_2D_8X8_SRGB
8, // ASTC_2D_8X5_SRGB 8, // ASTC_2D_8X5_SRGB
5, // ASTC_2D_5X4_SRGB 5, // ASTC_2D_5X4_SRGB
5, // ASTC_2D_5X5 5, // ASTC_2D_5X5_UNORM
5, // ASTC_2D_5X5_SRGB 5, // ASTC_2D_5X5_SRGB
10, // ASTC_2D_10X8 10, // ASTC_2D_10X8_UNORM
10, // ASTC_2D_10X8_SRGB 10, // ASTC_2D_10X8_SRGB
6, // ASTC_2D_6X6 6, // ASTC_2D_6X6_UNORM
6, // ASTC_2D_6X6_SRGB 6, // ASTC_2D_6X6_SRGB
10, // ASTC_2D_10X10 10, // ASTC_2D_10X10_UNORM
10, // ASTC_2D_10X10_SRGB 10, // ASTC_2D_10X10_SRGB
12, // ASTC_2D_12X12 12, // ASTC_2D_12X12_UNORM
12, // ASTC_2D_12X12_SRGB 12, // ASTC_2D_12X12_SRGB
8, // ASTC_2D_8X6 8, // ASTC_2D_8X6_UNORM
8, // ASTC_2D_8X6_SRGB 8, // ASTC_2D_8X6_SRGB
6, // ASTC_2D_6X5 6, // ASTC_2D_6X5_UNORM
6, // ASTC_2D_6X5_SRGB 6, // ASTC_2D_6X5_SRGB
1, // E5B9G9R9F 1, // E5B9G9R9_FLOAT
1, // Z32F 1, // D32_FLOAT
1, // Z16 1, // D16_UNORM
1, // Z24S8 1, // D24_UNORM_S8_UINT
1, // S8Z24 1, // S8_UINT_D24_UNORM
1, // Z32FS8 1, // D32_FLOAT_S8_UINT
}}; }};
static constexpr u32 GetDefaultBlockWidth(PixelFormat format) { static constexpr u32 GetDefaultBlockWidth(PixelFormat format) {
@ -320,86 +353,97 @@ static constexpr u32 GetDefaultBlockWidth(PixelFormat format) {
} }
constexpr std::array<u32, MaxPixelFormat> block_height_table = {{ constexpr std::array<u32, MaxPixelFormat> block_height_table = {{
1, // ABGR8U 1, // A8B8G8R8_UNORM
1, // ABGR8S 1, // A8B8G8R8_SNORM
1, // ABGR8UI 1, // A8B8G8R8_SINT
1, // B5G6R5U 1, // A8B8G8R8_UINT
1, // A2B10G10R10U 1, // R5G6B5_UNORM
1, // A1B5G5R5U 1, // B5G6R5_UNORM
1, // R8U 1, // A1R5G5B5_UNORM
1, // R8UI 1, // A2B10G10R10_UNORM
1, // RGBA16F 1, // A2B10G10R10_UINT
1, // RGBA16U 1, // A1B5G5R5_UNORM
1, // RGBA16S 1, // R8_UNORM
1, // RGBA16UI 1, // R8_SNORM
1, // R11FG11FB10F 1, // R8_SINT
1, // RGBA32UI 1, // R8_UINT
4, // DXT1 1, // R16G16B16A16_FLOAT
4, // DXT23 1, // R16G16B16A16_UNORM
4, // DXT45 1, // R16G16B16A16_SNORM
4, // DXN1 1, // R16G16B16A16_SINT
4, // DXN2UNORM 1, // R16G16B16A16_UINT
4, // DXN2SNORM 1, // B10G11R11_FLOAT
4, // BC7U 1, // R32G32B32A32_UINT
4, // BC6H_UF16 4, // BC1_RGBA_UNORM
4, // BC6H_SF16 4, // BC2_UNORM
4, // ASTC_2D_4X4 4, // BC3_UNORM
1, // BGRA8 4, // BC4_UNORM
1, // RGBA32F 4, // BC4_SNORM
1, // RG32F 4, // BC5_UNORM
1, // R32F 4, // BC5_SNORM
1, // R16F 4, // BC7_UNORM
1, // R16U 4, // BC6H_UFLOAT
1, // R16S 4, // BC6H_SFLOAT
1, // R16UI 4, // ASTC_2D_4X4_UNORM
1, // R16I 1, // B8G8R8A8_UNORM
1, // RG16 1, // R32G32B32A32_FLOAT
1, // RG16F 1, // R32G32B32A32_SINT
1, // RG16UI 1, // R32G32_FLOAT
1, // RG16I 1, // R32G32_SINT
1, // RG16S 1, // R32_FLOAT
1, // RGB32F 1, // R16_FLOAT
1, // RGBA8_SRGB 1, // R16_UNORM
1, // RG8U 1, // R16_SNORM
1, // RG8S 1, // R16_UINT
1, // RG8UI 1, // R16_SINT
1, // RG32UI 1, // R16G16_UNORM
1, // RGBX16F 1, // R16G16_FLOAT
1, // R32UI 1, // R16G16_UINT
1, // R32I 1, // R16G16_SINT
8, // ASTC_2D_8X8 1, // R16G16_SNORM
5, // ASTC_2D_8X5 1, // R32G32B32_FLOAT
4, // ASTC_2D_5X4 1, // A8B8G8R8_SRGB
1, // BGRA8_SRGB 1, // R8G8_UNORM
4, // DXT1_SRGB 1, // R8G8_SNORM
4, // DXT23_SRGB 1, // R8G8_SINT
4, // DXT45_SRGB 1, // R8G8_UINT
4, // BC7U_SRGB 1, // R32G32_UINT
1, // R4G4B4A4U 1, // R16G16B16X16_FLOAT
1, // R32_UINT
1, // R32_SINT
8, // ASTC_2D_8X8_UNORM
5, // ASTC_2D_8X5_UNORM
4, // ASTC_2D_5X4_UNORM
1, // B8G8R8A8_SRGB
4, // BC1_RGBA_SRGB
4, // BC2_SRGB
4, // BC3_SRGB
4, // BC7_SRGB
1, // A4B4G4R4_UNORM
4, // ASTC_2D_4X4_SRGB 4, // ASTC_2D_4X4_SRGB
8, // ASTC_2D_8X8_SRGB 8, // ASTC_2D_8X8_SRGB
5, // ASTC_2D_8X5_SRGB 5, // ASTC_2D_8X5_SRGB
4, // ASTC_2D_5X4_SRGB 4, // ASTC_2D_5X4_SRGB
5, // ASTC_2D_5X5 5, // ASTC_2D_5X5_UNORM
5, // ASTC_2D_5X5_SRGB 5, // ASTC_2D_5X5_SRGB
8, // ASTC_2D_10X8 8, // ASTC_2D_10X8_UNORM
8, // ASTC_2D_10X8_SRGB 8, // ASTC_2D_10X8_SRGB
6, // ASTC_2D_6X6 6, // ASTC_2D_6X6_UNORM
6, // ASTC_2D_6X6_SRGB 6, // ASTC_2D_6X6_SRGB
10, // ASTC_2D_10X10 10, // ASTC_2D_10X10_UNORM
10, // ASTC_2D_10X10_SRGB 10, // ASTC_2D_10X10_SRGB
12, // ASTC_2D_12X12 12, // ASTC_2D_12X12_UNORM
12, // ASTC_2D_12X12_SRGB 12, // ASTC_2D_12X12_SRGB
6, // ASTC_2D_8X6 6, // ASTC_2D_8X6_UNORM
6, // ASTC_2D_8X6_SRGB 6, // ASTC_2D_8X6_SRGB
5, // ASTC_2D_6X5 5, // ASTC_2D_6X5_UNORM
5, // ASTC_2D_6X5_SRGB 5, // ASTC_2D_6X5_SRGB
1, // E5B9G9R9F 1, // E5B9G9R9_FLOAT
1, // Z32F 1, // D32_FLOAT
1, // Z16 1, // D16_UNORM
1, // Z24S8 1, // D24_UNORM_S8_UINT
1, // S8Z24 1, // S8_UINT_D24_UNORM
1, // Z32FS8 1, // D32_FLOAT_S8_UINT
}}; }};
static constexpr u32 GetDefaultBlockHeight(PixelFormat format) { static constexpr u32 GetDefaultBlockHeight(PixelFormat format) {
@ -411,86 +455,97 @@ static constexpr u32 GetDefaultBlockHeight(PixelFormat format) {
} }
constexpr std::array<u32, MaxPixelFormat> bpp_table = {{ constexpr std::array<u32, MaxPixelFormat> bpp_table = {{
32, // ABGR8U 32, // A8B8G8R8_UNORM
32, // ABGR8S 32, // A8B8G8R8_SNORM
32, // ABGR8UI 32, // A8B8G8R8_SINT
16, // B5G6R5U 32, // A8B8G8R8_UINT
32, // A2B10G10R10U 16, // R5G6B5_UNORM
16, // A1B5G5R5U 16, // B5G6R5_UNORM
8, // R8U 16, // A1R5G5B5_UNORM
8, // R8UI 32, // A2B10G10R10_UNORM
64, // RGBA16F 32, // A2B10G10R10_UINT
64, // RGBA16U 16, // A1B5G5R5_UNORM
64, // RGBA16S 8, // R8_UNORM
64, // RGBA16UI 8, // R8_SNORM
32, // R11FG11FB10F 8, // R8_SINT
128, // RGBA32UI 8, // R8_UINT
64, // DXT1 64, // R16G16B16A16_FLOAT
128, // DXT23 64, // R16G16B16A16_UNORM
128, // DXT45 64, // R16G16B16A16_SNORM
64, // DXN1 64, // R16G16B16A16_SINT
128, // DXN2UNORM 64, // R16G16B16A16_UINT
128, // DXN2SNORM 32, // B10G11R11_FLOAT
128, // BC7U 128, // R32G32B32A32_UINT
128, // BC6H_UF16 64, // BC1_RGBA_UNORM
128, // BC6H_SF16 128, // BC2_UNORM
128, // ASTC_2D_4X4 128, // BC3_UNORM
32, // BGRA8 64, // BC4_UNORM
128, // RGBA32F 64, // BC4_SNORM
64, // RG32F 128, // BC5_UNORM
32, // R32F 128, // BC5_SNORM
16, // R16F 128, // BC7_UNORM
16, // R16U 128, // BC6H_UFLOAT
16, // R16S 128, // BC6H_SFLOAT
16, // R16UI 128, // ASTC_2D_4X4_UNORM
16, // R16I 32, // B8G8R8A8_UNORM
32, // RG16 128, // R32G32B32A32_FLOAT
32, // RG16F 128, // R32G32B32A32_SINT
32, // RG16UI 64, // R32G32_FLOAT
32, // RG16I 64, // R32G32_SINT
32, // RG16S 32, // R32_FLOAT
96, // RGB32F 16, // R16_FLOAT
32, // RGBA8_SRGB 16, // R16_UNORM
16, // RG8U 16, // R16_SNORM
16, // RG8S 16, // R16_UINT
16, // RG8UI 16, // R16_SINT
64, // RG32UI 32, // R16G16_UNORM
64, // RGBX16F 32, // R16G16_FLOAT
32, // R32UI 32, // R16G16_UINT
32, // R32I 32, // R16G16_SINT
128, // ASTC_2D_8X8 32, // R16G16_SNORM
128, // ASTC_2D_8X5 96, // R32G32B32_FLOAT
128, // ASTC_2D_5X4 32, // A8B8G8R8_SRGB
32, // BGRA8_SRGB 16, // R8G8_UNORM
64, // DXT1_SRGB 16, // R8G8_SNORM
128, // DXT23_SRGB 16, // R8G8_SINT
128, // DXT45_SRGB 16, // R8G8_UINT
128, // BC7U 64, // R32G32_UINT
16, // R4G4B4A4U 64, // R16G16B16X16_FLOAT
32, // R32_UINT
32, // R32_SINT
128, // ASTC_2D_8X8_UNORM
128, // ASTC_2D_8X5_UNORM
128, // ASTC_2D_5X4_UNORM
32, // B8G8R8A8_SRGB
64, // BC1_RGBA_SRGB
128, // BC2_SRGB
128, // BC3_SRGB
128, // BC7_UNORM
16, // A4B4G4R4_UNORM
128, // ASTC_2D_4X4_SRGB 128, // ASTC_2D_4X4_SRGB
128, // ASTC_2D_8X8_SRGB 128, // ASTC_2D_8X8_SRGB
128, // ASTC_2D_8X5_SRGB 128, // ASTC_2D_8X5_SRGB
128, // ASTC_2D_5X4_SRGB 128, // ASTC_2D_5X4_SRGB
128, // ASTC_2D_5X5 128, // ASTC_2D_5X5_UNORM
128, // ASTC_2D_5X5_SRGB 128, // ASTC_2D_5X5_SRGB
128, // ASTC_2D_10X8 128, // ASTC_2D_10X8_UNORM
128, // ASTC_2D_10X8_SRGB 128, // ASTC_2D_10X8_SRGB
128, // ASTC_2D_6X6 128, // ASTC_2D_6X6_UNORM
128, // ASTC_2D_6X6_SRGB 128, // ASTC_2D_6X6_SRGB
128, // ASTC_2D_10X10 128, // ASTC_2D_10X10_UNORM
128, // ASTC_2D_10X10_SRGB 128, // ASTC_2D_10X10_SRGB
128, // ASTC_2D_12X12 128, // ASTC_2D_12X12_UNORM
128, // ASTC_2D_12X12_SRGB 128, // ASTC_2D_12X12_SRGB
128, // ASTC_2D_8X6 128, // ASTC_2D_8X6_UNORM
128, // ASTC_2D_8X6_SRGB 128, // ASTC_2D_8X6_SRGB
128, // ASTC_2D_6X5 128, // ASTC_2D_6X5_UNORM
128, // ASTC_2D_6X5_SRGB 128, // ASTC_2D_6X5_SRGB
32, // E5B9G9R9F 32, // E5B9G9R9_FLOAT
32, // Z32F 32, // D32_FLOAT
16, // Z16 16, // D16_UNORM
32, // Z24S8 32, // D24_UNORM_S8_UINT
32, // S8Z24 32, // S8_UINT_D24_UNORM
64, // Z32FS8 64, // D32_FLOAT_S8_UINT
}}; }};
static constexpr u32 GetFormatBpp(PixelFormat format) { static constexpr u32 GetFormatBpp(PixelFormat format) {
@ -529,7 +584,4 @@ bool IsPixelFormatSRGB(PixelFormat format);
std::pair<u32, u32> GetASTCBlockSize(PixelFormat format); std::pair<u32, u32> GetASTCBlockSize(PixelFormat format);
/// Returns true if the specified PixelFormat is a BCn format, e.g. DXT or DXN
bool IsFormatBCn(PixelFormat format);
} // namespace VideoCore::Surface } // namespace VideoCore::Surface

View file

@ -41,119 +41,126 @@ struct Table {
ComponentType alpha_component; ComponentType alpha_component;
bool is_srgb; bool is_srgb;
}; };
constexpr std::array<Table, 78> DefinitionTable = {{ constexpr std::array<Table, 86> DefinitionTable = {{
{TextureFormat::A8R8G8B8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ABGR8U}, {TextureFormat::A8R8G8B8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A8B8G8R8_UNORM},
{TextureFormat::A8R8G8B8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::ABGR8S}, {TextureFormat::A8R8G8B8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::A8B8G8R8_SNORM},
{TextureFormat::A8R8G8B8, C, UINT, UINT, UINT, UINT, PixelFormat::ABGR8UI}, {TextureFormat::A8R8G8B8, C, UINT, UINT, UINT, UINT, PixelFormat::A8B8G8R8_UINT},
{TextureFormat::A8R8G8B8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::RGBA8_SRGB}, {TextureFormat::A8R8G8B8, C, SINT, SINT, SINT, SINT, PixelFormat::A8B8G8R8_SINT},
{TextureFormat::A8R8G8B8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::A8B8G8R8_SRGB},
{TextureFormat::B5G6R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::B5G6R5U}, {TextureFormat::B5G6R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::B5G6R5_UNORM},
{TextureFormat::A2B10G10R10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A2B10G10R10U}, {TextureFormat::A2B10G10R10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A2B10G10R10_UNORM},
{TextureFormat::A2B10G10R10, C, UINT, UINT, UINT, UINT, PixelFormat::A2B10G10R10_UINT},
{TextureFormat::A1B5G5R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A1B5G5R5U}, {TextureFormat::A1B5G5R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A1B5G5R5_UNORM},
{TextureFormat::A4B4G4R4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R4G4B4A4U}, {TextureFormat::A4B4G4R4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A4B4G4R4_UNORM},
{TextureFormat::R8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R8U}, {TextureFormat::R8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R8_UNORM},
{TextureFormat::R8, C, UINT, UINT, UINT, UINT, PixelFormat::R8UI}, {TextureFormat::R8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R8_SNORM},
{TextureFormat::R8, C, UINT, UINT, UINT, UINT, PixelFormat::R8_UINT},
{TextureFormat::R8, C, SINT, SINT, SINT, SINT, PixelFormat::R8_SINT},
{TextureFormat::G8R8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::RG8U}, {TextureFormat::R8G8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R8G8_UNORM},
{TextureFormat::G8R8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::RG8S}, {TextureFormat::R8G8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R8G8_SNORM},
{TextureFormat::G8R8, C, UINT, UINT, UINT, UINT, PixelFormat::RG8UI}, {TextureFormat::R8G8, C, UINT, UINT, UINT, UINT, PixelFormat::R8G8_UINT},
{TextureFormat::R8G8, C, SINT, SINT, SINT, SINT, PixelFormat::R8G8_SINT},
{TextureFormat::R16_G16_B16_A16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::RGBA16S}, {TextureFormat::R16G16B16A16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16G16B16A16_SNORM},
{TextureFormat::R16_G16_B16_A16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::RGBA16U}, {TextureFormat::R16G16B16A16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16G16B16A16_UNORM},
{TextureFormat::R16_G16_B16_A16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RGBA16F}, {TextureFormat::R16G16B16A16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16G16B16A16_FLOAT},
{TextureFormat::R16_G16_B16_A16, C, UINT, UINT, UINT, UINT, PixelFormat::RGBA16UI}, {TextureFormat::R16G16B16A16, C, UINT, UINT, UINT, UINT, PixelFormat::R16G16B16A16_UINT},
{TextureFormat::R16G16B16A16, C, SINT, SINT, SINT, SINT, PixelFormat::R16G16B16A16_SINT},
{TextureFormat::R16_G16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RG16F}, {TextureFormat::R16G16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16G16_FLOAT},
{TextureFormat::R16_G16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::RG16}, {TextureFormat::R16G16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16G16_UNORM},
{TextureFormat::R16_G16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::RG16S}, {TextureFormat::R16G16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16G16_SNORM},
{TextureFormat::R16_G16, C, UINT, UINT, UINT, UINT, PixelFormat::RG16UI}, {TextureFormat::R16G16, C, UINT, UINT, UINT, UINT, PixelFormat::R16G16_UINT},
{TextureFormat::R16_G16, C, SINT, SINT, SINT, SINT, PixelFormat::RG16I}, {TextureFormat::R16G16, C, SINT, SINT, SINT, SINT, PixelFormat::R16G16_SINT},
{TextureFormat::R16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16F}, {TextureFormat::R16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16_FLOAT},
{TextureFormat::R16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16U}, {TextureFormat::R16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16_UNORM},
{TextureFormat::R16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16S}, {TextureFormat::R16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16_SNORM},
{TextureFormat::R16, C, UINT, UINT, UINT, UINT, PixelFormat::R16UI}, {TextureFormat::R16, C, UINT, UINT, UINT, UINT, PixelFormat::R16_UINT},
{TextureFormat::R16, C, SINT, SINT, SINT, SINT, PixelFormat::R16I}, {TextureFormat::R16, C, SINT, SINT, SINT, SINT, PixelFormat::R16_SINT},
{TextureFormat::BF10GF11RF11, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R11FG11FB10F}, {TextureFormat::B10G11R11, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::B10G11R11_FLOAT},
{TextureFormat::R32_G32_B32_A32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RGBA32F}, {TextureFormat::R32G32B32A32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32G32B32A32_FLOAT},
{TextureFormat::R32_G32_B32_A32, C, UINT, UINT, UINT, UINT, PixelFormat::RGBA32UI}, {TextureFormat::R32G32B32A32, C, UINT, UINT, UINT, UINT, PixelFormat::R32G32B32A32_UINT},
{TextureFormat::R32G32B32A32, C, SINT, SINT, SINT, SINT, PixelFormat::R32G32B32A32_SINT},
{TextureFormat::R32_G32_B32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RGB32F}, {TextureFormat::R32G32B32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32G32B32_FLOAT},
{TextureFormat::R32_G32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RG32F}, {TextureFormat::R32G32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32G32_FLOAT},
{TextureFormat::R32_G32, C, UINT, UINT, UINT, UINT, PixelFormat::RG32UI}, {TextureFormat::R32G32, C, UINT, UINT, UINT, UINT, PixelFormat::R32G32_UINT},
{TextureFormat::R32G32, C, SINT, SINT, SINT, SINT, PixelFormat::R32G32_SINT},
{TextureFormat::R32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32F}, {TextureFormat::R32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32_FLOAT},
{TextureFormat::R32, C, UINT, UINT, UINT, UINT, PixelFormat::R32UI}, {TextureFormat::R32, C, UINT, UINT, UINT, UINT, PixelFormat::R32_UINT},
{TextureFormat::R32, C, SINT, SINT, SINT, SINT, PixelFormat::R32I}, {TextureFormat::R32, C, SINT, SINT, SINT, SINT, PixelFormat::R32_SINT},
{TextureFormat::E5B9G9R9_SHAREDEXP, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::E5B9G9R9F}, {TextureFormat::E5B9G9R9, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::E5B9G9R9_FLOAT},
{TextureFormat::ZF32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::Z32F}, {TextureFormat::D32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::D32_FLOAT},
{TextureFormat::Z16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::Z16}, {TextureFormat::D16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::D16_UNORM},
{TextureFormat::S8Z24, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8Z24}, {TextureFormat::S8D24, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8_UINT_D24_UNORM},
{TextureFormat::G24R8, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8Z24}, {TextureFormat::R8G24, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8_UINT_D24_UNORM},
{TextureFormat::ZF32_X24S8, C, FLOAT, UINT, UNORM, UNORM, PixelFormat::Z32FS8}, {TextureFormat::D32S8, C, FLOAT, UINT, UNORM, UNORM, PixelFormat::D32_FLOAT_S8_UINT},
{TextureFormat::DXT1, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT1}, {TextureFormat::BC1_RGBA, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC1_RGBA_UNORM},
{TextureFormat::DXT1, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT1_SRGB}, {TextureFormat::BC1_RGBA, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC1_RGBA_SRGB},
{TextureFormat::DXT23, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT23}, {TextureFormat::BC2, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC2_UNORM},
{TextureFormat::DXT23, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT23_SRGB}, {TextureFormat::BC2, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC2_SRGB},
{TextureFormat::DXT45, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT45}, {TextureFormat::BC3, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC3_UNORM},
{TextureFormat::DXT45, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT45_SRGB}, {TextureFormat::BC3, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC3_SRGB},
// TODO: Use a different pixel format for SNORM {TextureFormat::BC4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC4_UNORM},
{TextureFormat::DXN1, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXN1}, {TextureFormat::BC4, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::BC4_SNORM},
{TextureFormat::DXN1, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::DXN1},
{TextureFormat::DXN2, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXN2UNORM}, {TextureFormat::BC5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC5_UNORM},
{TextureFormat::DXN2, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::DXN2SNORM}, {TextureFormat::BC5, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::BC5_SNORM},
{TextureFormat::BC7U, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7U}, {TextureFormat::BC7, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7_UNORM},
{TextureFormat::BC7U, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7U_SRGB}, {TextureFormat::BC7, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7_SRGB},
{TextureFormat::BC6H_SF16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_SF16}, {TextureFormat::BC6H_SFLOAT, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_SFLOAT},
{TextureFormat::BC6H_UF16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_UF16}, {TextureFormat::BC6H_UFLOAT, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_UFLOAT},
{TextureFormat::ASTC_2D_4X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4}, {TextureFormat::ASTC_2D_4X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4_UNORM},
{TextureFormat::ASTC_2D_4X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4_SRGB}, {TextureFormat::ASTC_2D_4X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4_SRGB},
{TextureFormat::ASTC_2D_5X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4}, {TextureFormat::ASTC_2D_5X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4_UNORM},
{TextureFormat::ASTC_2D_5X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4_SRGB}, {TextureFormat::ASTC_2D_5X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4_SRGB},
{TextureFormat::ASTC_2D_5X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5}, {TextureFormat::ASTC_2D_5X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5_UNORM},
{TextureFormat::ASTC_2D_5X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5_SRGB}, {TextureFormat::ASTC_2D_5X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5_SRGB},
{TextureFormat::ASTC_2D_8X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8}, {TextureFormat::ASTC_2D_8X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8_UNORM},
{TextureFormat::ASTC_2D_8X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8_SRGB}, {TextureFormat::ASTC_2D_8X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8_SRGB},
{TextureFormat::ASTC_2D_8X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5}, {TextureFormat::ASTC_2D_8X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5_UNORM},
{TextureFormat::ASTC_2D_8X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5_SRGB}, {TextureFormat::ASTC_2D_8X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5_SRGB},
{TextureFormat::ASTC_2D_10X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8}, {TextureFormat::ASTC_2D_10X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8_UNORM},
{TextureFormat::ASTC_2D_10X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8_SRGB}, {TextureFormat::ASTC_2D_10X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8_SRGB},
{TextureFormat::ASTC_2D_6X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6}, {TextureFormat::ASTC_2D_6X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6_UNORM},
{TextureFormat::ASTC_2D_6X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6_SRGB}, {TextureFormat::ASTC_2D_6X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6_SRGB},
{TextureFormat::ASTC_2D_10X10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10}, {TextureFormat::ASTC_2D_10X10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10_UNORM},
{TextureFormat::ASTC_2D_10X10, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10_SRGB}, {TextureFormat::ASTC_2D_10X10, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10_SRGB},
{TextureFormat::ASTC_2D_12X12, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12}, {TextureFormat::ASTC_2D_12X12, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12_UNORM},
{TextureFormat::ASTC_2D_12X12, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12_SRGB}, {TextureFormat::ASTC_2D_12X12, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12_SRGB},
{TextureFormat::ASTC_2D_8X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6}, {TextureFormat::ASTC_2D_8X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6_UNORM},
{TextureFormat::ASTC_2D_8X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6_SRGB}, {TextureFormat::ASTC_2D_8X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6_SRGB},
{TextureFormat::ASTC_2D_6X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5}, {TextureFormat::ASTC_2D_6X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5_UNORM},
{TextureFormat::ASTC_2D_6X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5_SRGB}, {TextureFormat::ASTC_2D_6X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5_SRGB},
}}; }};
@ -184,7 +191,7 @@ PixelFormat FormatLookupTable::GetPixelFormat(TextureFormat format, bool is_srgb
static_cast<int>(format), is_srgb, static_cast<int>(red_component), static_cast<int>(format), is_srgb, static_cast<int>(red_component),
static_cast<int>(green_component), static_cast<int>(blue_component), static_cast<int>(green_component), static_cast<int>(blue_component),
static_cast<int>(alpha_component)); static_cast<int>(alpha_component));
return PixelFormat::ABGR8U; return PixelFormat::A8B8G8R8_UNORM;
} }
void FormatLookupTable::Set(TextureFormat format, bool is_srgb, ComponentType red_component, void FormatLookupTable::Set(TextureFormat format, bool is_srgb, ComponentType red_component,

View file

@ -228,7 +228,7 @@ void SurfaceBaseImpl::LoadBuffer(Tegra::MemoryManager& memory_manager,
} }
} }
if (!is_converted && params.pixel_format != PixelFormat::S8Z24) { if (!is_converted && params.pixel_format != PixelFormat::S8_UINT_D24_UNORM) {
return; return;
} }

View file

@ -83,12 +83,12 @@ SurfaceParams SurfaceParams::CreateForTexture(const FormatLookupTable& lookup_ta
params.type = GetFormatType(params.pixel_format); params.type = GetFormatType(params.pixel_format);
if (entry.is_shadow && params.type == SurfaceType::ColorTexture) { if (entry.is_shadow && params.type == SurfaceType::ColorTexture) {
switch (params.pixel_format) { switch (params.pixel_format) {
case PixelFormat::R16U: case PixelFormat::R16_UNORM:
case PixelFormat::R16F: case PixelFormat::R16_FLOAT:
params.pixel_format = PixelFormat::Z16; params.pixel_format = PixelFormat::D16_UNORM;
break; break;
case PixelFormat::R32F: case PixelFormat::R32_FLOAT:
params.pixel_format = PixelFormat::Z32F; params.pixel_format = PixelFormat::D32_FLOAT;
break; break;
default: default:
UNIMPLEMENTED_MSG("Unimplemented shadow convert format: {}", UNIMPLEMENTED_MSG("Unimplemented shadow convert format: {}",
@ -195,8 +195,8 @@ SurfaceParams SurfaceParams::CreateForFramebuffer(Core::System& system, std::siz
SurfaceParams params; SurfaceParams params;
params.is_tiled = params.is_tiled =
config.memory_layout.type == Tegra::Engines::Maxwell3D::Regs::InvMemoryLayout::BlockLinear; config.memory_layout.type == Tegra::Engines::Maxwell3D::Regs::InvMemoryLayout::BlockLinear;
params.srgb_conversion = config.format == Tegra::RenderTargetFormat::BGRA8_SRGB || params.srgb_conversion = config.format == Tegra::RenderTargetFormat::B8G8R8A8_SRGB ||
config.format == Tegra::RenderTargetFormat::RGBA8_SRGB; config.format == Tegra::RenderTargetFormat::A8B8G8R8_SRGB;
params.block_width = config.memory_layout.block_width; params.block_width = config.memory_layout.block_width;
params.block_height = config.memory_layout.block_height; params.block_height = config.memory_layout.block_height;
params.block_depth = config.memory_layout.block_depth; params.block_depth = config.memory_layout.block_depth;
@ -235,8 +235,8 @@ SurfaceParams SurfaceParams::CreateForFermiCopySurface(
const Tegra::Engines::Fermi2D::Regs::Surface& config) { const Tegra::Engines::Fermi2D::Regs::Surface& config) {
SurfaceParams params{}; SurfaceParams params{};
params.is_tiled = !config.linear; params.is_tiled = !config.linear;
params.srgb_conversion = config.format == Tegra::RenderTargetFormat::BGRA8_SRGB || params.srgb_conversion = config.format == Tegra::RenderTargetFormat::B8G8R8A8_SRGB ||
config.format == Tegra::RenderTargetFormat::RGBA8_SRGB; config.format == Tegra::RenderTargetFormat::A8B8G8R8_SRGB;
params.block_width = params.is_tiled ? std::min(config.BlockWidth(), 5U) : 0, params.block_width = params.is_tiled ? std::min(config.BlockWidth(), 5U) : 0,
params.block_height = params.is_tiled ? std::min(config.BlockHeight(), 5U) : 0, params.block_height = params.is_tiled ? std::min(config.BlockHeight(), 5U) : 0,
params.block_depth = params.is_tiled ? std::min(config.BlockDepth(), 5U) : 0, params.block_depth = params.is_tiled ? std::min(config.BlockDepth(), 5U) : 0,

View file

@ -373,9 +373,9 @@ protected:
siblings_table[static_cast<std::size_t>(b)] = a; siblings_table[static_cast<std::size_t>(b)] = a;
}; };
std::fill(siblings_table.begin(), siblings_table.end(), PixelFormat::Invalid); std::fill(siblings_table.begin(), siblings_table.end(), PixelFormat::Invalid);
make_siblings(PixelFormat::Z16, PixelFormat::R16U); make_siblings(PixelFormat::D16_UNORM, PixelFormat::R16_UNORM);
make_siblings(PixelFormat::Z32F, PixelFormat::R32F); make_siblings(PixelFormat::D32_FLOAT, PixelFormat::R32_FLOAT);
make_siblings(PixelFormat::Z32FS8, PixelFormat::RG32F); make_siblings(PixelFormat::D32_FLOAT_S8_UINT, PixelFormat::R32G32_FLOAT);
sampled_textures.reserve(64); sampled_textures.reserve(64);
} }
@ -1031,7 +1031,7 @@ private:
params.pitch = 4; params.pitch = 4;
params.num_levels = 1; params.num_levels = 1;
params.emulated_levels = 1; params.emulated_levels = 1;
params.pixel_format = VideoCore::Surface::PixelFormat::R8U; params.pixel_format = VideoCore::Surface::PixelFormat::R8_UNORM;
params.type = VideoCore::Surface::SurfaceType::ColorTexture; params.type = VideoCore::Surface::SurfaceType::ColorTexture;
auto surface = CreateSurface(0ULL, params); auto surface = CreateSurface(0ULL, params);
invalid_memory.resize(surface->GetHostSizeInBytes(), 0U); invalid_memory.resize(surface->GetHostSizeInBytes(), 0U);

View file

@ -35,7 +35,7 @@ void SwapS8Z24ToZ24S8(u8* data, u32 width, u32 height) {
S8Z24 s8z24_pixel{}; S8Z24 s8z24_pixel{};
Z24S8 z24s8_pixel{}; Z24S8 z24s8_pixel{};
constexpr auto bpp{ constexpr auto bpp{
VideoCore::Surface::GetBytesPerPixel(VideoCore::Surface::PixelFormat::S8Z24)}; VideoCore::Surface::GetBytesPerPixel(VideoCore::Surface::PixelFormat::S8_UINT_D24_UNORM)};
for (std::size_t y = 0; y < height; ++y) { for (std::size_t y = 0; y < height; ++y) {
for (std::size_t x = 0; x < width; ++x) { for (std::size_t x = 0; x < width; ++x) {
const std::size_t offset{bpp * (y * width + x)}; const std::size_t offset{bpp * (y * width + x)};
@ -73,7 +73,7 @@ void ConvertFromGuestToHost(u8* in_data, u8* out_data, PixelFormat pixel_format,
in_data, width, height, depth, block_width, block_height); in_data, width, height, depth, block_width, block_height);
std::copy(rgba8_data.begin(), rgba8_data.end(), out_data); std::copy(rgba8_data.begin(), rgba8_data.end(), out_data);
} else if (convert_s8z24 && pixel_format == PixelFormat::S8Z24) { } else if (convert_s8z24 && pixel_format == PixelFormat::S8_UINT_D24_UNORM) {
Tegra::Texture::ConvertS8Z24ToZ24S8(in_data, width, height); Tegra::Texture::ConvertS8Z24ToZ24S8(in_data, width, height);
} }
} }
@ -85,7 +85,7 @@ void ConvertFromHostToGuest(u8* data, PixelFormat pixel_format, u32 width, u32 h
static_cast<u32>(pixel_format)); static_cast<u32>(pixel_format));
UNREACHABLE(); UNREACHABLE();
} else if (convert_s8z24 && pixel_format == PixelFormat::S8Z24) { } else if (convert_s8z24 && pixel_format == PixelFormat::S8_UINT_D24_UNORM) {
Tegra::Texture::ConvertZ24S8ToS8Z24(data, width, height); Tegra::Texture::ConvertZ24S8ToS8Z24(data, width, height);
} }
} }

View file

@ -184,53 +184,6 @@ void CopySwizzledData(u32 width, u32 height, u32 depth, u32 bytes_per_pixel,
} }
} }
u32 BytesPerPixel(TextureFormat format) {
switch (format) {
case TextureFormat::DXT1:
case TextureFormat::DXN1:
// In this case a 'pixel' actually refers to a 4x4 tile.
return 8;
case TextureFormat::DXT23:
case TextureFormat::DXT45:
case TextureFormat::DXN2:
case TextureFormat::BC7U:
case TextureFormat::BC6H_UF16:
case TextureFormat::BC6H_SF16:
// In this case a 'pixel' actually refers to a 4x4 tile.
return 16;
case TextureFormat::R32_G32_B32:
return 12;
case TextureFormat::ASTC_2D_4X4:
case TextureFormat::ASTC_2D_5X4:
case TextureFormat::ASTC_2D_8X8:
case TextureFormat::ASTC_2D_8X5:
case TextureFormat::ASTC_2D_10X8:
case TextureFormat::ASTC_2D_5X5:
case TextureFormat::A8R8G8B8:
case TextureFormat::A2B10G10R10:
case TextureFormat::BF10GF11RF11:
case TextureFormat::R32:
case TextureFormat::R16_G16:
return 4;
case TextureFormat::A1B5G5R5:
case TextureFormat::B5G6R5:
case TextureFormat::G8R8:
case TextureFormat::R16:
return 2;
case TextureFormat::R8:
return 1;
case TextureFormat::R16_G16_B16_A16:
return 8;
case TextureFormat::R32_G32_B32_A32:
return 16;
case TextureFormat::R32_G32:
return 8;
default:
UNIMPLEMENTED_MSG("Format not implemented");
return 1;
}
}
void UnswizzleTexture(u8* const unswizzled_data, u8* address, u32 tile_size_x, u32 tile_size_y, void UnswizzleTexture(u8* const unswizzled_data, u8* address, u32 tile_size_x, u32 tile_size_y,
u32 bytes_per_pixel, u32 width, u32 height, u32 depth, u32 block_height, u32 bytes_per_pixel, u32 width, u32 height, u32 depth, u32 block_height,
u32 block_depth, u32 width_spacing) { u32 block_depth, u32 width_spacing) {
@ -348,48 +301,6 @@ void SwizzleKepler(const u32 width, const u32 height, const u32 dst_x, const u32
} }
} }
std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat format, u32 width,
u32 height) {
std::vector<u8> rgba_data;
// TODO(Subv): Implement.
switch (format) {
case TextureFormat::DXT1:
case TextureFormat::DXT23:
case TextureFormat::DXT45:
case TextureFormat::DXN1:
case TextureFormat::DXN2:
case TextureFormat::BC7U:
case TextureFormat::BC6H_UF16:
case TextureFormat::BC6H_SF16:
case TextureFormat::ASTC_2D_4X4:
case TextureFormat::ASTC_2D_8X8:
case TextureFormat::ASTC_2D_5X5:
case TextureFormat::ASTC_2D_10X8:
case TextureFormat::A8R8G8B8:
case TextureFormat::A2B10G10R10:
case TextureFormat::A1B5G5R5:
case TextureFormat::B5G6R5:
case TextureFormat::R8:
case TextureFormat::G8R8:
case TextureFormat::BF10GF11RF11:
case TextureFormat::R32_G32_B32_A32:
case TextureFormat::R32_G32:
case TextureFormat::R32:
case TextureFormat::R16:
case TextureFormat::R16_G16:
case TextureFormat::R32_G32_B32:
// TODO(Subv): For the time being just forward the same data without any decoding.
rgba_data = texture_data;
break;
default:
UNIMPLEMENTED_MSG("Format not implemented");
break;
}
return rgba_data;
}
std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth, std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth,
u32 block_height, u32 block_depth) { u32 block_height, u32 block_depth) {
if (tiled) { if (tiled) {

View file

@ -38,10 +38,6 @@ void CopySwizzledData(u32 width, u32 height, u32 depth, u32 bytes_per_pixel,
u32 out_bytes_per_pixel, u8* swizzled_data, u8* unswizzled_data, u32 out_bytes_per_pixel, u8* swizzled_data, u8* unswizzled_data,
bool unswizzle, u32 block_height, u32 block_depth, u32 width_spacing); bool unswizzle, u32 block_height, u32 block_depth, u32 width_spacing);
/// Decodes an unswizzled texture into a A8R8G8B8 texture.
std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat format, u32 width,
u32 height);
/// This function calculates the correct size of a texture depending if it's tiled or not. /// This function calculates the correct size of a texture depending if it's tiled or not.
std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth, std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth,
u32 block_height, u32 block_depth); u32 block_height, u32 block_depth);

View file

@ -12,10 +12,10 @@
namespace Tegra::Texture { namespace Tegra::Texture {
enum class TextureFormat : u32 { enum class TextureFormat : u32 {
R32_G32_B32_A32 = 0x01, R32G32B32A32 = 0x01,
R32_G32_B32 = 0x02, R32G32B32 = 0x02,
R16_G16_B16_A16 = 0x03, R16G16B16A16 = 0x03,
R32_G32 = 0x04, R32G32 = 0x04,
R32_B24G8 = 0x05, R32_B24G8 = 0x05,
ETC2_RGB = 0x06, ETC2_RGB = 0x06,
X8B8G8R8 = 0x07, X8B8G8R8 = 0x07,
@ -23,19 +23,19 @@ enum class TextureFormat : u32 {
A2B10G10R10 = 0x09, A2B10G10R10 = 0x09,
ETC2_RGB_PTA = 0x0a, ETC2_RGB_PTA = 0x0a,
ETC2_RGBA = 0x0b, ETC2_RGBA = 0x0b,
R16_G16 = 0x0c, R16G16 = 0x0c,
G8R24 = 0x0d, R24G8 = 0x0d,
G24R8 = 0x0e, R8G24 = 0x0e,
R32 = 0x0f, R32 = 0x0f,
BC6H_SF16 = 0x10, BC6H_SFLOAT = 0x10,
BC6H_UF16 = 0x11, BC6H_UFLOAT = 0x11,
A4B4G4R4 = 0x12, A4B4G4R4 = 0x12,
A5B5G5R1 = 0x13, A5B5G5R1 = 0x13,
A1B5G5R5 = 0x14, A1B5G5R5 = 0x14,
B5G6R5 = 0x15, B5G6R5 = 0x15,
B6G5R5 = 0x16, B6G5R5 = 0x16,
BC7U = 0x17, BC7 = 0x17,
G8R8 = 0x18, R8G8 = 0x18,
EAC = 0x19, EAC = 0x19,
EACX2 = 0x1a, EACX2 = 0x1a,
R16 = 0x1b, R16 = 0x1b,
@ -43,23 +43,23 @@ enum class TextureFormat : u32 {
R8 = 0x1d, R8 = 0x1d,
G4R4 = 0x1e, G4R4 = 0x1e,
R1 = 0x1f, R1 = 0x1f,
E5B9G9R9_SHAREDEXP = 0x20, E5B9G9R9 = 0x20,
BF10GF11RF11 = 0x21, B10G11R11 = 0x21,
G8B8G8R8 = 0x22, G8B8G8R8 = 0x22,
B8G8R8G8 = 0x23, B8G8R8G8 = 0x23,
DXT1 = 0x24, BC1_RGBA = 0x24,
DXT23 = 0x25, BC2 = 0x25,
DXT45 = 0x26, BC3 = 0x26,
DXN1 = 0x27, BC4 = 0x27,
DXN2 = 0x28, BC5 = 0x28,
S8Z24 = 0x29, S8D24 = 0x29,
X8Z24 = 0x2a, X8Z24 = 0x2a,
Z24S8 = 0x2b, D24S8 = 0x2b,
X4V4Z24__COV4R4V = 0x2c, X4V4Z24__COV4R4V = 0x2c,
X4V4Z24__COV8R8V = 0x2d, X4V4Z24__COV8R8V = 0x2d,
V8Z24__COV4R12V = 0x2e, V8Z24__COV4R12V = 0x2e,
ZF32 = 0x2f, D32 = 0x2f,
ZF32_X24S8 = 0x30, D32S8 = 0x30,
X8Z24_X20V4S8__COV4R4V = 0x31, X8Z24_X20V4S8__COV4R4V = 0x31,
X8Z24_X20V4S8__COV8R8V = 0x32, X8Z24_X20V4S8__COV8R8V = 0x32,
ZF32_X20V4X8__COV4R4V = 0x33, ZF32_X20V4X8__COV4R4V = 0x33,
@ -69,7 +69,7 @@ enum class TextureFormat : u32 {
X8Z24_X16V8S8__COV4R12V = 0x37, X8Z24_X16V8S8__COV4R12V = 0x37,
ZF32_X16V8X8__COV4R12V = 0x38, ZF32_X16V8X8__COV4R12V = 0x38,
ZF32_X16V8S8__COV4R12V = 0x39, ZF32_X16V8S8__COV4R12V = 0x39,
Z16 = 0x3a, D16 = 0x3a,
V8Z24__COV8R24V = 0x3b, V8Z24__COV8R24V = 0x3b,
X8Z24_X16V8S8__COV8R24V = 0x3c, X8Z24_X16V8S8__COV8R24V = 0x3c,
ZF32_X16V8X8__COV8R24V = 0x3d, ZF32_X16V8X8__COV8R24V = 0x3d,
@ -375,7 +375,4 @@ struct FullTextureInfo {
TSCEntry tsc; TSCEntry tsc;
}; };
/// Returns the number of bytes per pixel of the input texture format.
u32 BytesPerPixel(TextureFormat format);
} // namespace Tegra::Texture } // namespace Tegra::Texture