summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/video_core/compatible_formats.cpp87
-rw-r--r--src/video_core/gpu.h82
-rw-r--r--src/video_core/morton.cpp276
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp162
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp4
-rw-r--r--src/video_core/renderer_vulkan/maxwell_to_vk.cpp173
-rw-r--r--src/video_core/renderer_vulkan/vk_blit_screen.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_device.cpp9
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp10
-rw-r--r--src/video_core/shader/decode/image.cpp54
-rw-r--r--src/video_core/surface.cpp257
-rw-r--r--src/video_core/surface.h770
-rw-r--r--src/video_core/texture_cache/format_lookup_table.cpp147
-rw-r--r--src/video_core/texture_cache/surface_base.cpp2
-rw-r--r--src/video_core/texture_cache/surface_params.cpp18
-rw-r--r--src/video_core/texture_cache/texture_cache.h8
-rw-r--r--src/video_core/textures/convert.cpp6
-rw-r--r--src/video_core/textures/decoders.cpp89
-rw-r--r--src/video_core/textures/decoders.h4
-rw-r--r--src/video_core/textures/texture.h49
20 files changed, 1111 insertions, 1100 deletions
diff --git a/src/video_core/compatible_formats.cpp b/src/video_core/compatible_formats.cpp
index 6c426b035..b06c32c84 100644
--- a/src/video_core/compatible_formats.cpp
+++ b/src/video_core/compatible_formats.cpp
@@ -17,101 +17,94 @@ namespace {
17// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_view.txt 17// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_view.txt
18 18
19constexpr std::array VIEW_CLASS_128_BITS = { 19constexpr std::array VIEW_CLASS_128_BITS = {
20 PixelFormat::RGBA32F, 20 PixelFormat::R32G32B32A32_FLOAT,
21 PixelFormat::RGBA32UI, 21 PixelFormat::R32G32B32A32_UINT,
22 PixelFormat::R32G32B32A32_SINT,
22}; 23};
23// Missing formats:
24// PixelFormat::RGBA32I
25 24
26constexpr std::array VIEW_CLASS_96_BITS = { 25constexpr std::array VIEW_CLASS_96_BITS = {
27 PixelFormat::RGB32F, 26 PixelFormat::R32G32B32_FLOAT,
28}; 27};
29// Missing formats: 28// Missing formats:
30// PixelFormat::RGB32UI, 29// PixelFormat::RGB32UI,
31// PixelFormat::RGB32I, 30// PixelFormat::RGB32I,
32 31
33constexpr std::array VIEW_CLASS_64_BITS = { 32constexpr std::array VIEW_CLASS_64_BITS = {
34 PixelFormat::RGBA16F, PixelFormat::RG32F, PixelFormat::RGBA16UI, PixelFormat::RG32UI, 33 PixelFormat::R32G32_FLOAT, PixelFormat::R32G32_UINT,
35 PixelFormat::RGBA16U, PixelFormat::RGBA16F, PixelFormat::RGBA16S, 34 PixelFormat::R32G32_SINT, PixelFormat::R16G16B16A16_FLOAT,
35 PixelFormat::R16G16B16A16_UNORM, PixelFormat::R16G16B16A16_SNORM,
36 PixelFormat::R16G16B16A16_UINT, PixelFormat::R16G16B16A16_SINT,
36}; 37};
37// Missing formats:
38// PixelFormat::RGBA16I
39// PixelFormat::RG32I
40 38
41// TODO: How should we handle 48 bits? 39// TODO: How should we handle 48 bits?
42 40
43constexpr std::array VIEW_CLASS_32_BITS = { 41constexpr std::array VIEW_CLASS_32_BITS = {
44 PixelFormat::RG16F, PixelFormat::R11FG11FB10F, PixelFormat::R32F, 42 PixelFormat::R16G16_FLOAT, PixelFormat::B10G11R11_FLOAT, PixelFormat::R32_FLOAT,
45 PixelFormat::A2B10G10R10U, PixelFormat::RG16UI, PixelFormat::R32UI, 43 PixelFormat::A2B10G10R10_UNORM, PixelFormat::R16G16_UINT, PixelFormat::R32_UINT,
46 PixelFormat::RG16I, PixelFormat::R32I, PixelFormat::ABGR8U, 44 PixelFormat::R16G16_SINT, PixelFormat::R32_SINT, PixelFormat::A8B8G8R8_UNORM,
47 PixelFormat::RG16, PixelFormat::ABGR8S, PixelFormat::RG16S, 45 PixelFormat::R16G16_UNORM, PixelFormat::A8B8G8R8_SNORM, PixelFormat::R16G16_SNORM,
48 PixelFormat::RGBA8_SRGB, PixelFormat::E5B9G9R9F, PixelFormat::BGRA8, 46 PixelFormat::A8B8G8R8_SRGB, PixelFormat::E5B9G9R9_FLOAT, PixelFormat::B8G8R8A8_UNORM,
49 PixelFormat::BGRA8_SRGB, 47 PixelFormat::B8G8R8A8_SRGB, PixelFormat::A8B8G8R8_UINT, PixelFormat::A8B8G8R8_SINT,
48 PixelFormat::A2B10G10R10_UINT,
50}; 49};
51// Missing formats:
52// PixelFormat::RGBA8UI
53// PixelFormat::RGBA8I
54// PixelFormat::RGB10_A2_UI
55 50
56// TODO: How should we handle 24 bits? 51// TODO: How should we handle 24 bits?
57 52
58constexpr std::array VIEW_CLASS_16_BITS = { 53constexpr std::array VIEW_CLASS_16_BITS = {
59 PixelFormat::R16F, PixelFormat::RG8UI, PixelFormat::R16UI, PixelFormat::R16I, 54 PixelFormat::R16_FLOAT, PixelFormat::R8G8_UINT, PixelFormat::R16_UINT,
60 PixelFormat::RG8U, PixelFormat::R16U, PixelFormat::RG8S, PixelFormat::R16S, 55 PixelFormat::R16_SINT, PixelFormat::R8G8_UNORM, PixelFormat::R16_UNORM,
56 PixelFormat::R8G8_SNORM, PixelFormat::R16_SNORM, PixelFormat::R8G8_SINT,
61}; 57};
62// Missing formats:
63// PixelFormat::RG8I
64 58
65constexpr std::array VIEW_CLASS_8_BITS = { 59constexpr std::array VIEW_CLASS_8_BITS = {
66 PixelFormat::R8UI, 60 PixelFormat::R8_UINT,
67 PixelFormat::R8U, 61 PixelFormat::R8_UNORM,
62 PixelFormat::R8_SINT,
63 PixelFormat::R8_SNORM,
68}; 64};
69// Missing formats:
70// PixelFormat::R8I
71// PixelFormat::R8S
72 65
73constexpr std::array VIEW_CLASS_RGTC1_RED = { 66constexpr std::array VIEW_CLASS_RGTC1_RED = {
74 PixelFormat::DXN1, 67 PixelFormat::BC4_UNORM,
68 PixelFormat::BC4_SNORM,
75}; 69};
76// Missing formats:
77// COMPRESSED_SIGNED_RED_RGTC1
78 70
79constexpr std::array VIEW_CLASS_RGTC2_RG = { 71constexpr std::array VIEW_CLASS_RGTC2_RG = {
80 PixelFormat::DXN2UNORM, 72 PixelFormat::BC5_UNORM,
81 PixelFormat::DXN2SNORM, 73 PixelFormat::BC5_SNORM,
82}; 74};
83 75
84constexpr std::array VIEW_CLASS_BPTC_UNORM = { 76constexpr std::array VIEW_CLASS_BPTC_UNORM = {
85 PixelFormat::BC7U, 77 PixelFormat::BC7_UNORM,
86 PixelFormat::BC7U_SRGB, 78 PixelFormat::BC7_SRGB,
87}; 79};
88 80
89constexpr std::array VIEW_CLASS_BPTC_FLOAT = { 81constexpr std::array VIEW_CLASS_BPTC_FLOAT = {
90 PixelFormat::BC6H_SF16, 82 PixelFormat::BC6H_SFLOAT,
91 PixelFormat::BC6H_UF16, 83 PixelFormat::BC6H_UFLOAT,
92}; 84};
93 85
94// Compatibility table taken from Table 4.X.1 in: 86// Compatibility table taken from Table 4.X.1 in:
95// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_copy_image.txt 87// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_copy_image.txt
96 88
97constexpr std::array COPY_CLASS_128_BITS = { 89constexpr std::array COPY_CLASS_128_BITS = {
98 PixelFormat::RGBA32UI, PixelFormat::RGBA32F, PixelFormat::DXT23, 90 PixelFormat::R32G32B32A32_UINT, PixelFormat::R32G32B32A32_FLOAT, PixelFormat::R32G32B32A32_SINT,
99 PixelFormat::DXT23_SRGB, PixelFormat::DXT45, PixelFormat::DXT45_SRGB, 91 PixelFormat::BC2_UNORM, PixelFormat::BC2_SRGB, PixelFormat::BC3_UNORM,
100 PixelFormat::DXN2SNORM, PixelFormat::BC7U, PixelFormat::BC7U_SRGB, 92 PixelFormat::BC3_SRGB, PixelFormat::BC5_UNORM, PixelFormat::BC5_SNORM,
101 PixelFormat::BC6H_SF16, PixelFormat::BC6H_UF16, 93 PixelFormat::BC7_UNORM, PixelFormat::BC7_SRGB, PixelFormat::BC6H_SFLOAT,
94 PixelFormat::BC6H_UFLOAT,
102}; 95};
103// Missing formats: 96// Missing formats:
104// PixelFormat::RGBA32I 97// PixelFormat::RGBA32I
105// COMPRESSED_RG_RGTC2 98// COMPRESSED_RG_RGTC2
106 99
107constexpr std::array COPY_CLASS_64_BITS = { 100constexpr std::array COPY_CLASS_64_BITS = {
108 PixelFormat::RGBA16F, PixelFormat::RG32F, PixelFormat::RGBA16UI, PixelFormat::RG32UI, 101 PixelFormat::R16G16B16A16_FLOAT, PixelFormat::R16G16B16A16_UINT,
109 PixelFormat::RGBA16U, PixelFormat::RGBA16S, PixelFormat::DXT1_SRGB, PixelFormat::DXT1, 102 PixelFormat::R16G16B16A16_UNORM, PixelFormat::R16G16B16A16_SNORM,
110 103 PixelFormat::R16G16B16A16_SINT, PixelFormat::R32G32_UINT,
104 PixelFormat::R32G32_FLOAT, PixelFormat::R32G32_SINT,
105 PixelFormat::BC1_RGBA_UNORM, PixelFormat::BC1_RGBA_SRGB,
111}; 106};
112// Missing formats: 107// Missing formats:
113// PixelFormat::RGBA16I
114// PixelFormat::RG32I,
115// COMPRESSED_RGB_S3TC_DXT1_EXT 108// COMPRESSED_RGB_S3TC_DXT1_EXT
116// COMPRESSED_SRGB_S3TC_DXT1_EXT 109// COMPRESSED_SRGB_S3TC_DXT1_EXT
117// COMPRESSED_RGBA_S3TC_DXT1_EXT 110// COMPRESSED_RGBA_S3TC_DXT1_EXT
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index 8d04d9fd9..19a34c402 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -40,53 +40,61 @@ namespace Tegra {
40 40
41enum class RenderTargetFormat : u32 { 41enum class RenderTargetFormat : u32 {
42 NONE = 0x0, 42 NONE = 0x0,
43 RGBA32_FLOAT = 0xC0, 43 R32B32G32A32_FLOAT = 0xC0,
44 RGBA32_UINT = 0xC2, 44 R32G32B32A32_SINT = 0xC1,
45 RGBA16_UNORM = 0xC6, 45 R32G32B32A32_UINT = 0xC2,
46 RGBA16_SNORM = 0xC7, 46 R16G16B16A16_UNORM = 0xC6,
47 RGBA16_UINT = 0xC9, 47 R16G16B16A16_SNORM = 0xC7,
48 RGBA16_FLOAT = 0xCA, 48 R16G16B16A16_SINT = 0xC8,
49 RG32_FLOAT = 0xCB, 49 R16G16B16A16_UINT = 0xC9,
50 RG32_UINT = 0xCD, 50 R16G16B16A16_FLOAT = 0xCA,
51 RGBX16_FLOAT = 0xCE, 51 R32G32_FLOAT = 0xCB,
52 BGRA8_UNORM = 0xCF, 52 R32G32_SINT = 0xCC,
53 BGRA8_SRGB = 0xD0, 53 R32G32_UINT = 0xCD,
54 RGB10_A2_UNORM = 0xD1, 54 R16G16B16X16_FLOAT = 0xCE,
55 RGBA8_UNORM = 0xD5, 55 B8G8R8A8_UNORM = 0xCF,
56 RGBA8_SRGB = 0xD6, 56 B8G8R8A8_SRGB = 0xD0,
57 RGBA8_SNORM = 0xD7, 57 A2B10G10R10_UNORM = 0xD1,
58 RGBA8_UINT = 0xD9, 58 A2B10G10R10_UINT = 0xD2,
59 RG16_UNORM = 0xDA, 59 A8B8G8R8_UNORM = 0xD5,
60 RG16_SNORM = 0xDB, 60 A8B8G8R8_SRGB = 0xD6,
61 RG16_SINT = 0xDC, 61 A8B8G8R8_SNORM = 0xD7,
62 RG16_UINT = 0xDD, 62 A8B8G8R8_SINT = 0xD8,
63 RG16_FLOAT = 0xDE, 63 A8B8G8R8_UINT = 0xD9,
64 R11G11B10_FLOAT = 0xE0, 64 R16G16_UNORM = 0xDA,
65 R16G16_SNORM = 0xDB,
66 R16G16_SINT = 0xDC,
67 R16G16_UINT = 0xDD,
68 R16G16_FLOAT = 0xDE,
69 B10G11R11_FLOAT = 0xE0,
65 R32_SINT = 0xE3, 70 R32_SINT = 0xE3,
66 R32_UINT = 0xE4, 71 R32_UINT = 0xE4,
67 R32_FLOAT = 0xE5, 72 R32_FLOAT = 0xE5,
68 B5G6R5_UNORM = 0xE8, 73 R5G6B5_UNORM = 0xE8,
69 BGR5A1_UNORM = 0xE9, 74 A1R5G5B5_UNORM = 0xE9,
70 RG8_UNORM = 0xEA, 75 R8G8_UNORM = 0xEA,
71 RG8_SNORM = 0xEB, 76 R8G8_SNORM = 0xEB,
72 RG8_UINT = 0xED, 77 R8G8_SINT = 0xEC,
78 R8G8_UINT = 0xED,
73 R16_UNORM = 0xEE, 79 R16_UNORM = 0xEE,
74 R16_SNORM = 0xEF, 80 R16_SNORM = 0xEF,
75 R16_SINT = 0xF0, 81 R16_SINT = 0xF0,
76 R16_UINT = 0xF1, 82 R16_UINT = 0xF1,
77 R16_FLOAT = 0xF2, 83 R16_FLOAT = 0xF2,
78 R8_UNORM = 0xF3, 84 R8_UNORM = 0xF3,
85 R8_SNORM = 0xF4,
86 R8_SINT = 0xF5,
79 R8_UINT = 0xF6, 87 R8_UINT = 0xF6,
80}; 88};
81 89
82enum class DepthFormat : u32 { 90enum class DepthFormat : u32 {
83 Z32_FLOAT = 0xA, 91 D32_FLOAT = 0xA,
84 Z16_UNORM = 0x13, 92 D16_UNORM = 0x13,
85 S8_Z24_UNORM = 0x14, 93 S8_UINT_Z24_UNORM = 0x14,
86 Z24_X8_UNORM = 0x15, 94 D24X8_UNORM = 0x15,
87 Z24_S8_UNORM = 0x16, 95 D24S8_UNORM = 0x16,
88 Z24_C8_UNORM = 0x18, 96 D24C8_UNORM = 0x18,
89 Z32_S8_X24_FLOAT = 0x19, 97 D32_FLOAT_S8X24_UINT = 0x19,
90}; 98};
91 99
92struct CommandListHeader; 100struct CommandListHeader;
@@ -97,9 +105,9 @@ class DebugContext;
97 */ 105 */
98struct FramebufferConfig { 106struct FramebufferConfig {
99 enum class PixelFormat : u32 { 107 enum class PixelFormat : u32 {
100 ABGR8 = 1, 108 A8B8G8R8_UNORM = 1,
101 RGB565 = 4, 109 RGB565_UNORM = 4,
102 BGRA8 = 5, 110 B8G8R8A8_UNORM = 5,
103 }; 111 };
104 112
105 VAddr address; 113 VAddr address;
diff --git a/src/video_core/morton.cpp b/src/video_core/morton.cpp
index 836b25c1d..9da9fb4ff 100644
--- a/src/video_core/morton.cpp
+++ b/src/video_core/morton.cpp
@@ -41,146 +41,168 @@ static void MortonCopy(u32 stride, u32 block_height, u32 height, u32 block_depth
41} 41}
42 42
43static constexpr ConversionArray morton_to_linear_fns = { 43static constexpr ConversionArray morton_to_linear_fns = {
44 MortonCopy<true, PixelFormat::ABGR8U>, 44 MortonCopy<true, PixelFormat::A8B8G8R8_UNORM>,
45 MortonCopy<true, PixelFormat::ABGR8S>, 45 MortonCopy<true, PixelFormat::A8B8G8R8_SNORM>,
46 MortonCopy<true, PixelFormat::ABGR8UI>, 46 MortonCopy<true, PixelFormat::A8B8G8R8_SINT>,
47 MortonCopy<true, PixelFormat::B5G6R5U>, 47 MortonCopy<true, PixelFormat::A8B8G8R8_UINT>,
48 MortonCopy<true, PixelFormat::A2B10G10R10U>, 48 MortonCopy<true, PixelFormat::R5G6B5_UNORM>,
49 MortonCopy<true, PixelFormat::A1B5G5R5U>, 49 MortonCopy<true, PixelFormat::B5G6R5_UNORM>,
50 MortonCopy<true, PixelFormat::R8U>, 50 MortonCopy<true, PixelFormat::A1R5G5B5_UNORM>,
51 MortonCopy<true, PixelFormat::R8UI>, 51 MortonCopy<true, PixelFormat::A2B10G10R10_UNORM>,
52 MortonCopy<true, PixelFormat::RGBA16F>, 52 MortonCopy<true, PixelFormat::A2B10G10R10_UINT>,
53 MortonCopy<true, PixelFormat::RGBA16U>, 53 MortonCopy<true, PixelFormat::A1B5G5R5_UNORM>,
54 MortonCopy<true, PixelFormat::RGBA16S>, 54 MortonCopy<true, PixelFormat::R8_UNORM>,
55 MortonCopy<true, PixelFormat::RGBA16UI>, 55 MortonCopy<true, PixelFormat::R8_SNORM>,
56 MortonCopy<true, PixelFormat::R11FG11FB10F>, 56 MortonCopy<true, PixelFormat::R8_SINT>,
57 MortonCopy<true, PixelFormat::RGBA32UI>, 57 MortonCopy<true, PixelFormat::R8_UINT>,
58 MortonCopy<true, PixelFormat::DXT1>, 58 MortonCopy<true, PixelFormat::R16G16B16A16_FLOAT>,
59 MortonCopy<true, PixelFormat::DXT23>, 59 MortonCopy<true, PixelFormat::R16G16B16A16_UNORM>,
60 MortonCopy<true, PixelFormat::DXT45>, 60 MortonCopy<true, PixelFormat::R16G16B16A16_SNORM>,
61 MortonCopy<true, PixelFormat::DXN1>, 61 MortonCopy<true, PixelFormat::R16G16B16A16_SINT>,
62 MortonCopy<true, PixelFormat::DXN2UNORM>, 62 MortonCopy<true, PixelFormat::R16G16B16A16_UINT>,
63 MortonCopy<true, PixelFormat::DXN2SNORM>, 63 MortonCopy<true, PixelFormat::B10G11R11_FLOAT>,
64 MortonCopy<true, PixelFormat::BC7U>, 64 MortonCopy<true, PixelFormat::R32G32B32A32_UINT>,
65 MortonCopy<true, PixelFormat::BC6H_UF16>, 65 MortonCopy<true, PixelFormat::BC1_RGBA_UNORM>,
66 MortonCopy<true, PixelFormat::BC6H_SF16>, 66 MortonCopy<true, PixelFormat::BC2_UNORM>,
67 MortonCopy<true, PixelFormat::ASTC_2D_4X4>, 67 MortonCopy<true, PixelFormat::BC3_UNORM>,
68 MortonCopy<true, PixelFormat::BGRA8>, 68 MortonCopy<true, PixelFormat::BC4_UNORM>,
69 MortonCopy<true, PixelFormat::RGBA32F>, 69 MortonCopy<true, PixelFormat::BC4_SNORM>,
70 MortonCopy<true, PixelFormat::RG32F>, 70 MortonCopy<true, PixelFormat::BC5_UNORM>,
71 MortonCopy<true, PixelFormat::R32F>, 71 MortonCopy<true, PixelFormat::BC5_SNORM>,
72 MortonCopy<true, PixelFormat::R16F>, 72 MortonCopy<true, PixelFormat::BC7_UNORM>,
73 MortonCopy<true, PixelFormat::R16U>, 73 MortonCopy<true, PixelFormat::BC6H_UFLOAT>,
74 MortonCopy<true, PixelFormat::R16S>, 74 MortonCopy<true, PixelFormat::BC6H_SFLOAT>,
75 MortonCopy<true, PixelFormat::R16UI>, 75 MortonCopy<true, PixelFormat::ASTC_2D_4X4_UNORM>,
76 MortonCopy<true, PixelFormat::R16I>, 76 MortonCopy<true, PixelFormat::B8G8R8A8_UNORM>,
77 MortonCopy<true, PixelFormat::RG16>, 77 MortonCopy<true, PixelFormat::R32G32B32A32_FLOAT>,
78 MortonCopy<true, PixelFormat::RG16F>, 78 MortonCopy<true, PixelFormat::R32G32B32A32_SINT>,
79 MortonCopy<true, PixelFormat::RG16UI>, 79 MortonCopy<true, PixelFormat::R32G32_FLOAT>,
80 MortonCopy<true, PixelFormat::RG16I>, 80 MortonCopy<true, PixelFormat::R32G32_SINT>,
81 MortonCopy<true, PixelFormat::RG16S>, 81 MortonCopy<true, PixelFormat::R32_FLOAT>,
82 MortonCopy<true, PixelFormat::RGB32F>, 82 MortonCopy<true, PixelFormat::R16_FLOAT>,
83 MortonCopy<true, PixelFormat::RGBA8_SRGB>, 83 MortonCopy<true, PixelFormat::R16_UNORM>,
84 MortonCopy<true, PixelFormat::RG8U>, 84 MortonCopy<true, PixelFormat::R16_SNORM>,
85 MortonCopy<true, PixelFormat::RG8S>, 85 MortonCopy<true, PixelFormat::R16_UINT>,
86 MortonCopy<true, PixelFormat::RG8UI>, 86 MortonCopy<true, PixelFormat::R16_SINT>,
87 MortonCopy<true, PixelFormat::RG32UI>, 87 MortonCopy<true, PixelFormat::R16G16_UNORM>,
88 MortonCopy<true, PixelFormat::RGBX16F>, 88 MortonCopy<true, PixelFormat::R16G16_FLOAT>,
89 MortonCopy<true, PixelFormat::R32UI>, 89 MortonCopy<true, PixelFormat::R16G16_UINT>,
90 MortonCopy<true, PixelFormat::R32I>, 90 MortonCopy<true, PixelFormat::R16G16_SINT>,
91 MortonCopy<true, PixelFormat::ASTC_2D_8X8>, 91 MortonCopy<true, PixelFormat::R16G16_SNORM>,
92 MortonCopy<true, PixelFormat::ASTC_2D_8X5>, 92 MortonCopy<true, PixelFormat::R32G32B32_FLOAT>,
93 MortonCopy<true, PixelFormat::ASTC_2D_5X4>, 93 MortonCopy<true, PixelFormat::A8B8G8R8_SRGB>,
94 MortonCopy<true, PixelFormat::BGRA8_SRGB>, 94 MortonCopy<true, PixelFormat::R8G8_UNORM>,
95 MortonCopy<true, PixelFormat::DXT1_SRGB>, 95 MortonCopy<true, PixelFormat::R8G8_SNORM>,
96 MortonCopy<true, PixelFormat::DXT23_SRGB>, 96 MortonCopy<true, PixelFormat::R8G8_SINT>,
97 MortonCopy<true, PixelFormat::DXT45_SRGB>, 97 MortonCopy<true, PixelFormat::R8G8_UINT>,
98 MortonCopy<true, PixelFormat::BC7U_SRGB>, 98 MortonCopy<true, PixelFormat::R32G32_UINT>,
99 MortonCopy<true, PixelFormat::R4G4B4A4U>, 99 MortonCopy<true, PixelFormat::R16G16B16X16_FLOAT>,
100 MortonCopy<true, PixelFormat::R32_UINT>,
101 MortonCopy<true, PixelFormat::R32_SINT>,
102 MortonCopy<true, PixelFormat::ASTC_2D_8X8_UNORM>,
103 MortonCopy<true, PixelFormat::ASTC_2D_8X5_UNORM>,
104 MortonCopy<true, PixelFormat::ASTC_2D_5X4_UNORM>,
105 MortonCopy<true, PixelFormat::B8G8R8A8_SRGB>,
106 MortonCopy<true, PixelFormat::BC1_RGBA_SRGB>,
107 MortonCopy<true, PixelFormat::BC2_SRGB>,
108 MortonCopy<true, PixelFormat::BC3_SRGB>,
109 MortonCopy<true, PixelFormat::BC7_SRGB>,
110 MortonCopy<true, PixelFormat::A4B4G4R4_UNORM>,
100 MortonCopy<true, PixelFormat::ASTC_2D_4X4_SRGB>, 111 MortonCopy<true, PixelFormat::ASTC_2D_4X4_SRGB>,
101 MortonCopy<true, PixelFormat::ASTC_2D_8X8_SRGB>, 112 MortonCopy<true, PixelFormat::ASTC_2D_8X8_SRGB>,
102 MortonCopy<true, PixelFormat::ASTC_2D_8X5_SRGB>, 113 MortonCopy<true, PixelFormat::ASTC_2D_8X5_SRGB>,
103 MortonCopy<true, PixelFormat::ASTC_2D_5X4_SRGB>, 114 MortonCopy<true, PixelFormat::ASTC_2D_5X4_SRGB>,
104 MortonCopy<true, PixelFormat::ASTC_2D_5X5>, 115 MortonCopy<true, PixelFormat::ASTC_2D_5X5_UNORM>,
105 MortonCopy<true, PixelFormat::ASTC_2D_5X5_SRGB>, 116 MortonCopy<true, PixelFormat::ASTC_2D_5X5_SRGB>,
106 MortonCopy<true, PixelFormat::ASTC_2D_10X8>, 117 MortonCopy<true, PixelFormat::ASTC_2D_10X8_UNORM>,
107 MortonCopy<true, PixelFormat::ASTC_2D_10X8_SRGB>, 118 MortonCopy<true, PixelFormat::ASTC_2D_10X8_SRGB>,
108 MortonCopy<true, PixelFormat::ASTC_2D_6X6>, 119 MortonCopy<true, PixelFormat::ASTC_2D_6X6_UNORM>,
109 MortonCopy<true, PixelFormat::ASTC_2D_6X6_SRGB>, 120 MortonCopy<true, PixelFormat::ASTC_2D_6X6_SRGB>,
110 MortonCopy<true, PixelFormat::ASTC_2D_10X10>, 121 MortonCopy<true, PixelFormat::ASTC_2D_10X10_UNORM>,
111 MortonCopy<true, PixelFormat::ASTC_2D_10X10_SRGB>, 122 MortonCopy<true, PixelFormat::ASTC_2D_10X10_SRGB>,
112 MortonCopy<true, PixelFormat::ASTC_2D_12X12>, 123 MortonCopy<true, PixelFormat::ASTC_2D_12X12_UNORM>,
113 MortonCopy<true, PixelFormat::ASTC_2D_12X12_SRGB>, 124 MortonCopy<true, PixelFormat::ASTC_2D_12X12_SRGB>,
114 MortonCopy<true, PixelFormat::ASTC_2D_8X6>, 125 MortonCopy<true, PixelFormat::ASTC_2D_8X6_UNORM>,
115 MortonCopy<true, PixelFormat::ASTC_2D_8X6_SRGB>, 126 MortonCopy<true, PixelFormat::ASTC_2D_8X6_SRGB>,
116 MortonCopy<true, PixelFormat::ASTC_2D_6X5>, 127 MortonCopy<true, PixelFormat::ASTC_2D_6X5_UNORM>,
117 MortonCopy<true, PixelFormat::ASTC_2D_6X5_SRGB>, 128 MortonCopy<true, PixelFormat::ASTC_2D_6X5_SRGB>,
118 MortonCopy<true, PixelFormat::E5B9G9R9F>, 129 MortonCopy<true, PixelFormat::E5B9G9R9_FLOAT>,
119 MortonCopy<true, PixelFormat::Z32F>, 130 MortonCopy<true, PixelFormat::D32_FLOAT>,
120 MortonCopy<true, PixelFormat::Z16>, 131 MortonCopy<true, PixelFormat::D16_UNORM>,
121 MortonCopy<true, PixelFormat::Z24S8>, 132 MortonCopy<true, PixelFormat::D24_UNORM_S8_UINT>,
122 MortonCopy<true, PixelFormat::S8Z24>, 133 MortonCopy<true, PixelFormat::S8_UINT_D24_UNORM>,
123 MortonCopy<true, PixelFormat::Z32FS8>, 134 MortonCopy<true, PixelFormat::D32_FLOAT_S8_UINT>,
124}; 135};
125 136
126static constexpr ConversionArray linear_to_morton_fns = { 137static constexpr ConversionArray linear_to_morton_fns = {
127 MortonCopy<false, PixelFormat::ABGR8U>, 138 MortonCopy<false, PixelFormat::A8B8G8R8_UNORM>,
128 MortonCopy<false, PixelFormat::ABGR8S>, 139 MortonCopy<false, PixelFormat::A8B8G8R8_SNORM>,
129 MortonCopy<false, PixelFormat::ABGR8UI>, 140 MortonCopy<false, PixelFormat::A8B8G8R8_SINT>,
130 MortonCopy<false, PixelFormat::B5G6R5U>, 141 MortonCopy<false, PixelFormat::A8B8G8R8_UINT>,
131 MortonCopy<false, PixelFormat::A2B10G10R10U>, 142 MortonCopy<false, PixelFormat::R5G6B5_UNORM>,
132 MortonCopy<false, PixelFormat::A1B5G5R5U>, 143 MortonCopy<false, PixelFormat::B5G6R5_UNORM>,
133 MortonCopy<false, PixelFormat::R8U>, 144 MortonCopy<false, PixelFormat::A1R5G5B5_UNORM>,
134 MortonCopy<false, PixelFormat::R8UI>, 145 MortonCopy<false, PixelFormat::A2B10G10R10_UNORM>,
135 MortonCopy<false, PixelFormat::RGBA16F>, 146 MortonCopy<false, PixelFormat::A2B10G10R10_UINT>,
136 MortonCopy<false, PixelFormat::RGBA16S>, 147 MortonCopy<false, PixelFormat::A1B5G5R5_UNORM>,
137 MortonCopy<false, PixelFormat::RGBA16U>, 148 MortonCopy<false, PixelFormat::R8_UNORM>,
138 MortonCopy<false, PixelFormat::RGBA16UI>, 149 MortonCopy<false, PixelFormat::R8_SNORM>,
139 MortonCopy<false, PixelFormat::R11FG11FB10F>, 150 MortonCopy<false, PixelFormat::R8_SINT>,
140 MortonCopy<false, PixelFormat::RGBA32UI>, 151 MortonCopy<false, PixelFormat::R8_UINT>,
141 MortonCopy<false, PixelFormat::DXT1>, 152 MortonCopy<false, PixelFormat::R16G16B16A16_FLOAT>,
142 MortonCopy<false, PixelFormat::DXT23>, 153 MortonCopy<false, PixelFormat::R16G16B16A16_SNORM>,
143 MortonCopy<false, PixelFormat::DXT45>, 154 MortonCopy<false, PixelFormat::R16G16B16A16_SINT>,
144 MortonCopy<false, PixelFormat::DXN1>, 155 MortonCopy<false, PixelFormat::R16G16B16A16_UNORM>,
145 MortonCopy<false, PixelFormat::DXN2UNORM>, 156 MortonCopy<false, PixelFormat::R16G16B16A16_UINT>,
146 MortonCopy<false, PixelFormat::DXN2SNORM>, 157 MortonCopy<false, PixelFormat::B10G11R11_FLOAT>,
147 MortonCopy<false, PixelFormat::BC7U>, 158 MortonCopy<false, PixelFormat::R32G32B32A32_UINT>,
148 MortonCopy<false, PixelFormat::BC6H_UF16>, 159 MortonCopy<false, PixelFormat::BC1_RGBA_UNORM>,
149 MortonCopy<false, PixelFormat::BC6H_SF16>, 160 MortonCopy<false, PixelFormat::BC2_UNORM>,
161 MortonCopy<false, PixelFormat::BC3_UNORM>,
162 MortonCopy<false, PixelFormat::BC4_UNORM>,
163 MortonCopy<false, PixelFormat::BC4_SNORM>,
164 MortonCopy<false, PixelFormat::BC5_UNORM>,
165 MortonCopy<false, PixelFormat::BC5_SNORM>,
166 MortonCopy<false, PixelFormat::BC7_UNORM>,
167 MortonCopy<false, PixelFormat::BC6H_UFLOAT>,
168 MortonCopy<false, PixelFormat::BC6H_SFLOAT>,
150 // TODO(Subv): Swizzling ASTC formats are not supported 169 // TODO(Subv): Swizzling ASTC formats are not supported
151 nullptr, 170 nullptr,
152 MortonCopy<false, PixelFormat::BGRA8>, 171 MortonCopy<false, PixelFormat::B8G8R8A8_UNORM>,
153 MortonCopy<false, PixelFormat::RGBA32F>, 172 MortonCopy<false, PixelFormat::R32G32B32A32_FLOAT>,
154 MortonCopy<false, PixelFormat::RG32F>, 173 MortonCopy<false, PixelFormat::R32G32B32A32_SINT>,
155 MortonCopy<false, PixelFormat::R32F>, 174 MortonCopy<false, PixelFormat::R32G32_FLOAT>,
156 MortonCopy<false, PixelFormat::R16F>, 175 MortonCopy<false, PixelFormat::R32G32_SINT>,
157 MortonCopy<false, PixelFormat::R16U>, 176 MortonCopy<false, PixelFormat::R32_FLOAT>,
158 MortonCopy<false, PixelFormat::R16S>, 177 MortonCopy<false, PixelFormat::R16_FLOAT>,
159 MortonCopy<false, PixelFormat::R16UI>, 178 MortonCopy<false, PixelFormat::R16_UNORM>,
160 MortonCopy<false, PixelFormat::R16I>, 179 MortonCopy<false, PixelFormat::R16_SNORM>,
161 MortonCopy<false, PixelFormat::RG16>, 180 MortonCopy<false, PixelFormat::R16_UINT>,
162 MortonCopy<false, PixelFormat::RG16F>, 181 MortonCopy<false, PixelFormat::R16_SINT>,
163 MortonCopy<false, PixelFormat::RG16UI>, 182 MortonCopy<false, PixelFormat::R16G16_UNORM>,
164 MortonCopy<false, PixelFormat::RG16I>, 183 MortonCopy<false, PixelFormat::R16G16_FLOAT>,
165 MortonCopy<false, PixelFormat::RG16S>, 184 MortonCopy<false, PixelFormat::R16G16_UINT>,
166 MortonCopy<false, PixelFormat::RGB32F>, 185 MortonCopy<false, PixelFormat::R16G16_SINT>,
167 MortonCopy<false, PixelFormat::RGBA8_SRGB>, 186 MortonCopy<false, PixelFormat::R16G16_SNORM>,
168 MortonCopy<false, PixelFormat::RG8U>, 187 MortonCopy<false, PixelFormat::R32G32B32_FLOAT>,
169 MortonCopy<false, PixelFormat::RG8S>, 188 MortonCopy<false, PixelFormat::A8B8G8R8_SRGB>,
170 MortonCopy<false, PixelFormat::RG8UI>, 189 MortonCopy<false, PixelFormat::R8G8_UNORM>,
171 MortonCopy<false, PixelFormat::RG32UI>, 190 MortonCopy<false, PixelFormat::R8G8_SNORM>,
172 MortonCopy<false, PixelFormat::RGBX16F>, 191 MortonCopy<false, PixelFormat::R8G8_SINT>,
173 MortonCopy<false, PixelFormat::R32UI>, 192 MortonCopy<false, PixelFormat::R8G8_UINT>,
174 MortonCopy<false, PixelFormat::R32I>, 193 MortonCopy<false, PixelFormat::R32G32_UINT>,
194 MortonCopy<false, PixelFormat::R16G16B16X16_FLOAT>,
195 MortonCopy<false, PixelFormat::R32_UINT>,
196 MortonCopy<false, PixelFormat::R32_SINT>,
175 nullptr, 197 nullptr,
176 nullptr, 198 nullptr,
177 nullptr, 199 nullptr,
178 MortonCopy<false, PixelFormat::BGRA8_SRGB>, 200 MortonCopy<false, PixelFormat::B8G8R8A8_SRGB>,
179 MortonCopy<false, PixelFormat::DXT1_SRGB>, 201 MortonCopy<false, PixelFormat::BC1_RGBA_SRGB>,
180 MortonCopy<false, PixelFormat::DXT23_SRGB>, 202 MortonCopy<false, PixelFormat::BC2_SRGB>,
181 MortonCopy<false, PixelFormat::DXT45_SRGB>, 203 MortonCopy<false, PixelFormat::BC3_SRGB>,
182 MortonCopy<false, PixelFormat::BC7U_SRGB>, 204 MortonCopy<false, PixelFormat::BC7_SRGB>,
183 MortonCopy<false, PixelFormat::R4G4B4A4U>, 205 MortonCopy<false, PixelFormat::A4B4G4R4_UNORM>,
184 nullptr, 206 nullptr,
185 nullptr, 207 nullptr,
186 nullptr, 208 nullptr,
@@ -199,12 +221,12 @@ static constexpr ConversionArray linear_to_morton_fns = {
199 nullptr, 221 nullptr,
200 nullptr, 222 nullptr,
201 nullptr, 223 nullptr,
202 MortonCopy<false, PixelFormat::E5B9G9R9F>, 224 MortonCopy<false, PixelFormat::E5B9G9R9_FLOAT>,
203 MortonCopy<false, PixelFormat::Z32F>, 225 MortonCopy<false, PixelFormat::D32_FLOAT>,
204 MortonCopy<false, PixelFormat::Z16>, 226 MortonCopy<false, PixelFormat::D16_UNORM>,
205 MortonCopy<false, PixelFormat::Z24S8>, 227 MortonCopy<false, PixelFormat::D24_UNORM_S8_UINT>,
206 MortonCopy<false, PixelFormat::S8Z24>, 228 MortonCopy<false, PixelFormat::S8_UINT_D24_UNORM>,
207 MortonCopy<false, PixelFormat::Z32FS8>, 229 MortonCopy<false, PixelFormat::D32_FLOAT_S8_UINT>,
208}; 230};
209 231
210static MortonCopyFn GetSwizzleFunction(MortonSwizzleMode mode, Surface::PixelFormat format) { 232static MortonCopyFn GetSwizzleFunction(MortonSwizzleMode mode, Surface::PixelFormat format) {
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index 61505879b..0a7bc9e2b 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -41,91 +41,103 @@ struct FormatTuple {
41}; 41};
42 42
43constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> tex_format_tuples = {{ 43constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> tex_format_tuples = {{
44 {GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // ABGR8U 44 {GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // A8B8G8R8_UNORM
45 {GL_RGBA8_SNORM, GL_RGBA, GL_BYTE}, // ABGR8S 45 {GL_RGBA8_SNORM, GL_RGBA, GL_BYTE}, // A8B8G8R8_SNORM
46 {GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE}, // ABGR8UI 46 {GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE}, // A8B8G8R8_SINT
47 {GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV}, // B5G6R5U 47 {GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE}, // A8B8G8R8_UINT
48 {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10U 48 {GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5}, // R5G6B5_UNORM
49 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5U 49 {GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV}, // B5G6R5_UNORM
50 {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8U 50 {GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1R5G5B5_UNORM
51 {GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE}, // R8UI 51 {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM
52 {GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT}, // RGBA16F 52 {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT
53 {GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT}, // RGBA16U 53 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM
54 {GL_RGBA16_SNORM, GL_RGBA, GL_SHORT}, // RGBA16S 54 {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM
55 {GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT}, // RGBA16UI 55 {GL_R8_SNORM, GL_RED, GL_BYTE}, // R8_SNORM
56 {GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV}, // R11FG11FB10F 56 {GL_R8I, GL_RED_INTEGER, GL_BYTE}, // R8_SINT
57 {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT}, // RGBA32UI 57 {GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE}, // R8_UINT
58 {GL_COMPRESSED_RGBA_S3TC_DXT1_EXT}, // DXT1 58 {GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT}, // R16G16B16A16_FLOAT
59 {GL_COMPRESSED_RGBA_S3TC_DXT3_EXT}, // DXT23 59 {GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT}, // R16G16B16A16_UNORM
60 {GL_COMPRESSED_RGBA_S3TC_DXT5_EXT}, // DXT45 60 {GL_RGBA16_SNORM, GL_RGBA, GL_SHORT}, // R16G16B16A16_SNORM
61 {GL_COMPRESSED_RED_RGTC1}, // DXN1 61 {GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT}, // R16G16B16A16_SINT
62 {GL_COMPRESSED_RG_RGTC2}, // DXN2UNORM 62 {GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT}, // R16G16B16A16_UINT
63 {GL_COMPRESSED_SIGNED_RG_RGTC2}, // DXN2SNORM 63 {GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV}, // B10G11R11_FLOAT
64 {GL_COMPRESSED_RGBA_BPTC_UNORM}, // BC7U 64 {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT}, // R32G32B32A32_UINT
65 {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}, // BC6H_UF16 65 {GL_COMPRESSED_RGBA_S3TC_DXT1_EXT}, // BC1_RGBA_UNORM
66 {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT}, // BC6H_SF16 66 {GL_COMPRESSED_RGBA_S3TC_DXT3_EXT}, // BC2_UNORM
67 {GL_COMPRESSED_RGBA_ASTC_4x4_KHR}, // ASTC_2D_4X4 67 {GL_COMPRESSED_RGBA_S3TC_DXT5_EXT}, // BC3_UNORM
68 {GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE}, // BGRA8 68 {GL_COMPRESSED_RED_RGTC1}, // BC4_UNORM
69 {GL_RGBA32F, GL_RGBA, GL_FLOAT}, // RGBA32F 69 {GL_COMPRESSED_SIGNED_RED_RGTC1}, // BC4_SNORM
70 {GL_RG32F, GL_RG, GL_FLOAT}, // RG32F 70 {GL_COMPRESSED_RG_RGTC2}, // BC5_UNORM
71 {GL_R32F, GL_RED, GL_FLOAT}, // R32F 71 {GL_COMPRESSED_SIGNED_RG_RGTC2}, // BC5_SNORM
72 {GL_R16F, GL_RED, GL_HALF_FLOAT}, // R16F 72 {GL_COMPRESSED_RGBA_BPTC_UNORM}, // BC7_UNORM
73 {GL_R16, GL_RED, GL_UNSIGNED_SHORT}, // R16U 73 {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}, // BC6H_UFLOAT
74 {GL_R16_SNORM, GL_RED, GL_SHORT}, // R16S 74 {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT}, // BC6H_SFLOAT
75 {GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT}, // R16UI 75 {GL_COMPRESSED_RGBA_ASTC_4x4_KHR}, // ASTC_2D_4X4_UNORM
76 {GL_R16I, GL_RED_INTEGER, GL_SHORT}, // R16I 76 {GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE}, // B8G8R8A8_UNORM
77 {GL_RG16, GL_RG, GL_UNSIGNED_SHORT}, // RG16 77 {GL_RGBA32F, GL_RGBA, GL_FLOAT}, // R32G32B32A32_FLOAT
78 {GL_RG16F, GL_RG, GL_HALF_FLOAT}, // RG16F 78 {GL_RGBA32I, GL_RGBA_INTEGER, GL_INT}, // R32G32B32A32_SINT
79 {GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT}, // RG16UI 79 {GL_RG32F, GL_RG, GL_FLOAT}, // R32G32_FLOAT
80 {GL_RG16I, GL_RG_INTEGER, GL_SHORT}, // RG16I 80 {GL_RG32I, GL_RG_INTEGER, GL_INT}, // R32G32_SINT
81 {GL_RG16_SNORM, GL_RG, GL_SHORT}, // RG16S 81 {GL_R32F, GL_RED, GL_FLOAT}, // R32_FLOAT
82 {GL_RGB32F, GL_RGB, GL_FLOAT}, // RGB32F 82 {GL_R16F, GL_RED, GL_HALF_FLOAT}, // R16_FLOAT
83 {GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // RGBA8_SRGB 83 {GL_R16, GL_RED, GL_UNSIGNED_SHORT}, // R16_UNORM
84 {GL_RG8, GL_RG, GL_UNSIGNED_BYTE}, // RG8U 84 {GL_R16_SNORM, GL_RED, GL_SHORT}, // R16_SNORM
85 {GL_RG8_SNORM, GL_RG, GL_BYTE}, // RG8S 85 {GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT}, // R16_UINT
86 {GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_INT}, // RG8UI 86 {GL_R16I, GL_RED_INTEGER, GL_SHORT}, // R16_SINT
87 {GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT}, // RG32UI 87 {GL_RG16, GL_RG, GL_UNSIGNED_SHORT}, // R16G16_UNORM
88 {GL_RGB16F, GL_RGBA, GL_HALF_FLOAT}, // RGBX16F 88 {GL_RG16F, GL_RG, GL_HALF_FLOAT}, // R16G16_FLOAT
89 {GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT}, // R32UI 89 {GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT}, // R16G16_UINT
90 {GL_R32I, GL_RED_INTEGER, GL_INT}, // R32I 90 {GL_RG16I, GL_RG_INTEGER, GL_SHORT}, // R16G16_SINT
91 {GL_COMPRESSED_RGBA_ASTC_8x8_KHR}, // ASTC_2D_8X8 91 {GL_RG16_SNORM, GL_RG, GL_SHORT}, // R16G16_SNORM
92 {GL_COMPRESSED_RGBA_ASTC_8x5_KHR}, // ASTC_2D_8X5 92 {GL_RGB32F, GL_RGB, GL_FLOAT}, // R32G32B32_FLOAT
93 {GL_COMPRESSED_RGBA_ASTC_5x4_KHR}, // ASTC_2D_5X4 93 {GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // A8B8G8R8_SRGB
94 {GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE}, // BGRA8 94 {GL_RG8, GL_RG, GL_UNSIGNED_BYTE}, // R8G8_UNORM
95 {GL_RG8_SNORM, GL_RG, GL_BYTE}, // R8G8_SNORM
96 {GL_RG8I, GL_RG_INTEGER, GL_BYTE}, // R8G8_SINT
97 {GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE}, // R8G8_UINT
98 {GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT}, // R32G32_UINT
99 {GL_RGB16F, GL_RGBA, GL_HALF_FLOAT}, // R16G16B16X16_FLOAT
100 {GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT}, // R32_UINT
101 {GL_R32I, GL_RED_INTEGER, GL_INT}, // R32_SINT
102 {GL_COMPRESSED_RGBA_ASTC_8x8_KHR}, // ASTC_2D_8X8_UNORM
103 {GL_COMPRESSED_RGBA_ASTC_8x5_KHR}, // ASTC_2D_8X5_UNORM
104 {GL_COMPRESSED_RGBA_ASTC_5x4_KHR}, // ASTC_2D_5X4_UNORM
105 {GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE}, // B8G8R8A8_UNORM
95 // Compressed sRGB formats 106 // Compressed sRGB formats
96 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT}, // DXT1_SRGB 107 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT}, // BC1_RGBA_SRGB
97 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT}, // DXT23_SRGB 108 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT}, // BC2_SRGB
98 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // DXT45_SRGB 109 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB
99 {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7U_SRGB 110 {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7_SRGB
100 {GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // R4G4B4A4U 111 {GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // A4B4G4R4_UNORM
101 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB 112 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB
102 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB 113 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB
103 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB 114 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB
104 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR}, // ASTC_2D_5X4_SRGB 115 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR}, // ASTC_2D_5X4_SRGB
105 {GL_COMPRESSED_RGBA_ASTC_5x5_KHR}, // ASTC_2D_5X5 116 {GL_COMPRESSED_RGBA_ASTC_5x5_KHR}, // ASTC_2D_5X5_UNORM
106 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR}, // ASTC_2D_5X5_SRGB 117 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR}, // ASTC_2D_5X5_SRGB
107 {GL_COMPRESSED_RGBA_ASTC_10x8_KHR}, // ASTC_2D_10X8 118 {GL_COMPRESSED_RGBA_ASTC_10x8_KHR}, // ASTC_2D_10X8_UNORM
108 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR}, // ASTC_2D_10X8_SRGB 119 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR}, // ASTC_2D_10X8_SRGB
109 {GL_COMPRESSED_RGBA_ASTC_6x6_KHR}, // ASTC_2D_6X6 120 {GL_COMPRESSED_RGBA_ASTC_6x6_KHR}, // ASTC_2D_6X6_UNORM
110 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR}, // ASTC_2D_6X6_SRGB 121 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR}, // ASTC_2D_6X6_SRGB
111 {GL_COMPRESSED_RGBA_ASTC_10x10_KHR}, // ASTC_2D_10X10 122 {GL_COMPRESSED_RGBA_ASTC_10x10_KHR}, // ASTC_2D_10X10_UNORM
112 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR}, // ASTC_2D_10X10_SRGB 123 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR}, // ASTC_2D_10X10_SRGB
113 {GL_COMPRESSED_RGBA_ASTC_12x12_KHR}, // ASTC_2D_12X12 124 {GL_COMPRESSED_RGBA_ASTC_12x12_KHR}, // ASTC_2D_12X12_UNORM
114 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR}, // ASTC_2D_12X12_SRGB 125 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR}, // ASTC_2D_12X12_SRGB
115 {GL_COMPRESSED_RGBA_ASTC_8x6_KHR}, // ASTC_2D_8X6 126 {GL_COMPRESSED_RGBA_ASTC_8x6_KHR}, // ASTC_2D_8X6_UNORM
116 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR}, // ASTC_2D_8X6_SRGB 127 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR}, // ASTC_2D_8X6_SRGB
117 {GL_COMPRESSED_RGBA_ASTC_6x5_KHR}, // ASTC_2D_6X5 128 {GL_COMPRESSED_RGBA_ASTC_6x5_KHR}, // ASTC_2D_6X5_UNORM
118 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR}, // ASTC_2D_6X5_SRGB 129 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR}, // ASTC_2D_6X5_SRGB
119 {GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV}, // E5B9G9R9F 130 {GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV}, // E5B9G9R9_FLOAT
120 131
121 // Depth formats 132 // Depth formats
122 {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT}, // Z32F 133 {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT}, // D32_FLOAT
123 {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // Z16 134 {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // D16_UNORM
124 135
125 // DepthStencil formats 136 // DepthStencil formats
126 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // Z24S8 137 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // D24_UNORM_S8_UINT
127 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // S8Z24 138 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // S8_UINT_D24_UNORM
128 {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // Z32FS8 139 {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL,
140 GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // D32_FLOAT_S8_UINT
129}}; 141}};
130 142
131const FormatTuple& GetFormatTuple(PixelFormat pixel_format) { 143const FormatTuple& GetFormatTuple(PixelFormat pixel_format) {
@@ -178,10 +190,10 @@ GLint GetSwizzleSource(SwizzleSource source) {
178 190
179GLenum GetComponent(PixelFormat format, bool is_first) { 191GLenum GetComponent(PixelFormat format, bool is_first) {
180 switch (format) { 192 switch (format) {
181 case PixelFormat::Z24S8: 193 case PixelFormat::D24_UNORM_S8_UINT:
182 case PixelFormat::Z32FS8: 194 case PixelFormat::D32_FLOAT_S8_UINT:
183 return is_first ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX; 195 return is_first ? GL_DEPTH_COMPONENT : GL_STENCIL_INDEX;
184 case PixelFormat::S8Z24: 196 case PixelFormat::S8_UINT_D24_UNORM:
185 return is_first ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT; 197 return is_first ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT;
186 default: 198 default:
187 UNREACHABLE(); 199 UNREACHABLE();
@@ -482,9 +494,9 @@ GLuint CachedSurfaceView::GetTexture(SwizzleSource x_source, SwizzleSource y_sou
482 std::array swizzle{x_source, y_source, z_source, w_source}; 494 std::array swizzle{x_source, y_source, z_source, w_source};
483 495
484 switch (const PixelFormat format = GetSurfaceParams().pixel_format) { 496 switch (const PixelFormat format = GetSurfaceParams().pixel_format) {
485 case PixelFormat::Z24S8: 497 case PixelFormat::D24_UNORM_S8_UINT:
486 case PixelFormat::Z32FS8: 498 case PixelFormat::D32_FLOAT_S8_UINT:
487 case PixelFormat::S8Z24: 499 case PixelFormat::S8_UINT_D24_UNORM:
488 UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G); 500 UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G);
489 glTextureParameteri(view.handle, GL_DEPTH_STENCIL_TEXTURE_MODE, 501 glTextureParameteri(view.handle, GL_DEPTH_STENCIL_TEXTURE_MODE,
490 GetComponent(format, x_source == SwizzleSource::R)); 502 GetComponent(format, x_source == SwizzleSource::R));
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index e66cdc083..52e9e8250 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -535,12 +535,12 @@ void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
535 535
536 GLint internal_format; 536 GLint internal_format;
537 switch (framebuffer.pixel_format) { 537 switch (framebuffer.pixel_format) {
538 case Tegra::FramebufferConfig::PixelFormat::ABGR8: 538 case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
539 internal_format = GL_RGBA8; 539 internal_format = GL_RGBA8;
540 texture.gl_format = GL_RGBA; 540 texture.gl_format = GL_RGBA;
541 texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; 541 texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
542 break; 542 break;
543 case Tegra::FramebufferConfig::PixelFormat::RGB565: 543 case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
544 internal_format = GL_RGB565; 544 internal_format = GL_RGB565;
545 texture.gl_format = GL_RGB; 545 texture.gl_format = GL_RGB;
546 texture.gl_type = GL_UNSIGNED_SHORT_5_6_5; 546 texture.gl_type = GL_UNSIGNED_SHORT_5_6_5;
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
index d7f1ae89f..f8c77f4fa 100644
--- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
+++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
@@ -117,90 +117,101 @@ struct FormatTuple {
117 VkFormat format; ///< Vulkan format 117 VkFormat format; ///< Vulkan format
118 int usage = 0; ///< Describes image format usage 118 int usage = 0; ///< Describes image format usage
119} constexpr tex_format_tuples[] = { 119} constexpr tex_format_tuples[] = {
120 {VK_FORMAT_A8B8G8R8_UNORM_PACK32, Attachable | Storage}, // ABGR8U 120 {VK_FORMAT_A8B8G8R8_UNORM_PACK32, Attachable | Storage}, // A8B8G8R8_UNORM
121 {VK_FORMAT_A8B8G8R8_SNORM_PACK32, Attachable | Storage}, // ABGR8S 121 {VK_FORMAT_A8B8G8R8_SNORM_PACK32, Attachable | Storage}, // A8B8G8R8_SNORM
122 {VK_FORMAT_A8B8G8R8_UINT_PACK32, Attachable | Storage}, // ABGR8UI 122 {VK_FORMAT_A8B8G8R8_SINT_PACK32, Attachable | Storage}, // A8B8G8R8_SINT
123 {VK_FORMAT_B5G6R5_UNORM_PACK16}, // B5G6R5U 123 {VK_FORMAT_A8B8G8R8_UINT_PACK32, Attachable | Storage}, // A8B8G8R8_UINT
124 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10U 124 {VK_FORMAT_R5G6B5_UNORM_PACK16, Attachable}, // R5G6B5_UNORM
125 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5U (flipped with swizzle) 125 {VK_FORMAT_B5G6R5_UNORM_PACK16, Attachable}, // B5G6R5_UNORM
126 {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8U 126 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM
127 {VK_FORMAT_R8_UINT, Attachable | Storage}, // R8UI 127 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM
128 {VK_FORMAT_R16G16B16A16_SFLOAT, Attachable | Storage}, // RGBA16F 128 {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT
129 {VK_FORMAT_R16G16B16A16_UNORM, Attachable | Storage}, // RGBA16U 129 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle)
130 {VK_FORMAT_R16G16B16A16_SNORM, Attachable | Storage}, // RGBA16S 130 {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM
131 {VK_FORMAT_R16G16B16A16_UINT, Attachable | Storage}, // RGBA16UI 131 {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM
132 {VK_FORMAT_B10G11R11_UFLOAT_PACK32, Attachable | Storage}, // R11FG11FB10F 132 {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT
133 {VK_FORMAT_R32G32B32A32_UINT, Attachable | Storage}, // RGBA32UI 133 {VK_FORMAT_R8_UINT, Attachable | Storage}, // R8_UINT
134 {VK_FORMAT_BC1_RGBA_UNORM_BLOCK}, // DXT1 134 {VK_FORMAT_R16G16B16A16_SFLOAT, Attachable | Storage}, // R16G16B16A16_FLOAT
135 {VK_FORMAT_BC2_UNORM_BLOCK}, // DXT23 135 {VK_FORMAT_R16G16B16A16_UNORM, Attachable | Storage}, // R16G16B16A16_UNORM
136 {VK_FORMAT_BC3_UNORM_BLOCK}, // DXT45 136 {VK_FORMAT_R16G16B16A16_SNORM, Attachable | Storage}, // R16G16B16A16_SNORM
137 {VK_FORMAT_BC4_UNORM_BLOCK}, // DXN1 137 {VK_FORMAT_R16G16B16A16_SINT, Attachable | Storage}, // R16G16B16A16_SINT
138 {VK_FORMAT_BC5_UNORM_BLOCK}, // DXN2UNORM 138 {VK_FORMAT_R16G16B16A16_UINT, Attachable | Storage}, // R16G16B16A16_UINT
139 {VK_FORMAT_BC5_SNORM_BLOCK}, // DXN2SNORM 139 {VK_FORMAT_B10G11R11_UFLOAT_PACK32, Attachable | Storage}, // B10G11R11_FLOAT
140 {VK_FORMAT_BC7_UNORM_BLOCK}, // BC7U 140 {VK_FORMAT_R32G32B32A32_UINT, Attachable | Storage}, // R32G32B32A32_UINT
141 {VK_FORMAT_BC6H_UFLOAT_BLOCK}, // BC6H_UF16 141 {VK_FORMAT_BC1_RGBA_UNORM_BLOCK}, // BC1_RGBA_UNORM
142 {VK_FORMAT_BC6H_SFLOAT_BLOCK}, // BC6H_SF16 142 {VK_FORMAT_BC2_UNORM_BLOCK}, // BC2_UNORM
143 {VK_FORMAT_ASTC_4x4_UNORM_BLOCK}, // ASTC_2D_4X4 143 {VK_FORMAT_BC3_UNORM_BLOCK}, // BC3_UNORM
144 {VK_FORMAT_B8G8R8A8_UNORM, Attachable}, // BGRA8 144 {VK_FORMAT_BC4_UNORM_BLOCK}, // BC4_UNORM
145 {VK_FORMAT_R32G32B32A32_SFLOAT, Attachable | Storage}, // RGBA32F 145 {VK_FORMAT_BC4_SNORM_BLOCK}, // BC4_SNORM
146 {VK_FORMAT_R32G32_SFLOAT, Attachable | Storage}, // RG32F 146 {VK_FORMAT_BC5_UNORM_BLOCK}, // BC5_UNORM
147 {VK_FORMAT_R32_SFLOAT, Attachable | Storage}, // R32F 147 {VK_FORMAT_BC5_SNORM_BLOCK}, // BC5_SNORM
148 {VK_FORMAT_R16_SFLOAT, Attachable | Storage}, // R16F 148 {VK_FORMAT_BC7_UNORM_BLOCK}, // BC7_UNORM
149 {VK_FORMAT_R16_UNORM, Attachable | Storage}, // R16U 149 {VK_FORMAT_BC6H_UFLOAT_BLOCK}, // BC6H_UFLOAT
150 {VK_FORMAT_UNDEFINED}, // R16S 150 {VK_FORMAT_BC6H_SFLOAT_BLOCK}, // BC6H_SFLOAT
151 {VK_FORMAT_R16_UINT, Attachable | Storage}, // R16UI 151 {VK_FORMAT_ASTC_4x4_UNORM_BLOCK}, // ASTC_2D_4X4_UNORM
152 {VK_FORMAT_UNDEFINED}, // R16I 152 {VK_FORMAT_B8G8R8A8_UNORM, Attachable}, // B8G8R8A8_UNORM
153 {VK_FORMAT_R16G16_UNORM, Attachable | Storage}, // RG16 153 {VK_FORMAT_R32G32B32A32_SFLOAT, Attachable | Storage}, // R32G32B32A32_FLOAT
154 {VK_FORMAT_R16G16_SFLOAT, Attachable | Storage}, // RG16F 154 {VK_FORMAT_R32G32B32A32_SINT, Attachable | Storage}, // R32G32B32A32_SINT
155 {VK_FORMAT_UNDEFINED}, // RG16UI 155 {VK_FORMAT_R32G32_SFLOAT, Attachable | Storage}, // R32G32_FLOAT
156 {VK_FORMAT_UNDEFINED}, // RG16I 156 {VK_FORMAT_R32G32_SINT, Attachable | Storage}, // R32G32_SINT
157 {VK_FORMAT_R16G16_SNORM, Attachable | Storage}, // RG16S 157 {VK_FORMAT_R32_SFLOAT, Attachable | Storage}, // R32_FLOAT
158 {VK_FORMAT_UNDEFINED}, // RGB32F 158 {VK_FORMAT_R16_SFLOAT, Attachable | Storage}, // R16_FLOAT
159 {VK_FORMAT_R8G8B8A8_SRGB, Attachable}, // RGBA8_SRGB 159 {VK_FORMAT_R16_UNORM, Attachable | Storage}, // R16_UNORM
160 {VK_FORMAT_R8G8_UNORM, Attachable | Storage}, // RG8U 160 {VK_FORMAT_UNDEFINED}, // R16_SNORM
161 {VK_FORMAT_R8G8_SNORM, Attachable | Storage}, // RG8S 161 {VK_FORMAT_R16_UINT, Attachable | Storage}, // R16_UINT
162 {VK_FORMAT_R8G8_UINT, Attachable | Storage}, // RG8UI 162 {VK_FORMAT_UNDEFINED}, // R16_SINT
163 {VK_FORMAT_R32G32_UINT, Attachable | Storage}, // RG32UI 163 {VK_FORMAT_R16G16_UNORM, Attachable | Storage}, // R16G16_UNORM
164 {VK_FORMAT_UNDEFINED}, // RGBX16F 164 {VK_FORMAT_R16G16_SFLOAT, Attachable | Storage}, // R16G16_FLOAT
165 {VK_FORMAT_R32_UINT, Attachable | Storage}, // R32UI 165 {VK_FORMAT_UNDEFINED}, // R16G16_UINT
166 {VK_FORMAT_R32_SINT, Attachable | Storage}, // R32I 166 {VK_FORMAT_UNDEFINED}, // R16G16_SINT
167 {VK_FORMAT_ASTC_8x8_UNORM_BLOCK}, // ASTC_2D_8X8 167 {VK_FORMAT_R16G16_SNORM, Attachable | Storage}, // R16G16_SNORM
168 {VK_FORMAT_UNDEFINED}, // ASTC_2D_8X5 168 {VK_FORMAT_UNDEFINED}, // R32G32B32_FLOAT
169 {VK_FORMAT_UNDEFINED}, // ASTC_2D_5X4 169 {VK_FORMAT_R8G8B8A8_SRGB, Attachable}, // A8B8G8R8_SRGB
170 {VK_FORMAT_B8G8R8A8_SRGB, Attachable}, // BGRA8_SRGB 170 {VK_FORMAT_R8G8_UNORM, Attachable | Storage}, // R8G8_UNORM
171 {VK_FORMAT_BC1_RGBA_SRGB_BLOCK}, // DXT1_SRGB 171 {VK_FORMAT_R8G8_SNORM, Attachable | Storage}, // R8G8_SNORM
172 {VK_FORMAT_BC2_SRGB_BLOCK}, // DXT23_SRGB 172 {VK_FORMAT_R8G8_SINT, Attachable | Storage}, // R8G8_SINT
173 {VK_FORMAT_BC3_SRGB_BLOCK}, // DXT45_SRGB 173 {VK_FORMAT_R8G8_UINT, Attachable | Storage}, // R8G8_UINT
174 {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7U_SRGB 174 {VK_FORMAT_R32G32_UINT, Attachable | Storage}, // R32G32_UINT
175 {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // R4G4B4A4U 175 {VK_FORMAT_UNDEFINED}, // R16G16B16X16_FLOAT
176 {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB 176 {VK_FORMAT_R32_UINT, Attachable | Storage}, // R32_UINT
177 {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB 177 {VK_FORMAT_R32_SINT, Attachable | Storage}, // R32_SINT
178 {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB 178 {VK_FORMAT_ASTC_8x8_UNORM_BLOCK}, // ASTC_2D_8X8_UNORM
179 {VK_FORMAT_ASTC_5x4_SRGB_BLOCK}, // ASTC_2D_5X4_SRGB 179 {VK_FORMAT_UNDEFINED}, // ASTC_2D_8X5_UNORM
180 {VK_FORMAT_ASTC_5x5_UNORM_BLOCK}, // ASTC_2D_5X5 180 {VK_FORMAT_UNDEFINED}, // ASTC_2D_5X4_UNORM
181 {VK_FORMAT_ASTC_5x5_SRGB_BLOCK}, // ASTC_2D_5X5_SRGB 181 {VK_FORMAT_B8G8R8A8_SRGB, Attachable}, // B8G8R8A8_SRGB
182 {VK_FORMAT_ASTC_10x8_UNORM_BLOCK}, // ASTC_2D_10X8 182 {VK_FORMAT_BC1_RGBA_SRGB_BLOCK}, // BC1_RGBA_SRGB
183 {VK_FORMAT_ASTC_10x8_SRGB_BLOCK}, // ASTC_2D_10X8_SRGB 183 {VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB
184 {VK_FORMAT_ASTC_6x6_UNORM_BLOCK}, // ASTC_2D_6X6 184 {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB
185 {VK_FORMAT_ASTC_6x6_SRGB_BLOCK}, // ASTC_2D_6X6_SRGB 185 {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB
186 {VK_FORMAT_ASTC_10x10_UNORM_BLOCK}, // ASTC_2D_10X10 186 {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM
187 {VK_FORMAT_ASTC_10x10_SRGB_BLOCK}, // ASTC_2D_10X10_SRGB 187 {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB
188 {VK_FORMAT_ASTC_12x12_UNORM_BLOCK}, // ASTC_2D_12X12 188 {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB
189 {VK_FORMAT_ASTC_12x12_SRGB_BLOCK}, // ASTC_2D_12X12_SRGB 189 {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB
190 {VK_FORMAT_ASTC_8x6_UNORM_BLOCK}, // ASTC_2D_8X6 190 {VK_FORMAT_ASTC_5x4_SRGB_BLOCK}, // ASTC_2D_5X4_SRGB
191 {VK_FORMAT_ASTC_8x6_SRGB_BLOCK}, // ASTC_2D_8X6_SRGB 191 {VK_FORMAT_ASTC_5x5_UNORM_BLOCK}, // ASTC_2D_5X5_UNORM
192 {VK_FORMAT_ASTC_6x5_UNORM_BLOCK}, // ASTC_2D_6X5 192 {VK_FORMAT_ASTC_5x5_SRGB_BLOCK}, // ASTC_2D_5X5_SRGB
193 {VK_FORMAT_ASTC_6x5_SRGB_BLOCK}, // ASTC_2D_6X5_SRGB 193 {VK_FORMAT_ASTC_10x8_UNORM_BLOCK}, // ASTC_2D_10X8_UNORM
194 {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32}, // E5B9G9R9F 194 {VK_FORMAT_ASTC_10x8_SRGB_BLOCK}, // ASTC_2D_10X8_SRGB
195 {VK_FORMAT_ASTC_6x6_UNORM_BLOCK}, // ASTC_2D_6X6_UNORM
196 {VK_FORMAT_ASTC_6x6_SRGB_BLOCK}, // ASTC_2D_6X6_SRGB
197 {VK_FORMAT_ASTC_10x10_UNORM_BLOCK}, // ASTC_2D_10X10_UNORM
198 {VK_FORMAT_ASTC_10x10_SRGB_BLOCK}, // ASTC_2D_10X10_SRGB
199 {VK_FORMAT_ASTC_12x12_UNORM_BLOCK}, // ASTC_2D_12X12_UNORM
200 {VK_FORMAT_ASTC_12x12_SRGB_BLOCK}, // ASTC_2D_12X12_SRGB
201 {VK_FORMAT_ASTC_8x6_UNORM_BLOCK}, // ASTC_2D_8X6_UNORM
202 {VK_FORMAT_ASTC_8x6_SRGB_BLOCK}, // ASTC_2D_8X6_SRGB
203 {VK_FORMAT_ASTC_6x5_UNORM_BLOCK}, // ASTC_2D_6X5_UNORM
204 {VK_FORMAT_ASTC_6x5_SRGB_BLOCK}, // ASTC_2D_6X5_SRGB
205 {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32}, // E5B9G9R9_FLOAT
195 206
196 // Depth formats 207 // Depth formats
197 {VK_FORMAT_D32_SFLOAT, Attachable}, // Z32F 208 {VK_FORMAT_D32_SFLOAT, Attachable}, // D32_FLOAT
198 {VK_FORMAT_D16_UNORM, Attachable}, // Z16 209 {VK_FORMAT_D16_UNORM, Attachable}, // D16_UNORM
199 210
200 // DepthStencil formats 211 // DepthStencil formats
201 {VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // Z24S8 212 {VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // D24_UNORM_S8_UINT
202 {VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // S8Z24 (emulated) 213 {VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // S8_UINT_D24_UNORM (emulated)
203 {VK_FORMAT_D32_SFLOAT_S8_UINT, Attachable}, // Z32FS8 214 {VK_FORMAT_D32_SFLOAT_S8_UINT, Attachable}, // D32_FLOAT_S8_UINT
204}; 215};
205static_assert(std::size(tex_format_tuples) == VideoCore::Surface::MaxPixelFormat); 216static_assert(std::size(tex_format_tuples) == VideoCore::Surface::MaxPixelFormat);
206 217
@@ -221,7 +232,7 @@ FormatInfo SurfaceFormat(const VKDevice& device, FormatType format_type, PixelFo
221 return {VK_FORMAT_A8B8G8R8_UNORM_PACK32, true, true}; 232 return {VK_FORMAT_A8B8G8R8_UNORM_PACK32, true, true};
222 } 233 }
223 234
224 // Use ABGR8 on hardware that doesn't support ASTC natively 235 // Use A8B8G8R8_UNORM on hardware that doesn't support ASTC natively
225 if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) { 236 if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) {
226 tuple.format = VideoCore::Surface::IsPixelFormatSRGB(pixel_format) 237 tuple.format = VideoCore::Surface::IsPixelFormatSRGB(pixel_format)
227 ? VK_FORMAT_A8B8G8R8_SRGB_PACK32 238 ? VK_FORMAT_A8B8G8R8_SRGB_PACK32
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
index 866813465..ce53e5a6b 100644
--- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp
+++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
@@ -187,9 +187,9 @@ std::size_t GetSizeInBytes(const Tegra::FramebufferConfig& framebuffer) {
187 187
188VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) { 188VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) {
189 switch (framebuffer.pixel_format) { 189 switch (framebuffer.pixel_format) {
190 case Tegra::FramebufferConfig::PixelFormat::ABGR8: 190 case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
191 return VK_FORMAT_A8B8G8R8_UNORM_PACK32; 191 return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
192 case Tegra::FramebufferConfig::PixelFormat::RGB565: 192 case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
193 return VK_FORMAT_R5G6B5_UNORM_PACK16; 193 return VK_FORMAT_R5G6B5_UNORM_PACK16;
194 default: 194 default:
195 UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}", 195 UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}",
diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp
index 26379ee01..6245e0d78 100644
--- a/src/video_core/renderer_vulkan/vk_device.cpp
+++ b/src/video_core/renderer_vulkan/vk_device.cpp
@@ -84,14 +84,19 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(
84 VK_FORMAT_A8B8G8R8_UNORM_PACK32, 84 VK_FORMAT_A8B8G8R8_UNORM_PACK32,
85 VK_FORMAT_A8B8G8R8_UINT_PACK32, 85 VK_FORMAT_A8B8G8R8_UINT_PACK32,
86 VK_FORMAT_A8B8G8R8_SNORM_PACK32, 86 VK_FORMAT_A8B8G8R8_SNORM_PACK32,
87 VK_FORMAT_A8B8G8R8_SINT_PACK32,
87 VK_FORMAT_A8B8G8R8_SRGB_PACK32, 88 VK_FORMAT_A8B8G8R8_SRGB_PACK32,
88 VK_FORMAT_B5G6R5_UNORM_PACK16, 89 VK_FORMAT_B5G6R5_UNORM_PACK16,
89 VK_FORMAT_A2B10G10R10_UNORM_PACK32, 90 VK_FORMAT_A2B10G10R10_UNORM_PACK32,
91 VK_FORMAT_A2B10G10R10_UINT_PACK32,
90 VK_FORMAT_A1R5G5B5_UNORM_PACK16, 92 VK_FORMAT_A1R5G5B5_UNORM_PACK16,
91 VK_FORMAT_R32G32B32A32_SFLOAT, 93 VK_FORMAT_R32G32B32A32_SFLOAT,
94 VK_FORMAT_R32G32B32A32_SINT,
92 VK_FORMAT_R32G32B32A32_UINT, 95 VK_FORMAT_R32G32B32A32_UINT,
93 VK_FORMAT_R32G32_SFLOAT, 96 VK_FORMAT_R32G32_SFLOAT,
97 VK_FORMAT_R32G32_SINT,
94 VK_FORMAT_R32G32_UINT, 98 VK_FORMAT_R32G32_UINT,
99 VK_FORMAT_R16G16B16A16_SINT,
95 VK_FORMAT_R16G16B16A16_UINT, 100 VK_FORMAT_R16G16B16A16_UINT,
96 VK_FORMAT_R16G16B16A16_SNORM, 101 VK_FORMAT_R16G16B16A16_SNORM,
97 VK_FORMAT_R16G16B16A16_UNORM, 102 VK_FORMAT_R16G16B16A16_UNORM,
@@ -103,8 +108,11 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(
103 VK_FORMAT_R8G8B8A8_SRGB, 108 VK_FORMAT_R8G8B8A8_SRGB,
104 VK_FORMAT_R8G8_UNORM, 109 VK_FORMAT_R8G8_UNORM,
105 VK_FORMAT_R8G8_SNORM, 110 VK_FORMAT_R8G8_SNORM,
111 VK_FORMAT_R8G8_SINT,
106 VK_FORMAT_R8G8_UINT, 112 VK_FORMAT_R8G8_UINT,
107 VK_FORMAT_R8_UNORM, 113 VK_FORMAT_R8_UNORM,
114 VK_FORMAT_R8_SNORM,
115 VK_FORMAT_R8_SINT,
108 VK_FORMAT_R8_UINT, 116 VK_FORMAT_R8_UINT,
109 VK_FORMAT_B10G11R11_UFLOAT_PACK32, 117 VK_FORMAT_B10G11R11_UFLOAT_PACK32,
110 VK_FORMAT_R32_SFLOAT, 118 VK_FORMAT_R32_SFLOAT,
@@ -124,6 +132,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(
124 VK_FORMAT_BC2_UNORM_BLOCK, 132 VK_FORMAT_BC2_UNORM_BLOCK,
125 VK_FORMAT_BC3_UNORM_BLOCK, 133 VK_FORMAT_BC3_UNORM_BLOCK,
126 VK_FORMAT_BC4_UNORM_BLOCK, 134 VK_FORMAT_BC4_UNORM_BLOCK,
135 VK_FORMAT_BC4_SNORM_BLOCK,
127 VK_FORMAT_BC5_UNORM_BLOCK, 136 VK_FORMAT_BC5_UNORM_BLOCK,
128 VK_FORMAT_BC5_SNORM_BLOCK, 137 VK_FORMAT_BC5_SNORM_BLOCK,
129 VK_FORMAT_BC7_UNORM_BLOCK, 138 VK_FORMAT_BC7_UNORM_BLOCK,
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 9bc18c21a..d102e6d27 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -235,7 +235,7 @@ void CachedSurface::UploadTexture(const std::vector<u8>& staging_buffer) {
235void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) { 235void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) {
236 UNIMPLEMENTED_IF(params.IsBuffer()); 236 UNIMPLEMENTED_IF(params.IsBuffer());
237 237
238 if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5U) { 238 if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5_UNORM) {
239 LOG_WARNING(Render_Vulkan, "A1B5G5R5 flushing is stubbed"); 239 LOG_WARNING(Render_Vulkan, "A1B5G5R5 flushing is stubbed");
240 } 240 }
241 241
@@ -385,7 +385,7 @@ VkImageView CachedSurfaceView::GetImageView(SwizzleSource x_source, SwizzleSourc
385 385
386 std::array swizzle{MaxwellToVK::SwizzleSource(x_source), MaxwellToVK::SwizzleSource(y_source), 386 std::array swizzle{MaxwellToVK::SwizzleSource(x_source), MaxwellToVK::SwizzleSource(y_source),
387 MaxwellToVK::SwizzleSource(z_source), MaxwellToVK::SwizzleSource(w_source)}; 387 MaxwellToVK::SwizzleSource(z_source), MaxwellToVK::SwizzleSource(w_source)};
388 if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5U) { 388 if (params.pixel_format == VideoCore::Surface::PixelFormat::A1B5G5R5_UNORM) {
389 // A1B5G5R5 is implemented as A1R5G5B5, we have to change the swizzle here. 389 // A1B5G5R5 is implemented as A1R5G5B5, we have to change the swizzle here.
390 std::swap(swizzle[0], swizzle[2]); 390 std::swap(swizzle[0], swizzle[2]);
391 } 391 }
@@ -397,11 +397,11 @@ VkImageView CachedSurfaceView::GetImageView(SwizzleSource x_source, SwizzleSourc
397 UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G); 397 UNIMPLEMENTED_IF(x_source != SwizzleSource::R && x_source != SwizzleSource::G);
398 const bool is_first = x_source == SwizzleSource::R; 398 const bool is_first = x_source == SwizzleSource::R;
399 switch (params.pixel_format) { 399 switch (params.pixel_format) {
400 case VideoCore::Surface::PixelFormat::Z24S8: 400 case VideoCore::Surface::PixelFormat::D24_UNORM_S8_UINT:
401 case VideoCore::Surface::PixelFormat::Z32FS8: 401 case VideoCore::Surface::PixelFormat::D32_FLOAT_S8_UINT:
402 aspect = is_first ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT; 402 aspect = is_first ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_STENCIL_BIT;
403 break; 403 break;
404 case VideoCore::Surface::PixelFormat::S8Z24: 404 case VideoCore::Surface::PixelFormat::S8_UINT_D24_UNORM:
405 aspect = is_first ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT; 405 aspect = is_first ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT;
406 break; 406 break;
407 default: 407 default:
diff --git a/src/video_core/shader/decode/image.cpp b/src/video_core/shader/decode/image.cpp
index 07778dc3e..e75ca4fdb 100644
--- a/src/video_core/shader/decode/image.cpp
+++ b/src/video_core/shader/decode/image.cpp
@@ -31,11 +31,11 @@ ComponentType GetComponentType(Tegra::Engines::SamplerDescriptor descriptor,
31 std::size_t component) { 31 std::size_t component) {
32 const TextureFormat format{descriptor.format}; 32 const TextureFormat format{descriptor.format};
33 switch (format) { 33 switch (format) {
34 case TextureFormat::R16_G16_B16_A16: 34 case TextureFormat::R16G16B16A16:
35 case TextureFormat::R32_G32_B32_A32: 35 case TextureFormat::R32G32B32A32:
36 case TextureFormat::R32_G32_B32: 36 case TextureFormat::R32G32B32:
37 case TextureFormat::R32_G32: 37 case TextureFormat::R32G32:
38 case TextureFormat::R16_G16: 38 case TextureFormat::R16G16:
39 case TextureFormat::R32: 39 case TextureFormat::R32:
40 case TextureFormat::R16: 40 case TextureFormat::R16:
41 case TextureFormat::R8: 41 case TextureFormat::R8:
@@ -97,7 +97,7 @@ ComponentType GetComponentType(Tegra::Engines::SamplerDescriptor descriptor,
97 break; 97 break;
98 case TextureFormat::B5G6R5: 98 case TextureFormat::B5G6R5:
99 case TextureFormat::B6G5R5: 99 case TextureFormat::B6G5R5:
100 case TextureFormat::BF10GF11RF11: 100 case TextureFormat::B10G11R11:
101 if (component == 0) { 101 if (component == 0) {
102 return descriptor.b_type; 102 return descriptor.b_type;
103 } 103 }
@@ -108,9 +108,9 @@ ComponentType GetComponentType(Tegra::Engines::SamplerDescriptor descriptor,
108 return descriptor.r_type; 108 return descriptor.r_type;
109 } 109 }
110 break; 110 break;
111 case TextureFormat::G8R24: 111 case TextureFormat::R24G8:
112 case TextureFormat::G24R8: 112 case TextureFormat::R8G24:
113 case TextureFormat::G8R8: 113 case TextureFormat::R8G8:
114 case TextureFormat::G4R4: 114 case TextureFormat::G4R4:
115 if (component == 0) { 115 if (component == 0) {
116 return descriptor.g_type; 116 return descriptor.g_type;
@@ -137,15 +137,15 @@ bool IsComponentEnabled(std::size_t component_mask, std::size_t component) {
137 137
138u32 GetComponentSize(TextureFormat format, std::size_t component) { 138u32 GetComponentSize(TextureFormat format, std::size_t component) {
139 switch (format) { 139 switch (format) {
140 case TextureFormat::R32_G32_B32_A32: 140 case TextureFormat::R32G32B32A32:
141 return 32; 141 return 32;
142 case TextureFormat::R16_G16_B16_A16: 142 case TextureFormat::R16G16B16A16:
143 return 16; 143 return 16;
144 case TextureFormat::R32_G32_B32: 144 case TextureFormat::R32G32B32:
145 return component <= 2 ? 32 : 0; 145 return component <= 2 ? 32 : 0;
146 case TextureFormat::R32_G32: 146 case TextureFormat::R32G32:
147 return component <= 1 ? 32 : 0; 147 return component <= 1 ? 32 : 0;
148 case TextureFormat::R16_G16: 148 case TextureFormat::R16G16:
149 return component <= 1 ? 16 : 0; 149 return component <= 1 ? 16 : 0;
150 case TextureFormat::R32: 150 case TextureFormat::R32:
151 return component == 0 ? 32 : 0; 151 return component == 0 ? 32 : 0;
@@ -192,7 +192,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
192 return 6; 192 return 6;
193 } 193 }
194 return 0; 194 return 0;
195 case TextureFormat::BF10GF11RF11: 195 case TextureFormat::B10G11R11:
196 if (component == 1 || component == 2) { 196 if (component == 1 || component == 2) {
197 return 11; 197 return 11;
198 } 198 }
@@ -200,7 +200,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
200 return 10; 200 return 10;
201 } 201 }
202 return 0; 202 return 0;
203 case TextureFormat::G8R24: 203 case TextureFormat::R24G8:
204 if (component == 0) { 204 if (component == 0) {
205 return 8; 205 return 8;
206 } 206 }
@@ -208,7 +208,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
208 return 24; 208 return 24;
209 } 209 }
210 return 0; 210 return 0;
211 case TextureFormat::G24R8: 211 case TextureFormat::R8G24:
212 if (component == 0) { 212 if (component == 0) {
213 return 8; 213 return 8;
214 } 214 }
@@ -216,7 +216,7 @@ u32 GetComponentSize(TextureFormat format, std::size_t component) {
216 return 24; 216 return 24;
217 } 217 }
218 return 0; 218 return 0;
219 case TextureFormat::G8R8: 219 case TextureFormat::R8G8:
220 return (component == 0 || component == 1) ? 8 : 0; 220 return (component == 0 || component == 1) ? 8 : 0;
221 case TextureFormat::G4R4: 221 case TextureFormat::G4R4:
222 return (component == 0 || component == 1) ? 4 : 0; 222 return (component == 0 || component == 1) ? 4 : 0;
@@ -231,25 +231,25 @@ std::size_t GetImageComponentMask(TextureFormat format) {
231 constexpr u8 B = 0b0100; 231 constexpr u8 B = 0b0100;
232 constexpr u8 A = 0b1000; 232 constexpr u8 A = 0b1000;
233 switch (format) { 233 switch (format) {
234 case TextureFormat::R32_G32_B32_A32: 234 case TextureFormat::R32G32B32A32:
235 case TextureFormat::R16_G16_B16_A16: 235 case TextureFormat::R16G16B16A16:
236 case TextureFormat::A8R8G8B8: 236 case TextureFormat::A8R8G8B8:
237 case TextureFormat::A2B10G10R10: 237 case TextureFormat::A2B10G10R10:
238 case TextureFormat::A4B4G4R4: 238 case TextureFormat::A4B4G4R4:
239 case TextureFormat::A5B5G5R1: 239 case TextureFormat::A5B5G5R1:
240 case TextureFormat::A1B5G5R5: 240 case TextureFormat::A1B5G5R5:
241 return std::size_t{R | G | B | A}; 241 return std::size_t{R | G | B | A};
242 case TextureFormat::R32_G32_B32: 242 case TextureFormat::R32G32B32:
243 case TextureFormat::R32_B24G8: 243 case TextureFormat::R32_B24G8:
244 case TextureFormat::B5G6R5: 244 case TextureFormat::B5G6R5:
245 case TextureFormat::B6G5R5: 245 case TextureFormat::B6G5R5:
246 case TextureFormat::BF10GF11RF11: 246 case TextureFormat::B10G11R11:
247 return std::size_t{R | G | B}; 247 return std::size_t{R | G | B};
248 case TextureFormat::R32_G32: 248 case TextureFormat::R32G32:
249 case TextureFormat::R16_G16: 249 case TextureFormat::R16G16:
250 case TextureFormat::G8R24: 250 case TextureFormat::R24G8:
251 case TextureFormat::G24R8: 251 case TextureFormat::R8G24:
252 case TextureFormat::G8R8: 252 case TextureFormat::R8G8:
253 case TextureFormat::G4R4: 253 case TextureFormat::G4R4:
254 return std::size_t{R | G}; 254 return std::size_t{R | G};
255 case TextureFormat::R32: 255 case TextureFormat::R32:
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp
index bbe93903c..1688267bb 100644
--- a/src/video_core/surface.cpp
+++ b/src/video_core/surface.cpp
@@ -74,117 +74,131 @@ bool SurfaceTargetIsArray(SurfaceTarget target) {
74 74
75PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) { 75PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
76 switch (format) { 76 switch (format) {
77 case Tegra::DepthFormat::S8_Z24_UNORM: 77 case Tegra::DepthFormat::S8_UINT_Z24_UNORM:
78 return PixelFormat::S8Z24; 78 return PixelFormat::S8_UINT_D24_UNORM;
79 case Tegra::DepthFormat::Z24_S8_UNORM: 79 case Tegra::DepthFormat::D24S8_UNORM:
80 return PixelFormat::Z24S8; 80 return PixelFormat::D24_UNORM_S8_UINT;
81 case Tegra::DepthFormat::Z32_FLOAT: 81 case Tegra::DepthFormat::D32_FLOAT:
82 return PixelFormat::Z32F; 82 return PixelFormat::D32_FLOAT;
83 case Tegra::DepthFormat::Z16_UNORM: 83 case Tegra::DepthFormat::D16_UNORM:
84 return PixelFormat::Z16; 84 return PixelFormat::D16_UNORM;
85 case Tegra::DepthFormat::Z32_S8_X24_FLOAT: 85 case Tegra::DepthFormat::D32_FLOAT_S8X24_UINT:
86 return PixelFormat::Z32FS8; 86 return PixelFormat::D32_FLOAT_S8_UINT;
87 default: 87 default:
88 LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); 88 UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<u32>(format));
89 UNREACHABLE(); 89 return PixelFormat::S8_UINT_D24_UNORM;
90 return PixelFormat::S8Z24;
91 } 90 }
92} 91}
93 92
94PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) { 93PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) {
95 switch (format) { 94 switch (format) {
96 case Tegra::RenderTargetFormat::RGBA8_SRGB: 95 case Tegra::RenderTargetFormat::R32B32G32A32_FLOAT:
97 return PixelFormat::RGBA8_SRGB; 96 return PixelFormat::R32G32B32A32_FLOAT;
98 case Tegra::RenderTargetFormat::RGBA8_UNORM: 97 case Tegra::RenderTargetFormat::R32G32B32A32_SINT:
99 return PixelFormat::ABGR8U; 98 return PixelFormat::R32G32B32A32_SINT;
100 case Tegra::RenderTargetFormat::RGBA8_SNORM: 99 case Tegra::RenderTargetFormat::R32G32B32A32_UINT:
101 return PixelFormat::ABGR8S; 100 return PixelFormat::R32G32B32A32_UINT;
102 case Tegra::RenderTargetFormat::RGBA8_UINT: 101 case Tegra::RenderTargetFormat::R16G16B16A16_UNORM:
103 return PixelFormat::ABGR8UI; 102 return PixelFormat::R16G16B16A16_UNORM;
104 case Tegra::RenderTargetFormat::BGRA8_SRGB: 103 case Tegra::RenderTargetFormat::R16G16B16A16_SNORM:
105 return PixelFormat::BGRA8_SRGB; 104 return PixelFormat::R16G16B16A16_SNORM;
106 case Tegra::RenderTargetFormat::BGRA8_UNORM: 105 case Tegra::RenderTargetFormat::R16G16B16A16_SINT:
107 return PixelFormat::BGRA8; 106 return PixelFormat::R16G16B16A16_SINT;
108 case Tegra::RenderTargetFormat::RGB10_A2_UNORM: 107 case Tegra::RenderTargetFormat::R16G16B16A16_UINT:
109 return PixelFormat::A2B10G10R10U; 108 return PixelFormat::R16G16B16A16_UINT;
110 case Tegra::RenderTargetFormat::RGBA16_FLOAT: 109 case Tegra::RenderTargetFormat::R16G16B16A16_FLOAT:
111 return PixelFormat::RGBA16F; 110 return PixelFormat::R16G16B16A16_FLOAT;
112 case Tegra::RenderTargetFormat::RGBA16_UNORM: 111 case Tegra::RenderTargetFormat::R32G32_FLOAT:
113 return PixelFormat::RGBA16U; 112 return PixelFormat::R32G32_FLOAT;
114 case Tegra::RenderTargetFormat::RGBA16_SNORM: 113 case Tegra::RenderTargetFormat::R32G32_SINT:
115 return PixelFormat::RGBA16S; 114 return PixelFormat::R32G32_SINT;
116 case Tegra::RenderTargetFormat::RGBA16_UINT: 115 case Tegra::RenderTargetFormat::R32G32_UINT:
117 return PixelFormat::RGBA16UI; 116 return PixelFormat::R32G32_UINT;
118 case Tegra::RenderTargetFormat::RGBA32_FLOAT: 117 case Tegra::RenderTargetFormat::R16G16B16X16_FLOAT:
119 return PixelFormat::RGBA32F; 118 return PixelFormat::R16G16B16X16_FLOAT;
120 case Tegra::RenderTargetFormat::RG32_FLOAT: 119 case Tegra::RenderTargetFormat::B8G8R8A8_UNORM:
121 return PixelFormat::RG32F; 120 return PixelFormat::B8G8R8A8_UNORM;
122 case Tegra::RenderTargetFormat::R11G11B10_FLOAT: 121 case Tegra::RenderTargetFormat::B8G8R8A8_SRGB:
123 return PixelFormat::R11FG11FB10F; 122 return PixelFormat::B8G8R8A8_SRGB;
124 case Tegra::RenderTargetFormat::B5G6R5_UNORM: 123 case Tegra::RenderTargetFormat::A2B10G10R10_UNORM:
125 return PixelFormat::B5G6R5U; 124 return PixelFormat::A2B10G10R10_UNORM;
126 case Tegra::RenderTargetFormat::BGR5A1_UNORM: 125 case Tegra::RenderTargetFormat::A2B10G10R10_UINT:
127 return PixelFormat::A1B5G5R5U; 126 return PixelFormat::A2B10G10R10_UINT;
128 case Tegra::RenderTargetFormat::RGBA32_UINT: 127 case Tegra::RenderTargetFormat::A8B8G8R8_UNORM:
129 return PixelFormat::RGBA32UI; 128 return PixelFormat::A8B8G8R8_UNORM;
130 case Tegra::RenderTargetFormat::R8_UNORM: 129 case Tegra::RenderTargetFormat::A8B8G8R8_SRGB:
131 return PixelFormat::R8U; 130 return PixelFormat::A8B8G8R8_SRGB;
132 case Tegra::RenderTargetFormat::R8_UINT: 131 case Tegra::RenderTargetFormat::A8B8G8R8_SNORM:
133 return PixelFormat::R8UI; 132 return PixelFormat::A8B8G8R8_SNORM;
134 case Tegra::RenderTargetFormat::RG16_FLOAT: 133 case Tegra::RenderTargetFormat::A8B8G8R8_SINT:
135 return PixelFormat::RG16F; 134 return PixelFormat::A8B8G8R8_SINT;
136 case Tegra::RenderTargetFormat::RG16_UINT: 135 case Tegra::RenderTargetFormat::A8B8G8R8_UINT:
137 return PixelFormat::RG16UI; 136 return PixelFormat::A8B8G8R8_UINT;
138 case Tegra::RenderTargetFormat::RG16_SINT: 137 case Tegra::RenderTargetFormat::R16G16_UNORM:
139 return PixelFormat::RG16I; 138 return PixelFormat::R16G16_UNORM;
140 case Tegra::RenderTargetFormat::RG16_UNORM: 139 case Tegra::RenderTargetFormat::R16G16_SNORM:
141 return PixelFormat::RG16; 140 return PixelFormat::R16G16_SNORM;
142 case Tegra::RenderTargetFormat::RG16_SNORM: 141 case Tegra::RenderTargetFormat::R16G16_SINT:
143 return PixelFormat::RG16S; 142 return PixelFormat::R16G16_SINT;
144 case Tegra::RenderTargetFormat::RG8_UNORM: 143 case Tegra::RenderTargetFormat::R16G16_UINT:
145 return PixelFormat::RG8U; 144 return PixelFormat::R16G16_UINT;
146 case Tegra::RenderTargetFormat::RG8_SNORM: 145 case Tegra::RenderTargetFormat::R16G16_FLOAT:
147 return PixelFormat::RG8S; 146 return PixelFormat::R16G16_FLOAT;
148 case Tegra::RenderTargetFormat::RG8_UINT: 147 case Tegra::RenderTargetFormat::B10G11R11_FLOAT:
149 return PixelFormat::RG8UI; 148 return PixelFormat::B10G11R11_FLOAT;
150 case Tegra::RenderTargetFormat::R16_FLOAT: 149 case Tegra::RenderTargetFormat::R32_SINT:
151 return PixelFormat::R16F; 150 return PixelFormat::R32_SINT;
151 case Tegra::RenderTargetFormat::R32_UINT:
152 return PixelFormat::R32_UINT;
153 case Tegra::RenderTargetFormat::R32_FLOAT:
154 return PixelFormat::R32_FLOAT;
155 case Tegra::RenderTargetFormat::R5G6B5_UNORM:
156 return PixelFormat::R5G6B5_UNORM;
157 case Tegra::RenderTargetFormat::A1R5G5B5_UNORM:
158 return PixelFormat::A1R5G5B5_UNORM;
159 case Tegra::RenderTargetFormat::R8G8_UNORM:
160 return PixelFormat::R8G8_UNORM;
161 case Tegra::RenderTargetFormat::R8G8_SNORM:
162 return PixelFormat::R8G8_SNORM;
163 case Tegra::RenderTargetFormat::R8G8_SINT:
164 return PixelFormat::R8G8_SINT;
165 case Tegra::RenderTargetFormat::R8G8_UINT:
166 return PixelFormat::R8G8_UINT;
152 case Tegra::RenderTargetFormat::R16_UNORM: 167 case Tegra::RenderTargetFormat::R16_UNORM:
153 return PixelFormat::R16U; 168 return PixelFormat::R16_UNORM;
154 case Tegra::RenderTargetFormat::R16_SNORM: 169 case Tegra::RenderTargetFormat::R16_SNORM:
155 return PixelFormat::R16S; 170 return PixelFormat::R16_SNORM;
156 case Tegra::RenderTargetFormat::R16_UINT:
157 return PixelFormat::R16UI;
158 case Tegra::RenderTargetFormat::R16_SINT: 171 case Tegra::RenderTargetFormat::R16_SINT:
159 return PixelFormat::R16I; 172 return PixelFormat::R16_SINT;
160 case Tegra::RenderTargetFormat::R32_FLOAT: 173 case Tegra::RenderTargetFormat::R16_UINT:
161 return PixelFormat::R32F; 174 return PixelFormat::R16_UINT;
162 case Tegra::RenderTargetFormat::R32_SINT: 175 case Tegra::RenderTargetFormat::R16_FLOAT:
163 return PixelFormat::R32I; 176 return PixelFormat::R16_FLOAT;
164 case Tegra::RenderTargetFormat::R32_UINT: 177 case Tegra::RenderTargetFormat::R8_UNORM:
165 return PixelFormat::R32UI; 178 return PixelFormat::R8_UNORM;
166 case Tegra::RenderTargetFormat::RG32_UINT: 179 case Tegra::RenderTargetFormat::R8_SNORM:
167 return PixelFormat::RG32UI; 180 return PixelFormat::R8_SNORM;
168 case Tegra::RenderTargetFormat::RGBX16_FLOAT: 181 case Tegra::RenderTargetFormat::R8_SINT:
169 return PixelFormat::RGBX16F; 182 return PixelFormat::R8_SINT;
183 case Tegra::RenderTargetFormat::R8_UINT:
184 return PixelFormat::R8_UINT;
170 default: 185 default:
171 LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); 186 UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<int>(format));
172 UNREACHABLE(); 187 return PixelFormat::A8B8G8R8_UNORM;
173 return PixelFormat::RGBA8_SRGB;
174 } 188 }
175} 189}
176 190
177PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format) { 191PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format) {
178 switch (format) { 192 switch (format) {
179 case Tegra::FramebufferConfig::PixelFormat::ABGR8: 193 case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
180 return PixelFormat::ABGR8U; 194 return PixelFormat::A8B8G8R8_UNORM;
181 case Tegra::FramebufferConfig::PixelFormat::RGB565: 195 case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
182 return PixelFormat::B5G6R5U; 196 return PixelFormat::R5G6B5_UNORM;
183 case Tegra::FramebufferConfig::PixelFormat::BGRA8: 197 case Tegra::FramebufferConfig::PixelFormat::B8G8R8A8_UNORM:
184 return PixelFormat::BGRA8; 198 return PixelFormat::B8G8R8A8_UNORM;
185 default: 199 default:
186 UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<u32>(format)); 200 UNIMPLEMENTED_MSG("Unimplemented format={}", static_cast<u32>(format));
187 return PixelFormat::ABGR8U; 201 return PixelFormat::A8B8G8R8_UNORM;
188 } 202 }
189} 203}
190 204
@@ -212,27 +226,27 @@ SurfaceType GetFormatType(PixelFormat pixel_format) {
212 226
213bool IsPixelFormatASTC(PixelFormat format) { 227bool IsPixelFormatASTC(PixelFormat format) {
214 switch (format) { 228 switch (format) {
215 case PixelFormat::ASTC_2D_4X4: 229 case PixelFormat::ASTC_2D_4X4_UNORM:
216 case PixelFormat::ASTC_2D_5X4: 230 case PixelFormat::ASTC_2D_5X4_UNORM:
217 case PixelFormat::ASTC_2D_5X5: 231 case PixelFormat::ASTC_2D_5X5_UNORM:
218 case PixelFormat::ASTC_2D_8X8: 232 case PixelFormat::ASTC_2D_8X8_UNORM:
219 case PixelFormat::ASTC_2D_8X5: 233 case PixelFormat::ASTC_2D_8X5_UNORM:
220 case PixelFormat::ASTC_2D_4X4_SRGB: 234 case PixelFormat::ASTC_2D_4X4_SRGB:
221 case PixelFormat::ASTC_2D_5X4_SRGB: 235 case PixelFormat::ASTC_2D_5X4_SRGB:
222 case PixelFormat::ASTC_2D_5X5_SRGB: 236 case PixelFormat::ASTC_2D_5X5_SRGB:
223 case PixelFormat::ASTC_2D_8X8_SRGB: 237 case PixelFormat::ASTC_2D_8X8_SRGB:
224 case PixelFormat::ASTC_2D_8X5_SRGB: 238 case PixelFormat::ASTC_2D_8X5_SRGB:
225 case PixelFormat::ASTC_2D_10X8: 239 case PixelFormat::ASTC_2D_10X8_UNORM:
226 case PixelFormat::ASTC_2D_10X8_SRGB: 240 case PixelFormat::ASTC_2D_10X8_SRGB:
227 case PixelFormat::ASTC_2D_6X6: 241 case PixelFormat::ASTC_2D_6X6_UNORM:
228 case PixelFormat::ASTC_2D_6X6_SRGB: 242 case PixelFormat::ASTC_2D_6X6_SRGB:
229 case PixelFormat::ASTC_2D_10X10: 243 case PixelFormat::ASTC_2D_10X10_UNORM:
230 case PixelFormat::ASTC_2D_10X10_SRGB: 244 case PixelFormat::ASTC_2D_10X10_SRGB:
231 case PixelFormat::ASTC_2D_12X12: 245 case PixelFormat::ASTC_2D_12X12_UNORM:
232 case PixelFormat::ASTC_2D_12X12_SRGB: 246 case PixelFormat::ASTC_2D_12X12_SRGB:
233 case PixelFormat::ASTC_2D_8X6: 247 case PixelFormat::ASTC_2D_8X6_UNORM:
234 case PixelFormat::ASTC_2D_8X6_SRGB: 248 case PixelFormat::ASTC_2D_8X6_SRGB:
235 case PixelFormat::ASTC_2D_6X5: 249 case PixelFormat::ASTC_2D_6X5_UNORM:
236 case PixelFormat::ASTC_2D_6X5_SRGB: 250 case PixelFormat::ASTC_2D_6X5_SRGB:
237 return true; 251 return true;
238 default: 252 default:
@@ -242,12 +256,12 @@ bool IsPixelFormatASTC(PixelFormat format) {
242 256
243bool IsPixelFormatSRGB(PixelFormat format) { 257bool IsPixelFormatSRGB(PixelFormat format) {
244 switch (format) { 258 switch (format) {
245 case PixelFormat::RGBA8_SRGB: 259 case PixelFormat::A8B8G8R8_SRGB:
246 case PixelFormat::BGRA8_SRGB: 260 case PixelFormat::B8G8R8A8_SRGB:
247 case PixelFormat::DXT1_SRGB: 261 case PixelFormat::BC1_RGBA_SRGB:
248 case PixelFormat::DXT23_SRGB: 262 case PixelFormat::BC2_SRGB:
249 case PixelFormat::DXT45_SRGB: 263 case PixelFormat::BC3_SRGB:
250 case PixelFormat::BC7U_SRGB: 264 case PixelFormat::BC7_SRGB:
251 case PixelFormat::ASTC_2D_4X4_SRGB: 265 case PixelFormat::ASTC_2D_4X4_SRGB:
252 case PixelFormat::ASTC_2D_8X8_SRGB: 266 case PixelFormat::ASTC_2D_8X8_SRGB:
253 case PixelFormat::ASTC_2D_8X5_SRGB: 267 case PixelFormat::ASTC_2D_8X5_SRGB:
@@ -269,25 +283,4 @@ std::pair<u32, u32> GetASTCBlockSize(PixelFormat format) {
269 return {GetDefaultBlockWidth(format), GetDefaultBlockHeight(format)}; 283 return {GetDefaultBlockWidth(format), GetDefaultBlockHeight(format)};
270} 284}
271 285
272bool IsFormatBCn(PixelFormat format) {
273 switch (format) {
274 case PixelFormat::DXT1:
275 case PixelFormat::DXT23:
276 case PixelFormat::DXT45:
277 case PixelFormat::DXN1:
278 case PixelFormat::DXN2SNORM:
279 case PixelFormat::DXN2UNORM:
280 case PixelFormat::BC7U:
281 case PixelFormat::BC6H_UF16:
282 case PixelFormat::BC6H_SF16:
283 case PixelFormat::DXT1_SRGB:
284 case PixelFormat::DXT23_SRGB:
285 case PixelFormat::DXT45_SRGB:
286 case PixelFormat::BC7U_SRGB:
287 return true;
288 default:
289 return false;
290 }
291}
292
293} // namespace VideoCore::Surface 286} // namespace VideoCore::Surface
diff --git a/src/video_core/surface.h b/src/video_core/surface.h
index 6da6a1b97..cfd12fa61 100644
--- a/src/video_core/surface.h
+++ b/src/video_core/surface.h
@@ -15,94 +15,105 @@
15namespace VideoCore::Surface { 15namespace VideoCore::Surface {
16 16
17enum class PixelFormat { 17enum class PixelFormat {
18 ABGR8U = 0, 18 A8B8G8R8_UNORM,
19 ABGR8S = 1, 19 A8B8G8R8_SNORM,
20 ABGR8UI = 2, 20 A8B8G8R8_SINT,
21 B5G6R5U = 3, 21 A8B8G8R8_UINT,
22 A2B10G10R10U = 4, 22 R5G6B5_UNORM,
23 A1B5G5R5U = 5, 23 B5G6R5_UNORM,
24 R8U = 6, 24 A1R5G5B5_UNORM,
25 R8UI = 7, 25 A2B10G10R10_UNORM,
26 RGBA16F = 8, 26 A2B10G10R10_UINT,
27 RGBA16U = 9, 27 A1B5G5R5_UNORM,
28 RGBA16S = 10, 28 R8_UNORM,
29 RGBA16UI = 11, 29 R8_SNORM,
30 R11FG11FB10F = 12, 30 R8_SINT,
31 RGBA32UI = 13, 31 R8_UINT,
32 DXT1 = 14, 32 R16G16B16A16_FLOAT,
33 DXT23 = 15, 33 R16G16B16A16_UNORM,
34 DXT45 = 16, 34 R16G16B16A16_SNORM,
35 DXN1 = 17, // This is also known as BC4 35 R16G16B16A16_SINT,
36 DXN2UNORM = 18, 36 R16G16B16A16_UINT,
37 DXN2SNORM = 19, 37 B10G11R11_FLOAT,
38 BC7U = 20, 38 R32G32B32A32_UINT,
39 BC6H_UF16 = 21, 39 BC1_RGBA_UNORM,
40 BC6H_SF16 = 22, 40 BC2_UNORM,
41 ASTC_2D_4X4 = 23, 41 BC3_UNORM,
42 BGRA8 = 24, 42 BC4_UNORM,
43 RGBA32F = 25, 43 BC4_SNORM,
44 RG32F = 26, 44 BC5_UNORM,
45 R32F = 27, 45 BC5_SNORM,
46 R16F = 28, 46 BC7_UNORM,
47 R16U = 29, 47 BC6H_UFLOAT,
48 R16S = 30, 48 BC6H_SFLOAT,
49 R16UI = 31, 49 ASTC_2D_4X4_UNORM,
50 R16I = 32, 50 B8G8R8A8_UNORM,
51 RG16 = 33, 51 R32G32B32A32_FLOAT,
52 RG16F = 34, 52 R32G32B32A32_SINT,
53 RG16UI = 35, 53 R32G32_FLOAT,
54 RG16I = 36, 54 R32G32_SINT,
55 RG16S = 37, 55 R32_FLOAT,
56 RGB32F = 38, 56 R16_FLOAT,
57 RGBA8_SRGB = 39, 57 R16_UNORM,
58 RG8U = 40, 58 R16_SNORM,
59 RG8S = 41, 59 R16_UINT,
60 RG8UI = 42, 60 R16_SINT,
61 RG32UI = 43, 61 R16G16_UNORM,
62 RGBX16F = 44, 62 R16G16_FLOAT,
63 R32UI = 45, 63 R16G16_UINT,
64 R32I = 46, 64 R16G16_SINT,
65 ASTC_2D_8X8 = 47, 65 R16G16_SNORM,
66 ASTC_2D_8X5 = 48, 66 R32G32B32_FLOAT,
67 ASTC_2D_5X4 = 49, 67 A8B8G8R8_SRGB,
68 BGRA8_SRGB = 50, 68 R8G8_UNORM,
69 DXT1_SRGB = 51, 69 R8G8_SNORM,
70 DXT23_SRGB = 52, 70 R8G8_SINT,
71 DXT45_SRGB = 53, 71 R8G8_UINT,
72 BC7U_SRGB = 54, 72 R32G32_UINT,
73 R4G4B4A4U = 55, 73 R16G16B16X16_FLOAT,
74 ASTC_2D_4X4_SRGB = 56, 74 R32_UINT,
75 ASTC_2D_8X8_SRGB = 57, 75 R32_SINT,
76 ASTC_2D_8X5_SRGB = 58, 76 ASTC_2D_8X8_UNORM,
77 ASTC_2D_5X4_SRGB = 59, 77 ASTC_2D_8X5_UNORM,
78 ASTC_2D_5X5 = 60, 78 ASTC_2D_5X4_UNORM,
79 ASTC_2D_5X5_SRGB = 61, 79 B8G8R8A8_SRGB,
80 ASTC_2D_10X8 = 62, 80 BC1_RGBA_SRGB,
81 ASTC_2D_10X8_SRGB = 63, 81 BC2_SRGB,
82 ASTC_2D_6X6 = 64, 82 BC3_SRGB,
83 ASTC_2D_6X6_SRGB = 65, 83 BC7_SRGB,
84 ASTC_2D_10X10 = 66, 84 A4B4G4R4_UNORM,
85 ASTC_2D_10X10_SRGB = 67, 85 ASTC_2D_4X4_SRGB,
86 ASTC_2D_12X12 = 68, 86 ASTC_2D_8X8_SRGB,
87 ASTC_2D_12X12_SRGB = 69, 87 ASTC_2D_8X5_SRGB,
88 ASTC_2D_8X6 = 70, 88 ASTC_2D_5X4_SRGB,
89 ASTC_2D_8X6_SRGB = 71, 89 ASTC_2D_5X5_UNORM,
90 ASTC_2D_6X5 = 72, 90 ASTC_2D_5X5_SRGB,
91 ASTC_2D_6X5_SRGB = 73, 91 ASTC_2D_10X8_UNORM,
92 E5B9G9R9F = 74, 92 ASTC_2D_10X8_SRGB,
93 ASTC_2D_6X6_UNORM,
94 ASTC_2D_6X6_SRGB,
95 ASTC_2D_10X10_UNORM,
96 ASTC_2D_10X10_SRGB,
97 ASTC_2D_12X12_UNORM,
98 ASTC_2D_12X12_SRGB,
99 ASTC_2D_8X6_UNORM,
100 ASTC_2D_8X6_SRGB,
101 ASTC_2D_6X5_UNORM,
102 ASTC_2D_6X5_SRGB,
103 E5B9G9R9_FLOAT,
93 104
94 MaxColorFormat, 105 MaxColorFormat,
95 106
96 // Depth formats 107 // Depth formats
97 Z32F = 75, 108 D32_FLOAT = MaxColorFormat,
98 Z16 = 76, 109 D16_UNORM,
99 110
100 MaxDepthFormat, 111 MaxDepthFormat,
101 112
102 // DepthStencil formats 113 // DepthStencil formats
103 Z24S8 = 77, 114 D24_UNORM_S8_UINT = MaxDepthFormat,
104 S8Z24 = 78, 115 S8_UINT_D24_UNORM,
105 Z32FS8 = 79, 116 D32_FLOAT_S8_UINT,
106 117
107 MaxDepthStencilFormat, 118 MaxDepthStencilFormat,
108 119
@@ -130,86 +141,97 @@ enum class SurfaceTarget {
130}; 141};
131 142
132constexpr std::array<u32, MaxPixelFormat> compression_factor_shift_table = {{ 143constexpr std::array<u32, MaxPixelFormat> compression_factor_shift_table = {{
133 0, // ABGR8U 144 0, // A8B8G8R8_UNORM
134 0, // ABGR8S 145 0, // A8B8G8R8_SNORM
135 0, // ABGR8UI 146 0, // A8B8G8R8_SINT
136 0, // B5G6R5U 147 0, // A8B8G8R8_UINT
137 0, // A2B10G10R10U 148 0, // R5G6B5_UNORM
138 0, // A1B5G5R5U 149 0, // B5G6R5_UNORM
139 0, // R8U 150 0, // A1R5G5B5_UNORM
140 0, // R8UI 151 0, // A2B10G10R10_UNORM
141 0, // RGBA16F 152 0, // A2B10G10R10_UINT
142 0, // RGBA16U 153 0, // A1B5G5R5_UNORM
143 0, // RGBA16S 154 0, // R8_UNORM
144 0, // RGBA16UI 155 0, // R8_SNORM
145 0, // R11FG11FB10F 156 0, // R8_SINT
146 0, // RGBA32UI 157 0, // R8_UINT
147 2, // DXT1 158 0, // R16G16B16A16_FLOAT
148 2, // DXT23 159 0, // R16G16B16A16_UNORM
149 2, // DXT45 160 0, // R16G16B16A16_SNORM
150 2, // DXN1 161 0, // R16G16B16A16_SINT
151 2, // DXN2UNORM 162 0, // R16G16B16A16_UINT
152 2, // DXN2SNORM 163 0, // B10G11R11_FLOAT
153 2, // BC7U 164 0, // R32G32B32A32_UINT
154 2, // BC6H_UF16 165 2, // BC1_RGBA_UNORM
155 2, // BC6H_SF16 166 2, // BC2_UNORM
156 2, // ASTC_2D_4X4 167 2, // BC3_UNORM
157 0, // BGRA8 168 2, // BC4_UNORM
158 0, // RGBA32F 169 2, // BC4_SNORM
159 0, // RG32F 170 2, // BC5_UNORM
160 0, // R32F 171 2, // BC5_SNORM
161 0, // R16F 172 2, // BC7_UNORM
162 0, // R16U 173 2, // BC6H_UFLOAT
163 0, // R16S 174 2, // BC6H_SFLOAT
164 0, // R16UI 175 2, // ASTC_2D_4X4_UNORM
165 0, // R16I 176 0, // B8G8R8A8_UNORM
166 0, // RG16 177 0, // R32G32B32A32_FLOAT
167 0, // RG16F 178 0, // R32G32B32A32_SINT
168 0, // RG16UI 179 0, // R32G32_FLOAT
169 0, // RG16I 180 0, // R32G32_SINT
170 0, // RG16S 181 0, // R32_FLOAT
171 0, // RGB32F 182 0, // R16_FLOAT
172 0, // RGBA8_SRGB 183 0, // R16_UNORM
173 0, // RG8U 184 0, // R16_SNORM
174 0, // RG8S 185 0, // R16_UINT
175 0, // RG8UI 186 0, // R16_SINT
176 0, // RG32UI 187 0, // R16G16_UNORM
177 0, // RGBX16F 188 0, // R16G16_FLOAT
178 0, // R32UI 189 0, // R16G16_UINT
179 0, // R32I 190 0, // R16G16_SINT
180 2, // ASTC_2D_8X8 191 0, // R16G16_SNORM
181 2, // ASTC_2D_8X5 192 0, // R32G32B32_FLOAT
182 2, // ASTC_2D_5X4 193 0, // A8B8G8R8_SRGB
183 0, // BGRA8_SRGB 194 0, // R8G8_UNORM
184 2, // DXT1_SRGB 195 0, // R8G8_SNORM
185 2, // DXT23_SRGB 196 0, // R8G8_SINT
186 2, // DXT45_SRGB 197 0, // R8G8_UINT
187 2, // BC7U_SRGB 198 0, // R32G32_UINT
188 0, // R4G4B4A4U 199 0, // R16G16B16X16_FLOAT
200 0, // R32_UINT
201 0, // R32_SINT
202 2, // ASTC_2D_8X8_UNORM
203 2, // ASTC_2D_8X5_UNORM
204 2, // ASTC_2D_5X4_UNORM
205 0, // B8G8R8A8_SRGB
206 2, // BC1_RGBA_SRGB
207 2, // BC2_SRGB
208 2, // BC3_SRGB
209 2, // BC7_SRGB
210 0, // A4B4G4R4_UNORM
189 2, // ASTC_2D_4X4_SRGB 211 2, // ASTC_2D_4X4_SRGB
190 2, // ASTC_2D_8X8_SRGB 212 2, // ASTC_2D_8X8_SRGB
191 2, // ASTC_2D_8X5_SRGB 213 2, // ASTC_2D_8X5_SRGB
192 2, // ASTC_2D_5X4_SRGB 214 2, // ASTC_2D_5X4_SRGB
193 2, // ASTC_2D_5X5 215 2, // ASTC_2D_5X5_UNORM
194 2, // ASTC_2D_5X5_SRGB 216 2, // ASTC_2D_5X5_SRGB
195 2, // ASTC_2D_10X8 217 2, // ASTC_2D_10X8_UNORM
196 2, // ASTC_2D_10X8_SRGB 218 2, // ASTC_2D_10X8_SRGB
197 2, // ASTC_2D_6X6 219 2, // ASTC_2D_6X6_UNORM
198 2, // ASTC_2D_6X6_SRGB 220 2, // ASTC_2D_6X6_SRGB
199 2, // ASTC_2D_10X10 221 2, // ASTC_2D_10X10_UNORM
200 2, // ASTC_2D_10X10_SRGB 222 2, // ASTC_2D_10X10_SRGB
201 2, // ASTC_2D_12X12 223 2, // ASTC_2D_12X12_UNORM
202 2, // ASTC_2D_12X12_SRGB 224 2, // ASTC_2D_12X12_SRGB
203 2, // ASTC_2D_8X6 225 2, // ASTC_2D_8X6_UNORM
204 2, // ASTC_2D_8X6_SRGB 226 2, // ASTC_2D_8X6_SRGB
205 2, // ASTC_2D_6X5 227 2, // ASTC_2D_6X5_UNORM
206 2, // ASTC_2D_6X5_SRGB 228 2, // ASTC_2D_6X5_SRGB
207 0, // E5B9G9R9F 229 0, // E5B9G9R9_FLOAT
208 0, // Z32F 230 0, // D32_FLOAT
209 0, // Z16 231 0, // D16_UNORM
210 0, // Z24S8 232 0, // D24_UNORM_S8_UINT
211 0, // S8Z24 233 0, // S8_UINT_D24_UNORM
212 0, // Z32FS8 234 0, // D32_FLOAT_S8_UINT
213}}; 235}};
214 236
215/** 237/**
@@ -229,86 +251,97 @@ inline constexpr u32 GetCompressionFactor(PixelFormat format) {
229} 251}
230 252
231constexpr std::array<u32, MaxPixelFormat> block_width_table = {{ 253constexpr std::array<u32, MaxPixelFormat> block_width_table = {{
232 1, // ABGR8U 254 1, // A8B8G8R8_UNORM
233 1, // ABGR8S 255 1, // A8B8G8R8_SNORM
234 1, // ABGR8UI 256 1, // A8B8G8R8_SINT
235 1, // B5G6R5U 257 1, // A8B8G8R8_UINT
236 1, // A2B10G10R10U 258 1, // R5G6B5_UNORM
237 1, // A1B5G5R5U 259 1, // B5G6R5_UNORM
238 1, // R8U 260 1, // A1R5G5B5_UNORM
239 1, // R8UI 261 1, // A2B10G10R10_UNORM
240 1, // RGBA16F 262 1, // A2B10G10R10_UINT
241 1, // RGBA16U 263 1, // A1B5G5R5_UNORM
242 1, // RGBA16S 264 1, // R8_UNORM
243 1, // RGBA16UI 265 1, // R8_SNORM
244 1, // R11FG11FB10F 266 1, // R8_SINT
245 1, // RGBA32UI 267 1, // R8_UINT
246 4, // DXT1 268 1, // R16G16B16A16_FLOAT
247 4, // DXT23 269 1, // R16G16B16A16_UNORM
248 4, // DXT45 270 1, // R16G16B16A16_SNORM
249 4, // DXN1 271 1, // R16G16B16A16_SINT
250 4, // DXN2UNORM 272 1, // R16G16B16A16_UINT
251 4, // DXN2SNORM 273 1, // B10G11R11_FLOAT
252 4, // BC7U 274 1, // R32G32B32A32_UINT
253 4, // BC6H_UF16 275 4, // BC1_RGBA_UNORM
254 4, // BC6H_SF16 276 4, // BC2_UNORM
255 4, // ASTC_2D_4X4 277 4, // BC3_UNORM
256 1, // BGRA8 278 4, // BC4_UNORM
257 1, // RGBA32F 279 4, // BC4_SNORM
258 1, // RG32F 280 4, // BC5_UNORM
259 1, // R32F 281 4, // BC5_SNORM
260 1, // R16F 282 4, // BC7_UNORM
261 1, // R16U 283 4, // BC6H_UFLOAT
262 1, // R16S 284 4, // BC6H_SFLOAT
263 1, // R16UI 285 4, // ASTC_2D_4X4_UNORM
264 1, // R16I 286 1, // B8G8R8A8_UNORM
265 1, // RG16 287 1, // R32G32B32A32_FLOAT
266 1, // RG16F 288 1, // R32G32B32A32_SINT
267 1, // RG16UI 289 1, // R32G32_FLOAT
268 1, // RG16I 290 1, // R32G32_SINT
269 1, // RG16S 291 1, // R32_FLOAT
270 1, // RGB32F 292 1, // R16_FLOAT
271 1, // RGBA8_SRGB 293 1, // R16_UNORM
272 1, // RG8U 294 1, // R16_SNORM
273 1, // RG8S 295 1, // R16_UINT
274 1, // RG8UI 296 1, // R16_SINT
275 1, // RG32UI 297 1, // R16G16_UNORM
276 1, // RGBX16F 298 1, // R16G16_FLOAT
277 1, // R32UI 299 1, // R16G16_UINT
278 1, // R32I 300 1, // R16G16_SINT
279 8, // ASTC_2D_8X8 301 1, // R16G16_SNORM
280 8, // ASTC_2D_8X5 302 1, // R32G32B32_FLOAT
281 5, // ASTC_2D_5X4 303 1, // A8B8G8R8_SRGB
282 1, // BGRA8_SRGB 304 1, // R8G8_UNORM
283 4, // DXT1_SRGB 305 1, // R8G8_SNORM
284 4, // DXT23_SRGB 306 1, // R8G8_SINT
285 4, // DXT45_SRGB 307 1, // R8G8_UINT
286 4, // BC7U_SRGB 308 1, // R32G32_UINT
287 1, // R4G4B4A4U 309 1, // R16G16B16X16_FLOAT
310 1, // R32_UINT
311 1, // R32_SINT
312 8, // ASTC_2D_8X8_UNORM
313 8, // ASTC_2D_8X5_UNORM
314 5, // ASTC_2D_5X4_UNORM
315 1, // B8G8R8A8_SRGB
316 4, // BC1_RGBA_SRGB
317 4, // BC2_SRGB
318 4, // BC3_SRGB
319 4, // BC7_SRGB
320 1, // A4B4G4R4_UNORM
288 4, // ASTC_2D_4X4_SRGB 321 4, // ASTC_2D_4X4_SRGB
289 8, // ASTC_2D_8X8_SRGB 322 8, // ASTC_2D_8X8_SRGB
290 8, // ASTC_2D_8X5_SRGB 323 8, // ASTC_2D_8X5_SRGB
291 5, // ASTC_2D_5X4_SRGB 324 5, // ASTC_2D_5X4_SRGB
292 5, // ASTC_2D_5X5 325 5, // ASTC_2D_5X5_UNORM
293 5, // ASTC_2D_5X5_SRGB 326 5, // ASTC_2D_5X5_SRGB
294 10, // ASTC_2D_10X8 327 10, // ASTC_2D_10X8_UNORM
295 10, // ASTC_2D_10X8_SRGB 328 10, // ASTC_2D_10X8_SRGB
296 6, // ASTC_2D_6X6 329 6, // ASTC_2D_6X6_UNORM
297 6, // ASTC_2D_6X6_SRGB 330 6, // ASTC_2D_6X6_SRGB
298 10, // ASTC_2D_10X10 331 10, // ASTC_2D_10X10_UNORM
299 10, // ASTC_2D_10X10_SRGB 332 10, // ASTC_2D_10X10_SRGB
300 12, // ASTC_2D_12X12 333 12, // ASTC_2D_12X12_UNORM
301 12, // ASTC_2D_12X12_SRGB 334 12, // ASTC_2D_12X12_SRGB
302 8, // ASTC_2D_8X6 335 8, // ASTC_2D_8X6_UNORM
303 8, // ASTC_2D_8X6_SRGB 336 8, // ASTC_2D_8X6_SRGB
304 6, // ASTC_2D_6X5 337 6, // ASTC_2D_6X5_UNORM
305 6, // ASTC_2D_6X5_SRGB 338 6, // ASTC_2D_6X5_SRGB
306 1, // E5B9G9R9F 339 1, // E5B9G9R9_FLOAT
307 1, // Z32F 340 1, // D32_FLOAT
308 1, // Z16 341 1, // D16_UNORM
309 1, // Z24S8 342 1, // D24_UNORM_S8_UINT
310 1, // S8Z24 343 1, // S8_UINT_D24_UNORM
311 1, // Z32FS8 344 1, // D32_FLOAT_S8_UINT
312}}; 345}};
313 346
314static constexpr u32 GetDefaultBlockWidth(PixelFormat format) { 347static constexpr u32 GetDefaultBlockWidth(PixelFormat format) {
@@ -320,86 +353,97 @@ static constexpr u32 GetDefaultBlockWidth(PixelFormat format) {
320} 353}
321 354
322constexpr std::array<u32, MaxPixelFormat> block_height_table = {{ 355constexpr std::array<u32, MaxPixelFormat> block_height_table = {{
323 1, // ABGR8U 356 1, // A8B8G8R8_UNORM
324 1, // ABGR8S 357 1, // A8B8G8R8_SNORM
325 1, // ABGR8UI 358 1, // A8B8G8R8_SINT
326 1, // B5G6R5U 359 1, // A8B8G8R8_UINT
327 1, // A2B10G10R10U 360 1, // R5G6B5_UNORM
328 1, // A1B5G5R5U 361 1, // B5G6R5_UNORM
329 1, // R8U 362 1, // A1R5G5B5_UNORM
330 1, // R8UI 363 1, // A2B10G10R10_UNORM
331 1, // RGBA16F 364 1, // A2B10G10R10_UINT
332 1, // RGBA16U 365 1, // A1B5G5R5_UNORM
333 1, // RGBA16S 366 1, // R8_UNORM
334 1, // RGBA16UI 367 1, // R8_SNORM
335 1, // R11FG11FB10F 368 1, // R8_SINT
336 1, // RGBA32UI 369 1, // R8_UINT
337 4, // DXT1 370 1, // R16G16B16A16_FLOAT
338 4, // DXT23 371 1, // R16G16B16A16_UNORM
339 4, // DXT45 372 1, // R16G16B16A16_SNORM
340 4, // DXN1 373 1, // R16G16B16A16_SINT
341 4, // DXN2UNORM 374 1, // R16G16B16A16_UINT
342 4, // DXN2SNORM 375 1, // B10G11R11_FLOAT
343 4, // BC7U 376 1, // R32G32B32A32_UINT
344 4, // BC6H_UF16 377 4, // BC1_RGBA_UNORM
345 4, // BC6H_SF16 378 4, // BC2_UNORM
346 4, // ASTC_2D_4X4 379 4, // BC3_UNORM
347 1, // BGRA8 380 4, // BC4_UNORM
348 1, // RGBA32F 381 4, // BC4_SNORM
349 1, // RG32F 382 4, // BC5_UNORM
350 1, // R32F 383 4, // BC5_SNORM
351 1, // R16F 384 4, // BC7_UNORM
352 1, // R16U 385 4, // BC6H_UFLOAT
353 1, // R16S 386 4, // BC6H_SFLOAT
354 1, // R16UI 387 4, // ASTC_2D_4X4_UNORM
355 1, // R16I 388 1, // B8G8R8A8_UNORM
356 1, // RG16 389 1, // R32G32B32A32_FLOAT
357 1, // RG16F 390 1, // R32G32B32A32_SINT
358 1, // RG16UI 391 1, // R32G32_FLOAT
359 1, // RG16I 392 1, // R32G32_SINT
360 1, // RG16S 393 1, // R32_FLOAT
361 1, // RGB32F 394 1, // R16_FLOAT
362 1, // RGBA8_SRGB 395 1, // R16_UNORM
363 1, // RG8U 396 1, // R16_SNORM
364 1, // RG8S 397 1, // R16_UINT
365 1, // RG8UI 398 1, // R16_SINT
366 1, // RG32UI 399 1, // R16G16_UNORM
367 1, // RGBX16F 400 1, // R16G16_FLOAT
368 1, // R32UI 401 1, // R16G16_UINT
369 1, // R32I 402 1, // R16G16_SINT
370 8, // ASTC_2D_8X8 403 1, // R16G16_SNORM
371 5, // ASTC_2D_8X5 404 1, // R32G32B32_FLOAT
372 4, // ASTC_2D_5X4 405 1, // A8B8G8R8_SRGB
373 1, // BGRA8_SRGB 406 1, // R8G8_UNORM
374 4, // DXT1_SRGB 407 1, // R8G8_SNORM
375 4, // DXT23_SRGB 408 1, // R8G8_SINT
376 4, // DXT45_SRGB 409 1, // R8G8_UINT
377 4, // BC7U_SRGB 410 1, // R32G32_UINT
378 1, // R4G4B4A4U 411 1, // R16G16B16X16_FLOAT
412 1, // R32_UINT
413 1, // R32_SINT
414 8, // ASTC_2D_8X8_UNORM
415 5, // ASTC_2D_8X5_UNORM
416 4, // ASTC_2D_5X4_UNORM
417 1, // B8G8R8A8_SRGB
418 4, // BC1_RGBA_SRGB
419 4, // BC2_SRGB
420 4, // BC3_SRGB
421 4, // BC7_SRGB
422 1, // A4B4G4R4_UNORM
379 4, // ASTC_2D_4X4_SRGB 423 4, // ASTC_2D_4X4_SRGB
380 8, // ASTC_2D_8X8_SRGB 424 8, // ASTC_2D_8X8_SRGB
381 5, // ASTC_2D_8X5_SRGB 425 5, // ASTC_2D_8X5_SRGB
382 4, // ASTC_2D_5X4_SRGB 426 4, // ASTC_2D_5X4_SRGB
383 5, // ASTC_2D_5X5 427 5, // ASTC_2D_5X5_UNORM
384 5, // ASTC_2D_5X5_SRGB 428 5, // ASTC_2D_5X5_SRGB
385 8, // ASTC_2D_10X8 429 8, // ASTC_2D_10X8_UNORM
386 8, // ASTC_2D_10X8_SRGB 430 8, // ASTC_2D_10X8_SRGB
387 6, // ASTC_2D_6X6 431 6, // ASTC_2D_6X6_UNORM
388 6, // ASTC_2D_6X6_SRGB 432 6, // ASTC_2D_6X6_SRGB
389 10, // ASTC_2D_10X10 433 10, // ASTC_2D_10X10_UNORM
390 10, // ASTC_2D_10X10_SRGB 434 10, // ASTC_2D_10X10_SRGB
391 12, // ASTC_2D_12X12 435 12, // ASTC_2D_12X12_UNORM
392 12, // ASTC_2D_12X12_SRGB 436 12, // ASTC_2D_12X12_SRGB
393 6, // ASTC_2D_8X6 437 6, // ASTC_2D_8X6_UNORM
394 6, // ASTC_2D_8X6_SRGB 438 6, // ASTC_2D_8X6_SRGB
395 5, // ASTC_2D_6X5 439 5, // ASTC_2D_6X5_UNORM
396 5, // ASTC_2D_6X5_SRGB 440 5, // ASTC_2D_6X5_SRGB
397 1, // E5B9G9R9F 441 1, // E5B9G9R9_FLOAT
398 1, // Z32F 442 1, // D32_FLOAT
399 1, // Z16 443 1, // D16_UNORM
400 1, // Z24S8 444 1, // D24_UNORM_S8_UINT
401 1, // S8Z24 445 1, // S8_UINT_D24_UNORM
402 1, // Z32FS8 446 1, // D32_FLOAT_S8_UINT
403}}; 447}};
404 448
405static constexpr u32 GetDefaultBlockHeight(PixelFormat format) { 449static constexpr u32 GetDefaultBlockHeight(PixelFormat format) {
@@ -411,86 +455,97 @@ static constexpr u32 GetDefaultBlockHeight(PixelFormat format) {
411} 455}
412 456
413constexpr std::array<u32, MaxPixelFormat> bpp_table = {{ 457constexpr std::array<u32, MaxPixelFormat> bpp_table = {{
414 32, // ABGR8U 458 32, // A8B8G8R8_UNORM
415 32, // ABGR8S 459 32, // A8B8G8R8_SNORM
416 32, // ABGR8UI 460 32, // A8B8G8R8_SINT
417 16, // B5G6R5U 461 32, // A8B8G8R8_UINT
418 32, // A2B10G10R10U 462 16, // R5G6B5_UNORM
419 16, // A1B5G5R5U 463 16, // B5G6R5_UNORM
420 8, // R8U 464 16, // A1R5G5B5_UNORM
421 8, // R8UI 465 32, // A2B10G10R10_UNORM
422 64, // RGBA16F 466 32, // A2B10G10R10_UINT
423 64, // RGBA16U 467 16, // A1B5G5R5_UNORM
424 64, // RGBA16S 468 8, // R8_UNORM
425 64, // RGBA16UI 469 8, // R8_SNORM
426 32, // R11FG11FB10F 470 8, // R8_SINT
427 128, // RGBA32UI 471 8, // R8_UINT
428 64, // DXT1 472 64, // R16G16B16A16_FLOAT
429 128, // DXT23 473 64, // R16G16B16A16_UNORM
430 128, // DXT45 474 64, // R16G16B16A16_SNORM
431 64, // DXN1 475 64, // R16G16B16A16_SINT
432 128, // DXN2UNORM 476 64, // R16G16B16A16_UINT
433 128, // DXN2SNORM 477 32, // B10G11R11_FLOAT
434 128, // BC7U 478 128, // R32G32B32A32_UINT
435 128, // BC6H_UF16 479 64, // BC1_RGBA_UNORM
436 128, // BC6H_SF16 480 128, // BC2_UNORM
437 128, // ASTC_2D_4X4 481 128, // BC3_UNORM
438 32, // BGRA8 482 64, // BC4_UNORM
439 128, // RGBA32F 483 64, // BC4_SNORM
440 64, // RG32F 484 128, // BC5_UNORM
441 32, // R32F 485 128, // BC5_SNORM
442 16, // R16F 486 128, // BC7_UNORM
443 16, // R16U 487 128, // BC6H_UFLOAT
444 16, // R16S 488 128, // BC6H_SFLOAT
445 16, // R16UI 489 128, // ASTC_2D_4X4_UNORM
446 16, // R16I 490 32, // B8G8R8A8_UNORM
447 32, // RG16 491 128, // R32G32B32A32_FLOAT
448 32, // RG16F 492 128, // R32G32B32A32_SINT
449 32, // RG16UI 493 64, // R32G32_FLOAT
450 32, // RG16I 494 64, // R32G32_SINT
451 32, // RG16S 495 32, // R32_FLOAT
452 96, // RGB32F 496 16, // R16_FLOAT
453 32, // RGBA8_SRGB 497 16, // R16_UNORM
454 16, // RG8U 498 16, // R16_SNORM
455 16, // RG8S 499 16, // R16_UINT
456 16, // RG8UI 500 16, // R16_SINT
457 64, // RG32UI 501 32, // R16G16_UNORM
458 64, // RGBX16F 502 32, // R16G16_FLOAT
459 32, // R32UI 503 32, // R16G16_UINT
460 32, // R32I 504 32, // R16G16_SINT
461 128, // ASTC_2D_8X8 505 32, // R16G16_SNORM
462 128, // ASTC_2D_8X5 506 96, // R32G32B32_FLOAT
463 128, // ASTC_2D_5X4 507 32, // A8B8G8R8_SRGB
464 32, // BGRA8_SRGB 508 16, // R8G8_UNORM
465 64, // DXT1_SRGB 509 16, // R8G8_SNORM
466 128, // DXT23_SRGB 510 16, // R8G8_SINT
467 128, // DXT45_SRGB 511 16, // R8G8_UINT
468 128, // BC7U 512 64, // R32G32_UINT
469 16, // R4G4B4A4U 513 64, // R16G16B16X16_FLOAT
514 32, // R32_UINT
515 32, // R32_SINT
516 128, // ASTC_2D_8X8_UNORM
517 128, // ASTC_2D_8X5_UNORM
518 128, // ASTC_2D_5X4_UNORM
519 32, // B8G8R8A8_SRGB
520 64, // BC1_RGBA_SRGB
521 128, // BC2_SRGB
522 128, // BC3_SRGB
523 128, // BC7_UNORM
524 16, // A4B4G4R4_UNORM
470 128, // ASTC_2D_4X4_SRGB 525 128, // ASTC_2D_4X4_SRGB
471 128, // ASTC_2D_8X8_SRGB 526 128, // ASTC_2D_8X8_SRGB
472 128, // ASTC_2D_8X5_SRGB 527 128, // ASTC_2D_8X5_SRGB
473 128, // ASTC_2D_5X4_SRGB 528 128, // ASTC_2D_5X4_SRGB
474 128, // ASTC_2D_5X5 529 128, // ASTC_2D_5X5_UNORM
475 128, // ASTC_2D_5X5_SRGB 530 128, // ASTC_2D_5X5_SRGB
476 128, // ASTC_2D_10X8 531 128, // ASTC_2D_10X8_UNORM
477 128, // ASTC_2D_10X8_SRGB 532 128, // ASTC_2D_10X8_SRGB
478 128, // ASTC_2D_6X6 533 128, // ASTC_2D_6X6_UNORM
479 128, // ASTC_2D_6X6_SRGB 534 128, // ASTC_2D_6X6_SRGB
480 128, // ASTC_2D_10X10 535 128, // ASTC_2D_10X10_UNORM
481 128, // ASTC_2D_10X10_SRGB 536 128, // ASTC_2D_10X10_SRGB
482 128, // ASTC_2D_12X12 537 128, // ASTC_2D_12X12_UNORM
483 128, // ASTC_2D_12X12_SRGB 538 128, // ASTC_2D_12X12_SRGB
484 128, // ASTC_2D_8X6 539 128, // ASTC_2D_8X6_UNORM
485 128, // ASTC_2D_8X6_SRGB 540 128, // ASTC_2D_8X6_SRGB
486 128, // ASTC_2D_6X5 541 128, // ASTC_2D_6X5_UNORM
487 128, // ASTC_2D_6X5_SRGB 542 128, // ASTC_2D_6X5_SRGB
488 32, // E5B9G9R9F 543 32, // E5B9G9R9_FLOAT
489 32, // Z32F 544 32, // D32_FLOAT
490 16, // Z16 545 16, // D16_UNORM
491 32, // Z24S8 546 32, // D24_UNORM_S8_UINT
492 32, // S8Z24 547 32, // S8_UINT_D24_UNORM
493 64, // Z32FS8 548 64, // D32_FLOAT_S8_UINT
494}}; 549}};
495 550
496static constexpr u32 GetFormatBpp(PixelFormat format) { 551static constexpr u32 GetFormatBpp(PixelFormat format) {
@@ -529,7 +584,4 @@ bool IsPixelFormatSRGB(PixelFormat format);
529 584
530std::pair<u32, u32> GetASTCBlockSize(PixelFormat format); 585std::pair<u32, u32> GetASTCBlockSize(PixelFormat format);
531 586
532/// Returns true if the specified PixelFormat is a BCn format, e.g. DXT or DXN
533bool IsFormatBCn(PixelFormat format);
534
535} // namespace VideoCore::Surface 587} // namespace VideoCore::Surface
diff --git a/src/video_core/texture_cache/format_lookup_table.cpp b/src/video_core/texture_cache/format_lookup_table.cpp
index f476f03b0..a1cc4756d 100644
--- a/src/video_core/texture_cache/format_lookup_table.cpp
+++ b/src/video_core/texture_cache/format_lookup_table.cpp
@@ -41,119 +41,126 @@ struct Table {
41 ComponentType alpha_component; 41 ComponentType alpha_component;
42 bool is_srgb; 42 bool is_srgb;
43}; 43};
44constexpr std::array<Table, 78> DefinitionTable = {{ 44constexpr std::array<Table, 86> DefinitionTable = {{
45 {TextureFormat::A8R8G8B8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ABGR8U}, 45 {TextureFormat::A8R8G8B8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A8B8G8R8_UNORM},
46 {TextureFormat::A8R8G8B8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::ABGR8S}, 46 {TextureFormat::A8R8G8B8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::A8B8G8R8_SNORM},
47 {TextureFormat::A8R8G8B8, C, UINT, UINT, UINT, UINT, PixelFormat::ABGR8UI}, 47 {TextureFormat::A8R8G8B8, C, UINT, UINT, UINT, UINT, PixelFormat::A8B8G8R8_UINT},
48 {TextureFormat::A8R8G8B8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::RGBA8_SRGB}, 48 {TextureFormat::A8R8G8B8, C, SINT, SINT, SINT, SINT, PixelFormat::A8B8G8R8_SINT},
49 {TextureFormat::A8R8G8B8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::A8B8G8R8_SRGB},
49 50
50 {TextureFormat::B5G6R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::B5G6R5U}, 51 {TextureFormat::B5G6R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::B5G6R5_UNORM},
51 52
52 {TextureFormat::A2B10G10R10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A2B10G10R10U}, 53 {TextureFormat::A2B10G10R10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A2B10G10R10_UNORM},
54 {TextureFormat::A2B10G10R10, C, UINT, UINT, UINT, UINT, PixelFormat::A2B10G10R10_UINT},
53 55
54 {TextureFormat::A1B5G5R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A1B5G5R5U}, 56 {TextureFormat::A1B5G5R5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A1B5G5R5_UNORM},
55 57
56 {TextureFormat::A4B4G4R4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R4G4B4A4U}, 58 {TextureFormat::A4B4G4R4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::A4B4G4R4_UNORM},
57 59
58 {TextureFormat::R8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R8U}, 60 {TextureFormat::R8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R8_UNORM},
59 {TextureFormat::R8, C, UINT, UINT, UINT, UINT, PixelFormat::R8UI}, 61 {TextureFormat::R8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R8_SNORM},
62 {TextureFormat::R8, C, UINT, UINT, UINT, UINT, PixelFormat::R8_UINT},
63 {TextureFormat::R8, C, SINT, SINT, SINT, SINT, PixelFormat::R8_SINT},
60 64
61 {TextureFormat::G8R8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::RG8U}, 65 {TextureFormat::R8G8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R8G8_UNORM},
62 {TextureFormat::G8R8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::RG8S}, 66 {TextureFormat::R8G8, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R8G8_SNORM},
63 {TextureFormat::G8R8, C, UINT, UINT, UINT, UINT, PixelFormat::RG8UI}, 67 {TextureFormat::R8G8, C, UINT, UINT, UINT, UINT, PixelFormat::R8G8_UINT},
68 {TextureFormat::R8G8, C, SINT, SINT, SINT, SINT, PixelFormat::R8G8_SINT},
64 69
65 {TextureFormat::R16_G16_B16_A16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::RGBA16S}, 70 {TextureFormat::R16G16B16A16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16G16B16A16_SNORM},
66 {TextureFormat::R16_G16_B16_A16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::RGBA16U}, 71 {TextureFormat::R16G16B16A16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16G16B16A16_UNORM},
67 {TextureFormat::R16_G16_B16_A16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RGBA16F}, 72 {TextureFormat::R16G16B16A16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16G16B16A16_FLOAT},
68 {TextureFormat::R16_G16_B16_A16, C, UINT, UINT, UINT, UINT, PixelFormat::RGBA16UI}, 73 {TextureFormat::R16G16B16A16, C, UINT, UINT, UINT, UINT, PixelFormat::R16G16B16A16_UINT},
74 {TextureFormat::R16G16B16A16, C, SINT, SINT, SINT, SINT, PixelFormat::R16G16B16A16_SINT},
69 75
70 {TextureFormat::R16_G16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RG16F}, 76 {TextureFormat::R16G16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16G16_FLOAT},
71 {TextureFormat::R16_G16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::RG16}, 77 {TextureFormat::R16G16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16G16_UNORM},
72 {TextureFormat::R16_G16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::RG16S}, 78 {TextureFormat::R16G16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16G16_SNORM},
73 {TextureFormat::R16_G16, C, UINT, UINT, UINT, UINT, PixelFormat::RG16UI}, 79 {TextureFormat::R16G16, C, UINT, UINT, UINT, UINT, PixelFormat::R16G16_UINT},
74 {TextureFormat::R16_G16, C, SINT, SINT, SINT, SINT, PixelFormat::RG16I}, 80 {TextureFormat::R16G16, C, SINT, SINT, SINT, SINT, PixelFormat::R16G16_SINT},
75 81
76 {TextureFormat::R16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16F}, 82 {TextureFormat::R16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R16_FLOAT},
77 {TextureFormat::R16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16U}, 83 {TextureFormat::R16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::R16_UNORM},
78 {TextureFormat::R16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16S}, 84 {TextureFormat::R16, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::R16_SNORM},
79 {TextureFormat::R16, C, UINT, UINT, UINT, UINT, PixelFormat::R16UI}, 85 {TextureFormat::R16, C, UINT, UINT, UINT, UINT, PixelFormat::R16_UINT},
80 {TextureFormat::R16, C, SINT, SINT, SINT, SINT, PixelFormat::R16I}, 86 {TextureFormat::R16, C, SINT, SINT, SINT, SINT, PixelFormat::R16_SINT},
81 87
82 {TextureFormat::BF10GF11RF11, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R11FG11FB10F}, 88 {TextureFormat::B10G11R11, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::B10G11R11_FLOAT},
83 89
84 {TextureFormat::R32_G32_B32_A32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RGBA32F}, 90 {TextureFormat::R32G32B32A32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32G32B32A32_FLOAT},
85 {TextureFormat::R32_G32_B32_A32, C, UINT, UINT, UINT, UINT, PixelFormat::RGBA32UI}, 91 {TextureFormat::R32G32B32A32, C, UINT, UINT, UINT, UINT, PixelFormat::R32G32B32A32_UINT},
92 {TextureFormat::R32G32B32A32, C, SINT, SINT, SINT, SINT, PixelFormat::R32G32B32A32_SINT},
86 93
87 {TextureFormat::R32_G32_B32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RGB32F}, 94 {TextureFormat::R32G32B32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32G32B32_FLOAT},
88 95
89 {TextureFormat::R32_G32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::RG32F}, 96 {TextureFormat::R32G32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32G32_FLOAT},
90 {TextureFormat::R32_G32, C, UINT, UINT, UINT, UINT, PixelFormat::RG32UI}, 97 {TextureFormat::R32G32, C, UINT, UINT, UINT, UINT, PixelFormat::R32G32_UINT},
98 {TextureFormat::R32G32, C, SINT, SINT, SINT, SINT, PixelFormat::R32G32_SINT},
91 99
92 {TextureFormat::R32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32F}, 100 {TextureFormat::R32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::R32_FLOAT},
93 {TextureFormat::R32, C, UINT, UINT, UINT, UINT, PixelFormat::R32UI}, 101 {TextureFormat::R32, C, UINT, UINT, UINT, UINT, PixelFormat::R32_UINT},
94 {TextureFormat::R32, C, SINT, SINT, SINT, SINT, PixelFormat::R32I}, 102 {TextureFormat::R32, C, SINT, SINT, SINT, SINT, PixelFormat::R32_SINT},
95 103
96 {TextureFormat::E5B9G9R9_SHAREDEXP, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::E5B9G9R9F}, 104 {TextureFormat::E5B9G9R9, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::E5B9G9R9_FLOAT},
97 105
98 {TextureFormat::ZF32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::Z32F}, 106 {TextureFormat::D32, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::D32_FLOAT},
99 {TextureFormat::Z16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::Z16}, 107 {TextureFormat::D16, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::D16_UNORM},
100 {TextureFormat::S8Z24, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8Z24}, 108 {TextureFormat::S8D24, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8_UINT_D24_UNORM},
101 {TextureFormat::G24R8, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8Z24}, 109 {TextureFormat::R8G24, C, UINT, UNORM, UNORM, UNORM, PixelFormat::S8_UINT_D24_UNORM},
102 {TextureFormat::ZF32_X24S8, C, FLOAT, UINT, UNORM, UNORM, PixelFormat::Z32FS8}, 110 {TextureFormat::D32S8, C, FLOAT, UINT, UNORM, UNORM, PixelFormat::D32_FLOAT_S8_UINT},
103 111
104 {TextureFormat::DXT1, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT1}, 112 {TextureFormat::BC1_RGBA, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC1_RGBA_UNORM},
105 {TextureFormat::DXT1, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT1_SRGB}, 113 {TextureFormat::BC1_RGBA, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC1_RGBA_SRGB},
106 114
107 {TextureFormat::DXT23, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT23}, 115 {TextureFormat::BC2, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC2_UNORM},
108 {TextureFormat::DXT23, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT23_SRGB}, 116 {TextureFormat::BC2, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC2_SRGB},
109 117
110 {TextureFormat::DXT45, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT45}, 118 {TextureFormat::BC3, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC3_UNORM},
111 {TextureFormat::DXT45, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXT45_SRGB}, 119 {TextureFormat::BC3, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC3_SRGB},
112 120
113 // TODO: Use a different pixel format for SNORM 121 {TextureFormat::BC4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC4_UNORM},
114 {TextureFormat::DXN1, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXN1}, 122 {TextureFormat::BC4, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::BC4_SNORM},
115 {TextureFormat::DXN1, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::DXN1},
116 123
117 {TextureFormat::DXN2, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::DXN2UNORM}, 124 {TextureFormat::BC5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC5_UNORM},
118 {TextureFormat::DXN2, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::DXN2SNORM}, 125 {TextureFormat::BC5, C, SNORM, SNORM, SNORM, SNORM, PixelFormat::BC5_SNORM},
119 126
120 {TextureFormat::BC7U, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7U}, 127 {TextureFormat::BC7, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7_UNORM},
121 {TextureFormat::BC7U, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7U_SRGB}, 128 {TextureFormat::BC7, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::BC7_SRGB},
122 129
123 {TextureFormat::BC6H_SF16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_SF16}, 130 {TextureFormat::BC6H_SFLOAT, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_SFLOAT},
124 {TextureFormat::BC6H_UF16, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_UF16}, 131 {TextureFormat::BC6H_UFLOAT, C, FLOAT, FLOAT, FLOAT, FLOAT, PixelFormat::BC6H_UFLOAT},
125 132
126 {TextureFormat::ASTC_2D_4X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4}, 133 {TextureFormat::ASTC_2D_4X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4_UNORM},
127 {TextureFormat::ASTC_2D_4X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4_SRGB}, 134 {TextureFormat::ASTC_2D_4X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_4X4_SRGB},
128 135
129 {TextureFormat::ASTC_2D_5X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4}, 136 {TextureFormat::ASTC_2D_5X4, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4_UNORM},
130 {TextureFormat::ASTC_2D_5X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4_SRGB}, 137 {TextureFormat::ASTC_2D_5X4, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X4_SRGB},
131 138
132 {TextureFormat::ASTC_2D_5X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5}, 139 {TextureFormat::ASTC_2D_5X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5_UNORM},
133 {TextureFormat::ASTC_2D_5X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5_SRGB}, 140 {TextureFormat::ASTC_2D_5X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_5X5_SRGB},
134 141
135 {TextureFormat::ASTC_2D_8X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8}, 142 {TextureFormat::ASTC_2D_8X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8_UNORM},
136 {TextureFormat::ASTC_2D_8X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8_SRGB}, 143 {TextureFormat::ASTC_2D_8X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X8_SRGB},
137 144
138 {TextureFormat::ASTC_2D_8X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5}, 145 {TextureFormat::ASTC_2D_8X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5_UNORM},
139 {TextureFormat::ASTC_2D_8X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5_SRGB}, 146 {TextureFormat::ASTC_2D_8X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X5_SRGB},
140 147
141 {TextureFormat::ASTC_2D_10X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8}, 148 {TextureFormat::ASTC_2D_10X8, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8_UNORM},
142 {TextureFormat::ASTC_2D_10X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8_SRGB}, 149 {TextureFormat::ASTC_2D_10X8, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X8_SRGB},
143 150
144 {TextureFormat::ASTC_2D_6X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6}, 151 {TextureFormat::ASTC_2D_6X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6_UNORM},
145 {TextureFormat::ASTC_2D_6X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6_SRGB}, 152 {TextureFormat::ASTC_2D_6X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X6_SRGB},
146 153
147 {TextureFormat::ASTC_2D_10X10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10}, 154 {TextureFormat::ASTC_2D_10X10, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10_UNORM},
148 {TextureFormat::ASTC_2D_10X10, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10_SRGB}, 155 {TextureFormat::ASTC_2D_10X10, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_10X10_SRGB},
149 156
150 {TextureFormat::ASTC_2D_12X12, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12}, 157 {TextureFormat::ASTC_2D_12X12, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12_UNORM},
151 {TextureFormat::ASTC_2D_12X12, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12_SRGB}, 158 {TextureFormat::ASTC_2D_12X12, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_12X12_SRGB},
152 159
153 {TextureFormat::ASTC_2D_8X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6}, 160 {TextureFormat::ASTC_2D_8X6, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6_UNORM},
154 {TextureFormat::ASTC_2D_8X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6_SRGB}, 161 {TextureFormat::ASTC_2D_8X6, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_8X6_SRGB},
155 162
156 {TextureFormat::ASTC_2D_6X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5}, 163 {TextureFormat::ASTC_2D_6X5, C, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5_UNORM},
157 {TextureFormat::ASTC_2D_6X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5_SRGB}, 164 {TextureFormat::ASTC_2D_6X5, S, UNORM, UNORM, UNORM, UNORM, PixelFormat::ASTC_2D_6X5_SRGB},
158}}; 165}};
159 166
@@ -184,7 +191,7 @@ PixelFormat FormatLookupTable::GetPixelFormat(TextureFormat format, bool is_srgb
184 static_cast<int>(format), is_srgb, static_cast<int>(red_component), 191 static_cast<int>(format), is_srgb, static_cast<int>(red_component),
185 static_cast<int>(green_component), static_cast<int>(blue_component), 192 static_cast<int>(green_component), static_cast<int>(blue_component),
186 static_cast<int>(alpha_component)); 193 static_cast<int>(alpha_component));
187 return PixelFormat::ABGR8U; 194 return PixelFormat::A8B8G8R8_UNORM;
188} 195}
189 196
190void FormatLookupTable::Set(TextureFormat format, bool is_srgb, ComponentType red_component, 197void FormatLookupTable::Set(TextureFormat format, bool is_srgb, ComponentType red_component,
diff --git a/src/video_core/texture_cache/surface_base.cpp b/src/video_core/texture_cache/surface_base.cpp
index 0caf3b4f0..dfcf36e0b 100644
--- a/src/video_core/texture_cache/surface_base.cpp
+++ b/src/video_core/texture_cache/surface_base.cpp
@@ -228,7 +228,7 @@ void SurfaceBaseImpl::LoadBuffer(Tegra::MemoryManager& memory_manager,
228 } 228 }
229 } 229 }
230 230
231 if (!is_converted && params.pixel_format != PixelFormat::S8Z24) { 231 if (!is_converted && params.pixel_format != PixelFormat::S8_UINT_D24_UNORM) {
232 return; 232 return;
233 } 233 }
234 234
diff --git a/src/video_core/texture_cache/surface_params.cpp b/src/video_core/texture_cache/surface_params.cpp
index 921562c1f..9e5fe2374 100644
--- a/src/video_core/texture_cache/surface_params.cpp
+++ b/src/video_core/texture_cache/surface_params.cpp
@@ -83,12 +83,12 @@ SurfaceParams SurfaceParams::CreateForTexture(const FormatLookupTable& lookup_ta
83 params.type = GetFormatType(params.pixel_format); 83 params.type = GetFormatType(params.pixel_format);
84 if (entry.is_shadow && params.type == SurfaceType::ColorTexture) { 84 if (entry.is_shadow && params.type == SurfaceType::ColorTexture) {
85 switch (params.pixel_format) { 85 switch (params.pixel_format) {
86 case PixelFormat::R16U: 86 case PixelFormat::R16_UNORM:
87 case PixelFormat::R16F: 87 case PixelFormat::R16_FLOAT:
88 params.pixel_format = PixelFormat::Z16; 88 params.pixel_format = PixelFormat::D16_UNORM;
89 break; 89 break;
90 case PixelFormat::R32F: 90 case PixelFormat::R32_FLOAT:
91 params.pixel_format = PixelFormat::Z32F; 91 params.pixel_format = PixelFormat::D32_FLOAT;
92 break; 92 break;
93 default: 93 default:
94 UNIMPLEMENTED_MSG("Unimplemented shadow convert format: {}", 94 UNIMPLEMENTED_MSG("Unimplemented shadow convert format: {}",
@@ -195,8 +195,8 @@ SurfaceParams SurfaceParams::CreateForFramebuffer(Core::System& system, std::siz
195 SurfaceParams params; 195 SurfaceParams params;
196 params.is_tiled = 196 params.is_tiled =
197 config.memory_layout.type == Tegra::Engines::Maxwell3D::Regs::InvMemoryLayout::BlockLinear; 197 config.memory_layout.type == Tegra::Engines::Maxwell3D::Regs::InvMemoryLayout::BlockLinear;
198 params.srgb_conversion = config.format == Tegra::RenderTargetFormat::BGRA8_SRGB || 198 params.srgb_conversion = config.format == Tegra::RenderTargetFormat::B8G8R8A8_SRGB ||
199 config.format == Tegra::RenderTargetFormat::RGBA8_SRGB; 199 config.format == Tegra::RenderTargetFormat::A8B8G8R8_SRGB;
200 params.block_width = config.memory_layout.block_width; 200 params.block_width = config.memory_layout.block_width;
201 params.block_height = config.memory_layout.block_height; 201 params.block_height = config.memory_layout.block_height;
202 params.block_depth = config.memory_layout.block_depth; 202 params.block_depth = config.memory_layout.block_depth;
@@ -235,8 +235,8 @@ SurfaceParams SurfaceParams::CreateForFermiCopySurface(
235 const Tegra::Engines::Fermi2D::Regs::Surface& config) { 235 const Tegra::Engines::Fermi2D::Regs::Surface& config) {
236 SurfaceParams params{}; 236 SurfaceParams params{};
237 params.is_tiled = !config.linear; 237 params.is_tiled = !config.linear;
238 params.srgb_conversion = config.format == Tegra::RenderTargetFormat::BGRA8_SRGB || 238 params.srgb_conversion = config.format == Tegra::RenderTargetFormat::B8G8R8A8_SRGB ||
239 config.format == Tegra::RenderTargetFormat::RGBA8_SRGB; 239 config.format == Tegra::RenderTargetFormat::A8B8G8R8_SRGB;
240 params.block_width = params.is_tiled ? std::min(config.BlockWidth(), 5U) : 0, 240 params.block_width = params.is_tiled ? std::min(config.BlockWidth(), 5U) : 0,
241 params.block_height = params.is_tiled ? std::min(config.BlockHeight(), 5U) : 0, 241 params.block_height = params.is_tiled ? std::min(config.BlockHeight(), 5U) : 0,
242 params.block_depth = params.is_tiled ? std::min(config.BlockDepth(), 5U) : 0, 242 params.block_depth = params.is_tiled ? std::min(config.BlockDepth(), 5U) : 0,
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index cdcddb225..96c4e4cc2 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -373,9 +373,9 @@ protected:
373 siblings_table[static_cast<std::size_t>(b)] = a; 373 siblings_table[static_cast<std::size_t>(b)] = a;
374 }; 374 };
375 std::fill(siblings_table.begin(), siblings_table.end(), PixelFormat::Invalid); 375 std::fill(siblings_table.begin(), siblings_table.end(), PixelFormat::Invalid);
376 make_siblings(PixelFormat::Z16, PixelFormat::R16U); 376 make_siblings(PixelFormat::D16_UNORM, PixelFormat::R16_UNORM);
377 make_siblings(PixelFormat::Z32F, PixelFormat::R32F); 377 make_siblings(PixelFormat::D32_FLOAT, PixelFormat::R32_FLOAT);
378 make_siblings(PixelFormat::Z32FS8, PixelFormat::RG32F); 378 make_siblings(PixelFormat::D32_FLOAT_S8_UINT, PixelFormat::R32G32_FLOAT);
379 379
380 sampled_textures.reserve(64); 380 sampled_textures.reserve(64);
381 } 381 }
@@ -1031,7 +1031,7 @@ private:
1031 params.pitch = 4; 1031 params.pitch = 4;
1032 params.num_levels = 1; 1032 params.num_levels = 1;
1033 params.emulated_levels = 1; 1033 params.emulated_levels = 1;
1034 params.pixel_format = VideoCore::Surface::PixelFormat::R8U; 1034 params.pixel_format = VideoCore::Surface::PixelFormat::R8_UNORM;
1035 params.type = VideoCore::Surface::SurfaceType::ColorTexture; 1035 params.type = VideoCore::Surface::SurfaceType::ColorTexture;
1036 auto surface = CreateSurface(0ULL, params); 1036 auto surface = CreateSurface(0ULL, params);
1037 invalid_memory.resize(surface->GetHostSizeInBytes(), 0U); 1037 invalid_memory.resize(surface->GetHostSizeInBytes(), 0U);
diff --git a/src/video_core/textures/convert.cpp b/src/video_core/textures/convert.cpp
index f3efa7eb0..962921483 100644
--- a/src/video_core/textures/convert.cpp
+++ b/src/video_core/textures/convert.cpp
@@ -35,7 +35,7 @@ void SwapS8Z24ToZ24S8(u8* data, u32 width, u32 height) {
35 S8Z24 s8z24_pixel{}; 35 S8Z24 s8z24_pixel{};
36 Z24S8 z24s8_pixel{}; 36 Z24S8 z24s8_pixel{};
37 constexpr auto bpp{ 37 constexpr auto bpp{
38 VideoCore::Surface::GetBytesPerPixel(VideoCore::Surface::PixelFormat::S8Z24)}; 38 VideoCore::Surface::GetBytesPerPixel(VideoCore::Surface::PixelFormat::S8_UINT_D24_UNORM)};
39 for (std::size_t y = 0; y < height; ++y) { 39 for (std::size_t y = 0; y < height; ++y) {
40 for (std::size_t x = 0; x < width; ++x) { 40 for (std::size_t x = 0; x < width; ++x) {
41 const std::size_t offset{bpp * (y * width + x)}; 41 const std::size_t offset{bpp * (y * width + x)};
@@ -73,7 +73,7 @@ void ConvertFromGuestToHost(u8* in_data, u8* out_data, PixelFormat pixel_format,
73 in_data, width, height, depth, block_width, block_height); 73 in_data, width, height, depth, block_width, block_height);
74 std::copy(rgba8_data.begin(), rgba8_data.end(), out_data); 74 std::copy(rgba8_data.begin(), rgba8_data.end(), out_data);
75 75
76 } else if (convert_s8z24 && pixel_format == PixelFormat::S8Z24) { 76 } else if (convert_s8z24 && pixel_format == PixelFormat::S8_UINT_D24_UNORM) {
77 Tegra::Texture::ConvertS8Z24ToZ24S8(in_data, width, height); 77 Tegra::Texture::ConvertS8Z24ToZ24S8(in_data, width, height);
78 } 78 }
79} 79}
@@ -85,7 +85,7 @@ void ConvertFromHostToGuest(u8* data, PixelFormat pixel_format, u32 width, u32 h
85 static_cast<u32>(pixel_format)); 85 static_cast<u32>(pixel_format));
86 UNREACHABLE(); 86 UNREACHABLE();
87 87
88 } else if (convert_s8z24 && pixel_format == PixelFormat::S8Z24) { 88 } else if (convert_s8z24 && pixel_format == PixelFormat::S8_UINT_D24_UNORM) {
89 Tegra::Texture::ConvertZ24S8ToS8Z24(data, width, height); 89 Tegra::Texture::ConvertZ24S8ToS8Z24(data, width, height);
90 } 90 }
91} 91}
diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp
index 98beabef1..474ae620a 100644
--- a/src/video_core/textures/decoders.cpp
+++ b/src/video_core/textures/decoders.cpp
@@ -184,53 +184,6 @@ void CopySwizzledData(u32 width, u32 height, u32 depth, u32 bytes_per_pixel,
184 } 184 }
185} 185}
186 186
187u32 BytesPerPixel(TextureFormat format) {
188 switch (format) {
189 case TextureFormat::DXT1:
190 case TextureFormat::DXN1:
191 // In this case a 'pixel' actually refers to a 4x4 tile.
192 return 8;
193 case TextureFormat::DXT23:
194 case TextureFormat::DXT45:
195 case TextureFormat::DXN2:
196 case TextureFormat::BC7U:
197 case TextureFormat::BC6H_UF16:
198 case TextureFormat::BC6H_SF16:
199 // In this case a 'pixel' actually refers to a 4x4 tile.
200 return 16;
201 case TextureFormat::R32_G32_B32:
202 return 12;
203 case TextureFormat::ASTC_2D_4X4:
204 case TextureFormat::ASTC_2D_5X4:
205 case TextureFormat::ASTC_2D_8X8:
206 case TextureFormat::ASTC_2D_8X5:
207 case TextureFormat::ASTC_2D_10X8:
208 case TextureFormat::ASTC_2D_5X5:
209 case TextureFormat::A8R8G8B8:
210 case TextureFormat::A2B10G10R10:
211 case TextureFormat::BF10GF11RF11:
212 case TextureFormat::R32:
213 case TextureFormat::R16_G16:
214 return 4;
215 case TextureFormat::A1B5G5R5:
216 case TextureFormat::B5G6R5:
217 case TextureFormat::G8R8:
218 case TextureFormat::R16:
219 return 2;
220 case TextureFormat::R8:
221 return 1;
222 case TextureFormat::R16_G16_B16_A16:
223 return 8;
224 case TextureFormat::R32_G32_B32_A32:
225 return 16;
226 case TextureFormat::R32_G32:
227 return 8;
228 default:
229 UNIMPLEMENTED_MSG("Format not implemented");
230 return 1;
231 }
232}
233
234void UnswizzleTexture(u8* const unswizzled_data, u8* address, u32 tile_size_x, u32 tile_size_y, 187void UnswizzleTexture(u8* const unswizzled_data, u8* address, u32 tile_size_x, u32 tile_size_y,
235 u32 bytes_per_pixel, u32 width, u32 height, u32 depth, u32 block_height, 188 u32 bytes_per_pixel, u32 width, u32 height, u32 depth, u32 block_height,
236 u32 block_depth, u32 width_spacing) { 189 u32 block_depth, u32 width_spacing) {
@@ -348,48 +301,6 @@ void SwizzleKepler(const u32 width, const u32 height, const u32 dst_x, const u32
348 } 301 }
349} 302}
350 303
351std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat format, u32 width,
352 u32 height) {
353 std::vector<u8> rgba_data;
354
355 // TODO(Subv): Implement.
356 switch (format) {
357 case TextureFormat::DXT1:
358 case TextureFormat::DXT23:
359 case TextureFormat::DXT45:
360 case TextureFormat::DXN1:
361 case TextureFormat::DXN2:
362 case TextureFormat::BC7U:
363 case TextureFormat::BC6H_UF16:
364 case TextureFormat::BC6H_SF16:
365 case TextureFormat::ASTC_2D_4X4:
366 case TextureFormat::ASTC_2D_8X8:
367 case TextureFormat::ASTC_2D_5X5:
368 case TextureFormat::ASTC_2D_10X8:
369 case TextureFormat::A8R8G8B8:
370 case TextureFormat::A2B10G10R10:
371 case TextureFormat::A1B5G5R5:
372 case TextureFormat::B5G6R5:
373 case TextureFormat::R8:
374 case TextureFormat::G8R8:
375 case TextureFormat::BF10GF11RF11:
376 case TextureFormat::R32_G32_B32_A32:
377 case TextureFormat::R32_G32:
378 case TextureFormat::R32:
379 case TextureFormat::R16:
380 case TextureFormat::R16_G16:
381 case TextureFormat::R32_G32_B32:
382 // TODO(Subv): For the time being just forward the same data without any decoding.
383 rgba_data = texture_data;
384 break;
385 default:
386 UNIMPLEMENTED_MSG("Format not implemented");
387 break;
388 }
389
390 return rgba_data;
391}
392
393std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth, 304std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth,
394 u32 block_height, u32 block_depth) { 305 u32 block_height, u32 block_depth) {
395 if (tiled) { 306 if (tiled) {
diff --git a/src/video_core/textures/decoders.h b/src/video_core/textures/decoders.h
index 232b696b3..d6fe35d37 100644
--- a/src/video_core/textures/decoders.h
+++ b/src/video_core/textures/decoders.h
@@ -38,10 +38,6 @@ void CopySwizzledData(u32 width, u32 height, u32 depth, u32 bytes_per_pixel,
38 u32 out_bytes_per_pixel, u8* swizzled_data, u8* unswizzled_data, 38 u32 out_bytes_per_pixel, u8* swizzled_data, u8* unswizzled_data,
39 bool unswizzle, u32 block_height, u32 block_depth, u32 width_spacing); 39 bool unswizzle, u32 block_height, u32 block_depth, u32 width_spacing);
40 40
41/// Decodes an unswizzled texture into a A8R8G8B8 texture.
42std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat format, u32 width,
43 u32 height);
44
45/// This function calculates the correct size of a texture depending if it's tiled or not. 41/// This function calculates the correct size of a texture depending if it's tiled or not.
46std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth, 42std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth,
47 u32 block_height, u32 block_depth); 43 u32 block_height, u32 block_depth);
diff --git a/src/video_core/textures/texture.h b/src/video_core/textures/texture.h
index eba05aced..0574fef12 100644
--- a/src/video_core/textures/texture.h
+++ b/src/video_core/textures/texture.h
@@ -12,10 +12,10 @@
12namespace Tegra::Texture { 12namespace Tegra::Texture {
13 13
14enum class TextureFormat : u32 { 14enum class TextureFormat : u32 {
15 R32_G32_B32_A32 = 0x01, 15 R32G32B32A32 = 0x01,
16 R32_G32_B32 = 0x02, 16 R32G32B32 = 0x02,
17 R16_G16_B16_A16 = 0x03, 17 R16G16B16A16 = 0x03,
18 R32_G32 = 0x04, 18 R32G32 = 0x04,
19 R32_B24G8 = 0x05, 19 R32_B24G8 = 0x05,
20 ETC2_RGB = 0x06, 20 ETC2_RGB = 0x06,
21 X8B8G8R8 = 0x07, 21 X8B8G8R8 = 0x07,
@@ -23,19 +23,19 @@ enum class TextureFormat : u32 {
23 A2B10G10R10 = 0x09, 23 A2B10G10R10 = 0x09,
24 ETC2_RGB_PTA = 0x0a, 24 ETC2_RGB_PTA = 0x0a,
25 ETC2_RGBA = 0x0b, 25 ETC2_RGBA = 0x0b,
26 R16_G16 = 0x0c, 26 R16G16 = 0x0c,
27 G8R24 = 0x0d, 27 R24G8 = 0x0d,
28 G24R8 = 0x0e, 28 R8G24 = 0x0e,
29 R32 = 0x0f, 29 R32 = 0x0f,
30 BC6H_SF16 = 0x10, 30 BC6H_SFLOAT = 0x10,
31 BC6H_UF16 = 0x11, 31 BC6H_UFLOAT = 0x11,
32 A4B4G4R4 = 0x12, 32 A4B4G4R4 = 0x12,
33 A5B5G5R1 = 0x13, 33 A5B5G5R1 = 0x13,
34 A1B5G5R5 = 0x14, 34 A1B5G5R5 = 0x14,
35 B5G6R5 = 0x15, 35 B5G6R5 = 0x15,
36 B6G5R5 = 0x16, 36 B6G5R5 = 0x16,
37 BC7U = 0x17, 37 BC7 = 0x17,
38 G8R8 = 0x18, 38 R8G8 = 0x18,
39 EAC = 0x19, 39 EAC = 0x19,
40 EACX2 = 0x1a, 40 EACX2 = 0x1a,
41 R16 = 0x1b, 41 R16 = 0x1b,
@@ -43,23 +43,23 @@ enum class TextureFormat : u32 {
43 R8 = 0x1d, 43 R8 = 0x1d,
44 G4R4 = 0x1e, 44 G4R4 = 0x1e,
45 R1 = 0x1f, 45 R1 = 0x1f,
46 E5B9G9R9_SHAREDEXP = 0x20, 46 E5B9G9R9 = 0x20,
47 BF10GF11RF11 = 0x21, 47 B10G11R11 = 0x21,
48 G8B8G8R8 = 0x22, 48 G8B8G8R8 = 0x22,
49 B8G8R8G8 = 0x23, 49 B8G8R8G8 = 0x23,
50 DXT1 = 0x24, 50 BC1_RGBA = 0x24,
51 DXT23 = 0x25, 51 BC2 = 0x25,
52 DXT45 = 0x26, 52 BC3 = 0x26,
53 DXN1 = 0x27, 53 BC4 = 0x27,
54 DXN2 = 0x28, 54 BC5 = 0x28,
55 S8Z24 = 0x29, 55 S8D24 = 0x29,
56 X8Z24 = 0x2a, 56 X8Z24 = 0x2a,
57 Z24S8 = 0x2b, 57 D24S8 = 0x2b,
58 X4V4Z24__COV4R4V = 0x2c, 58 X4V4Z24__COV4R4V = 0x2c,
59 X4V4Z24__COV8R8V = 0x2d, 59 X4V4Z24__COV8R8V = 0x2d,
60 V8Z24__COV4R12V = 0x2e, 60 V8Z24__COV4R12V = 0x2e,
61 ZF32 = 0x2f, 61 D32 = 0x2f,
62 ZF32_X24S8 = 0x30, 62 D32S8 = 0x30,
63 X8Z24_X20V4S8__COV4R4V = 0x31, 63 X8Z24_X20V4S8__COV4R4V = 0x31,
64 X8Z24_X20V4S8__COV8R8V = 0x32, 64 X8Z24_X20V4S8__COV8R8V = 0x32,
65 ZF32_X20V4X8__COV4R4V = 0x33, 65 ZF32_X20V4X8__COV4R4V = 0x33,
@@ -69,7 +69,7 @@ enum class TextureFormat : u32 {
69 X8Z24_X16V8S8__COV4R12V = 0x37, 69 X8Z24_X16V8S8__COV4R12V = 0x37,
70 ZF32_X16V8X8__COV4R12V = 0x38, 70 ZF32_X16V8X8__COV4R12V = 0x38,
71 ZF32_X16V8S8__COV4R12V = 0x39, 71 ZF32_X16V8S8__COV4R12V = 0x39,
72 Z16 = 0x3a, 72 D16 = 0x3a,
73 V8Z24__COV8R24V = 0x3b, 73 V8Z24__COV8R24V = 0x3b,
74 X8Z24_X16V8S8__COV8R24V = 0x3c, 74 X8Z24_X16V8S8__COV8R24V = 0x3c,
75 ZF32_X16V8X8__COV8R24V = 0x3d, 75 ZF32_X16V8X8__COV8R24V = 0x3d,
@@ -375,7 +375,4 @@ struct FullTextureInfo {
375 TSCEntry tsc; 375 TSCEntry tsc;
376}; 376};
377 377
378/// Returns the number of bytes per pixel of the input texture format.
379u32 BytesPerPixel(TextureFormat format);
380
381} // namespace Tegra::Texture 378} // namespace Tegra::Texture