summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2022-11-06 15:19:08 +0100
committerGravatar Fernando Sahmkow2022-11-24 20:35:44 +0100
commit7356ab1de6ab7336da426b9176daafb3ebb503f5 (patch)
treed5d348714633de2a1788bc0d114b32045f24f7f8 /src
parentMaxwellDMA: Implement BlockLinear to BlockLinear copies. (diff)
downloadyuzu-7356ab1de6ab7336da426b9176daafb3ebb503f5.tar.gz
yuzu-7356ab1de6ab7336da426b9176daafb3ebb503f5.tar.xz
yuzu-7356ab1de6ab7336da426b9176daafb3ebb503f5.zip
GPU: Implement additional render target formats.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/engines/sw_blitter/converter.cpp106
-rw-r--r--src/video_core/gpu.h14
-rw-r--r--src/video_core/renderer_opengl/maxwell_to_gl.h1
-rw-r--r--src/video_core/renderer_vulkan/maxwell_to_vk.cpp1
-rw-r--r--src/video_core/surface.cpp10
-rw-r--r--src/video_core/surface.h4
-rw-r--r--src/video_core/texture_cache/formatter.h2
7 files changed, 126 insertions, 12 deletions
diff --git a/src/video_core/engines/sw_blitter/converter.cpp b/src/video_core/engines/sw_blitter/converter.cpp
index 408d87944..37c5eff69 100644
--- a/src/video_core/engines/sw_blitter/converter.cpp
+++ b/src/video_core/engines/sw_blitter/converter.cpp
@@ -133,13 +133,13 @@ constexpr std::array<f32, 256> RGB_TO_SRGB_LUT = {
133 133
134} // namespace 134} // namespace
135 135
136struct R32B32G32A32_FLOATTraits { 136struct R32G32B32A32_FLOATTraits {
137 static constexpr size_t num_components = 4; 137 static constexpr size_t num_components = 4;
138 static constexpr std::array<ComponentType, num_components> component_types = { 138 static constexpr std::array<ComponentType, num_components> component_types = {
139 ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT}; 139 ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT};
140 static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32}; 140 static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
141 static constexpr std::array<Swizzle, num_components> component_swizzle = { 141 static constexpr std::array<Swizzle, num_components> component_swizzle = {
142 Swizzle::R, Swizzle::B, Swizzle::G, Swizzle::A}; 142 Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A};
143}; 143};
144 144
145struct R32G32B32A32_SINTTraits { 145struct R32G32B32A32_SINTTraits {
@@ -160,6 +160,33 @@ struct R32G32B32A32_UINTTraits {
160 Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A}; 160 Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A};
161}; 161};
162 162
163struct R32G32B32X32_FLOATTraits {
164 static constexpr size_t num_components = 4;
165 static constexpr std::array<ComponentType, num_components> component_types = {
166 ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT};
167 static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
168 static constexpr std::array<Swizzle, num_components> component_swizzle = {
169 Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
170};
171
172struct R32G32B32X32_SINTTraits {
173 static constexpr size_t num_components = 4;
174 static constexpr std::array<ComponentType, num_components> component_types = {
175 ComponentType::SINT, ComponentType::SINT, ComponentType::SINT, ComponentType::SINT};
176 static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
177 static constexpr std::array<Swizzle, num_components> component_swizzle = {
178 Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
179};
180
181struct R32G32B32X32_UINTTraits {
182 static constexpr size_t num_components = 4;
183 static constexpr std::array<ComponentType, num_components> component_types = {
184 ComponentType::UINT, ComponentType::UINT, ComponentType::UINT, ComponentType::UINT};
185 static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
186 static constexpr std::array<Swizzle, num_components> component_swizzle = {
187 Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
188};
189
163struct R16G16B16A16_UNORMTraits { 190struct R16G16B16A16_UNORMTraits {
164 static constexpr size_t num_components = 4; 191 static constexpr size_t num_components = 4;
165 static constexpr std::array<ComponentType, num_components> component_types = { 192 static constexpr std::array<ComponentType, num_components> component_types = {
@@ -277,6 +304,15 @@ struct A2B10G10R10_UINTTraits {
277 Swizzle::A, Swizzle::B, Swizzle::G, Swizzle::R}; 304 Swizzle::A, Swizzle::B, Swizzle::G, Swizzle::R};
278}; 305};
279 306
307struct A2R10G10B10_UNORMTraits {
308 static constexpr size_t num_components = 4;
309 static constexpr std::array<ComponentType, num_components> component_types = {
310 ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
311 static constexpr std::array<size_t, num_components> component_sizes = {2, 10, 10, 10};
312 static constexpr std::array<Swizzle, num_components> component_swizzle = {
313 Swizzle::A, Swizzle::R, Swizzle::G, Swizzle::B};
314};
315
280struct A8B8G8R8_UNORMTraits { 316struct A8B8G8R8_UNORMTraits {
281 static constexpr size_t num_components = 4; 317 static constexpr size_t num_components = 4;
282 static constexpr std::array<ComponentType, num_components> component_types = { 318 static constexpr std::array<ComponentType, num_components> component_types = {
@@ -544,6 +580,33 @@ struct R8_UINTTraits {
544 static constexpr std::array<Swizzle, num_components> component_swizzle = {Swizzle::R}; 580 static constexpr std::array<Swizzle, num_components> component_swizzle = {Swizzle::R};
545}; 581};
546 582
583struct X1R5G5B5_UNORMTraits {
584 static constexpr size_t num_components = 4;
585 static constexpr std::array<ComponentType, num_components> component_types = {
586 ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
587 static constexpr std::array<size_t, num_components> component_sizes = {1, 5, 5, 5};
588 static constexpr std::array<Swizzle, num_components> component_swizzle = {
589 Swizzle::None, Swizzle::R, Swizzle::G, Swizzle::B};
590};
591
592struct X8B8G8R8_UNORMTraits {
593 static constexpr size_t num_components = 4;
594 static constexpr std::array<ComponentType, num_components> component_types = {
595 ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
596 static constexpr std::array<size_t, num_components> component_sizes = {8, 8, 8, 8};
597 static constexpr std::array<Swizzle, num_components> component_swizzle = {
598 Swizzle::None, Swizzle::B, Swizzle::G, Swizzle::R};
599};
600
601struct X8B8G8R8_SRGBTraits {
602 static constexpr size_t num_components = 4;
603 static constexpr std::array<ComponentType, num_components> component_types = {
604 ComponentType::SRGB, ComponentType::SRGB, ComponentType::SRGB, ComponentType::SRGB};
605 static constexpr std::array<size_t, num_components> component_sizes = {8, 8, 8, 8};
606 static constexpr std::array<Swizzle, num_components> component_swizzle = {
607 Swizzle::None, Swizzle::B, Swizzle::G, Swizzle::R};
608};
609
547template <class ConverterTraits> 610template <class ConverterTraits>
548class ConverterImpl : public Converter { 611class ConverterImpl : public Converter {
549private: 612private:
@@ -884,9 +947,9 @@ public:
884 947
885Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) { 948Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
886 switch (format) { 949 switch (format) {
887 case RenderTargetFormat::R32B32G32A32_FLOAT: 950 case RenderTargetFormat::R32G32B32A32_FLOAT:
888 return impl->converters_cache 951 return impl->converters_cache
889 .emplace(format, std::make_unique<ConverterImpl<R32B32G32A32_FLOATTraits>>()) 952 .emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_FLOATTraits>>())
890 .first->second.get(); 953 .first->second.get();
891 break; 954 break;
892 case RenderTargetFormat::R32G32B32A32_SINT: 955 case RenderTargetFormat::R32G32B32A32_SINT:
@@ -899,6 +962,21 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
899 .emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_UINTTraits>>()) 962 .emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_UINTTraits>>())
900 .first->second.get(); 963 .first->second.get();
901 break; 964 break;
965 case RenderTargetFormat::R32G32B32X32_FLOAT:
966 return impl->converters_cache
967 .emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_FLOATTraits>>())
968 .first->second.get();
969 break;
970 case RenderTargetFormat::R32G32B32X32_SINT:
971 return impl->converters_cache
972 .emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_SINTTraits>>())
973 .first->second.get();
974 break;
975 case RenderTargetFormat::R32G32B32X32_UINT:
976 return impl->converters_cache
977 .emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_UINTTraits>>())
978 .first->second.get();
979 break;
902 case RenderTargetFormat::R16G16B16A16_UNORM: 980 case RenderTargetFormat::R16G16B16A16_UNORM:
903 return impl->converters_cache 981 return impl->converters_cache
904 .emplace(format, std::make_unique<ConverterImpl<R16G16B16A16_UNORMTraits>>()) 982 .emplace(format, std::make_unique<ConverterImpl<R16G16B16A16_UNORMTraits>>())
@@ -964,6 +1042,11 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
964 .emplace(format, std::make_unique<ConverterImpl<A2B10G10R10_UINTTraits>>()) 1042 .emplace(format, std::make_unique<ConverterImpl<A2B10G10R10_UINTTraits>>())
965 .first->second.get(); 1043 .first->second.get();
966 break; 1044 break;
1045 case RenderTargetFormat::A2R10G10B10_UNORM:
1046 return impl->converters_cache
1047 .emplace(format, std::make_unique<ConverterImpl<A2R10G10B10_UNORMTraits>>())
1048 .first->second.get();
1049 break;
967 case RenderTargetFormat::A8B8G8R8_UNORM: 1050 case RenderTargetFormat::A8B8G8R8_UNORM:
968 return impl->converters_cache 1051 return impl->converters_cache
969 .emplace(format, std::make_unique<ConverterImpl<A8B8G8R8_UNORMTraits>>()) 1052 .emplace(format, std::make_unique<ConverterImpl<A8B8G8R8_UNORMTraits>>())
@@ -1119,6 +1202,21 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
1119 .emplace(format, std::make_unique<ConverterImpl<R8_UINTTraits>>()) 1202 .emplace(format, std::make_unique<ConverterImpl<R8_UINTTraits>>())
1120 .first->second.get(); 1203 .first->second.get();
1121 break; 1204 break;
1205 case RenderTargetFormat::X1R5G5B5_UNORM:
1206 return impl->converters_cache
1207 .emplace(format, std::make_unique<ConverterImpl<X1R5G5B5_UNORMTraits>>())
1208 .first->second.get();
1209 break;
1210 case RenderTargetFormat::X8B8G8R8_UNORM:
1211 return impl->converters_cache
1212 .emplace(format, std::make_unique<ConverterImpl<X8B8G8R8_UNORMTraits>>())
1213 .first->second.get();
1214 break;
1215 case RenderTargetFormat::X8B8G8R8_SRGB:
1216 return impl->converters_cache
1217 .emplace(format, std::make_unique<ConverterImpl<X8B8G8R8_SRGBTraits>>())
1218 .first->second.get();
1219 break;
1122 default: { 1220 default: {
1123 UNIMPLEMENTED_MSG("This format {} converter is not implemented", format); 1221 UNIMPLEMENTED_MSG("This format {} converter is not implemented", format);
1124 return impl->converters_cache.emplace(format, std::make_unique<NullConverter>()) 1222 return impl->converters_cache.emplace(format, std::make_unique<NullConverter>())
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index 87ebf2054..8a871593a 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -27,12 +27,12 @@ struct CommandList;
27// TODO: Implement the commented ones 27// TODO: Implement the commented ones
28enum class RenderTargetFormat : u32 { 28enum class RenderTargetFormat : u32 {
29 NONE = 0x0, 29 NONE = 0x0,
30 R32B32G32A32_FLOAT = 0xC0, 30 R32G32B32A32_FLOAT = 0xC0,
31 R32G32B32A32_SINT = 0xC1, 31 R32G32B32A32_SINT = 0xC1,
32 R32G32B32A32_UINT = 0xC2, 32 R32G32B32A32_UINT = 0xC2,
33 // R32G32B32X32_FLOAT = 0xC3, 33 R32G32B32X32_FLOAT = 0xC3,
34 // R32G32B32X32_SINT = 0xC4, 34 R32G32B32X32_SINT = 0xC4,
35 // R32G32B32X32_UINT = 0xC5, 35 R32G32B32X32_UINT = 0xC5,
36 R16G16B16A16_UNORM = 0xC6, 36 R16G16B16A16_UNORM = 0xC6,
37 R16G16B16A16_SNORM = 0xC7, 37 R16G16B16A16_SNORM = 0xC7,
38 R16G16B16A16_SINT = 0xC8, 38 R16G16B16A16_SINT = 0xC8,
@@ -56,7 +56,7 @@ enum class RenderTargetFormat : u32 {
56 R16G16_SINT = 0xDC, 56 R16G16_SINT = 0xDC,
57 R16G16_UINT = 0xDD, 57 R16G16_UINT = 0xDD,
58 R16G16_FLOAT = 0xDE, 58 R16G16_FLOAT = 0xDE,
59 // A2R10G10B10_UNORM = 0xDF, 59 A2R10G10B10_UNORM = 0xDF,
60 B10G11R11_FLOAT = 0xE0, 60 B10G11R11_FLOAT = 0xE0,
61 R32_SINT = 0xE3, 61 R32_SINT = 0xE3,
62 R32_UINT = 0xE4, 62 R32_UINT = 0xE4,
@@ -79,11 +79,11 @@ enum class RenderTargetFormat : u32 {
79 R8_SINT = 0xF5, 79 R8_SINT = 0xF5,
80 R8_UINT = 0xF6, 80 R8_UINT = 0xF6,
81 81
82 /* 82 // A8_UNORM = 0xF7,
83 A8_UNORM = 0xF7,
84 X1R5G5B5_UNORM = 0xF8, 83 X1R5G5B5_UNORM = 0xF8,
85 X8B8G8R8_UNORM = 0xF9, 84 X8B8G8R8_UNORM = 0xF9,
86 X8B8G8R8_SRGB = 0xFA, 85 X8B8G8R8_SRGB = 0xFA,
86 /*
87 Z1R5G5B5_UNORM = 0xFB, 87 Z1R5G5B5_UNORM = 0xFB,
88 O1R5G5B5_UNORM = 0xFC, 88 O1R5G5B5_UNORM = 0xFC,
89 Z8R8G8B8_UNORM = 0xFD, 89 Z8R8G8B8_UNORM = 0xFD,
diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h
index e14f9b2db..ef1190e1f 100644
--- a/src/video_core/renderer_opengl/maxwell_to_gl.h
+++ b/src/video_core/renderer_opengl/maxwell_to_gl.h
@@ -28,6 +28,7 @@ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> FORMAT_TAB
28 {GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1R5G5B5_UNORM 28 {GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1R5G5B5_UNORM
29 {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM 29 {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM
30 {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT 30 {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT
31 {GL_RGB10_A2, GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2R10G10B10_UNORM
31 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM 32 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM
32 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // A5B5G5R1_UNORM 33 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // A5B5G5R1_UNORM
33 {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM 34 {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
index 5c156087b..1da53f203 100644
--- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
+++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
@@ -125,6 +125,7 @@ struct FormatTuple {
125 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM 125 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM
126 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM 126 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM
127 {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT 127 {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT
128 {VK_FORMAT_A2R10G10B10_UNORM_PACK32, Attachable | Storage}, // A2R10G10B10_UNORM
128 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) 129 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle)
129 {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled) 130 {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled)
130 {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM 131 {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp
index 80a7d908f..b618e1a25 100644
--- a/src/video_core/surface.cpp
+++ b/src/video_core/surface.cpp
@@ -93,11 +93,14 @@ PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
93 93
94PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) { 94PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) {
95 switch (format) { 95 switch (format) {
96 case Tegra::RenderTargetFormat::R32B32G32A32_FLOAT: 96 case Tegra::RenderTargetFormat::R32G32B32A32_FLOAT:
97 case Tegra::RenderTargetFormat::R32G32B32X32_FLOAT:
97 return PixelFormat::R32G32B32A32_FLOAT; 98 return PixelFormat::R32G32B32A32_FLOAT;
98 case Tegra::RenderTargetFormat::R32G32B32A32_SINT: 99 case Tegra::RenderTargetFormat::R32G32B32A32_SINT:
100 case Tegra::RenderTargetFormat::R32G32B32X32_SINT:
99 return PixelFormat::R32G32B32A32_SINT; 101 return PixelFormat::R32G32B32A32_SINT;
100 case Tegra::RenderTargetFormat::R32G32B32A32_UINT: 102 case Tegra::RenderTargetFormat::R32G32B32A32_UINT:
103 case Tegra::RenderTargetFormat::R32G32B32X32_UINT:
101 return PixelFormat::R32G32B32A32_UINT; 104 return PixelFormat::R32G32B32A32_UINT;
102 case Tegra::RenderTargetFormat::R16G16B16A16_UNORM: 105 case Tegra::RenderTargetFormat::R16G16B16A16_UNORM:
103 return PixelFormat::R16G16B16A16_UNORM; 106 return PixelFormat::R16G16B16A16_UNORM;
@@ -127,9 +130,13 @@ PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format)
127 return PixelFormat::A2B10G10R10_UNORM; 130 return PixelFormat::A2B10G10R10_UNORM;
128 case Tegra::RenderTargetFormat::A2B10G10R10_UINT: 131 case Tegra::RenderTargetFormat::A2B10G10R10_UINT:
129 return PixelFormat::A2B10G10R10_UINT; 132 return PixelFormat::A2B10G10R10_UINT;
133 case Tegra::RenderTargetFormat::A2R10G10B10_UNORM:
134 return PixelFormat::A2R10G10B10_UNORM;
130 case Tegra::RenderTargetFormat::A8B8G8R8_UNORM: 135 case Tegra::RenderTargetFormat::A8B8G8R8_UNORM:
136 case Tegra::RenderTargetFormat::X8B8G8R8_UNORM:
131 return PixelFormat::A8B8G8R8_UNORM; 137 return PixelFormat::A8B8G8R8_UNORM;
132 case Tegra::RenderTargetFormat::A8B8G8R8_SRGB: 138 case Tegra::RenderTargetFormat::A8B8G8R8_SRGB:
139 case Tegra::RenderTargetFormat::X8B8G8R8_SRGB:
133 return PixelFormat::A8B8G8R8_SRGB; 140 return PixelFormat::A8B8G8R8_SRGB;
134 case Tegra::RenderTargetFormat::A8B8G8R8_SNORM: 141 case Tegra::RenderTargetFormat::A8B8G8R8_SNORM:
135 return PixelFormat::A8B8G8R8_SNORM; 142 return PixelFormat::A8B8G8R8_SNORM;
@@ -158,6 +165,7 @@ PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format)
158 case Tegra::RenderTargetFormat::R5G6B5_UNORM: 165 case Tegra::RenderTargetFormat::R5G6B5_UNORM:
159 return PixelFormat::R5G6B5_UNORM; 166 return PixelFormat::R5G6B5_UNORM;
160 case Tegra::RenderTargetFormat::A1R5G5B5_UNORM: 167 case Tegra::RenderTargetFormat::A1R5G5B5_UNORM:
168 case Tegra::RenderTargetFormat::X1R5G5B5_UNORM:
161 return PixelFormat::A1R5G5B5_UNORM; 169 return PixelFormat::A1R5G5B5_UNORM;
162 case Tegra::RenderTargetFormat::R8G8_UNORM: 170 case Tegra::RenderTargetFormat::R8G8_UNORM:
163 return PixelFormat::R8G8_UNORM; 171 return PixelFormat::R8G8_UNORM;
diff --git a/src/video_core/surface.h b/src/video_core/surface.h
index 57ca7f597..44b79af20 100644
--- a/src/video_core/surface.h
+++ b/src/video_core/surface.h
@@ -23,6 +23,7 @@ enum class PixelFormat {
23 A1R5G5B5_UNORM, 23 A1R5G5B5_UNORM,
24 A2B10G10R10_UNORM, 24 A2B10G10R10_UNORM,
25 A2B10G10R10_UINT, 25 A2B10G10R10_UINT,
26 A2R10G10B10_UNORM,
26 A1B5G5R5_UNORM, 27 A1B5G5R5_UNORM,
27 A5B5G5R1_UNORM, 28 A5B5G5R1_UNORM,
28 R8_UNORM, 29 R8_UNORM,
@@ -159,6 +160,7 @@ constexpr std::array<u8, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{
159 1, // A1R5G5B5_UNORM 160 1, // A1R5G5B5_UNORM
160 1, // A2B10G10R10_UNORM 161 1, // A2B10G10R10_UNORM
161 1, // A2B10G10R10_UINT 162 1, // A2B10G10R10_UINT
163 1, // A2R10G10B10_UNORM
162 1, // A1B5G5R5_UNORM 164 1, // A1B5G5R5_UNORM
163 1, // A5B5G5R1_UNORM 165 1, // A5B5G5R1_UNORM
164 1, // R8_UNORM 166 1, // R8_UNORM
@@ -264,6 +266,7 @@ constexpr std::array<u8, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{
264 1, // A1R5G5B5_UNORM 266 1, // A1R5G5B5_UNORM
265 1, // A2B10G10R10_UNORM 267 1, // A2B10G10R10_UNORM
266 1, // A2B10G10R10_UINT 268 1, // A2B10G10R10_UINT
269 1, // A2R10G10B10_UNORM
267 1, // A1B5G5R5_UNORM 270 1, // A1B5G5R5_UNORM
268 1, // A5B5G5R1_UNORM 271 1, // A5B5G5R1_UNORM
269 1, // R8_UNORM 272 1, // R8_UNORM
@@ -369,6 +372,7 @@ constexpr std::array<u8, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{
369 16, // A1R5G5B5_UNORM 372 16, // A1R5G5B5_UNORM
370 32, // A2B10G10R10_UNORM 373 32, // A2B10G10R10_UNORM
371 32, // A2B10G10R10_UINT 374 32, // A2B10G10R10_UINT
375 32, // A2R10G10B10_UNORM
372 16, // A1B5G5R5_UNORM 376 16, // A1B5G5R5_UNORM
373 16, // A5B5G5R1_UNORM 377 16, // A5B5G5R1_UNORM
374 8, // R8_UNORM 378 8, // R8_UNORM
diff --git a/src/video_core/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h
index acc854715..f1f0a057b 100644
--- a/src/video_core/texture_cache/formatter.h
+++ b/src/video_core/texture_cache/formatter.h
@@ -35,6 +35,8 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str
35 return "A2B10G10R10_UNORM"; 35 return "A2B10G10R10_UNORM";
36 case PixelFormat::A2B10G10R10_UINT: 36 case PixelFormat::A2B10G10R10_UINT:
37 return "A2B10G10R10_UINT"; 37 return "A2B10G10R10_UINT";
38 case PixelFormat::A2R10G10B10_UNORM:
39 return "A2R10G10B10_UNORM";
38 case PixelFormat::A1B5G5R5_UNORM: 40 case PixelFormat::A1B5G5R5_UNORM:
39 return "A1B5G5R5_UNORM"; 41 return "A1B5G5R5_UNORM";
40 case PixelFormat::A5B5G5R1_UNORM: 42 case PixelFormat::A5B5G5R1_UNORM: