diff options
| author | 2022-11-06 15:19:08 +0100 | |
|---|---|---|
| committer | 2022-11-24 20:35:44 +0100 | |
| commit | 7356ab1de6ab7336da426b9176daafb3ebb503f5 (patch) | |
| tree | d5d348714633de2a1788bc0d114b32045f24f7f8 | |
| parent | MaxwellDMA: Implement BlockLinear to BlockLinear copies. (diff) | |
| download | yuzu-7356ab1de6ab7336da426b9176daafb3ebb503f5.tar.gz yuzu-7356ab1de6ab7336da426b9176daafb3ebb503f5.tar.xz yuzu-7356ab1de6ab7336da426b9176daafb3ebb503f5.zip | |
GPU: Implement additional render target formats.
| -rw-r--r-- | src/video_core/engines/sw_blitter/converter.cpp | 106 | ||||
| -rw-r--r-- | src/video_core/gpu.h | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/maxwell_to_gl.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/maxwell_to_vk.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/surface.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/surface.h | 4 | ||||
| -rw-r--r-- | src/video_core/texture_cache/formatter.h | 2 |
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 | ||
| 136 | struct R32B32G32A32_FLOATTraits { | 136 | struct 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 | ||
| 145 | struct R32G32B32A32_SINTTraits { | 145 | struct 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 | ||
| 163 | struct 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 | |||
| 172 | struct 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 | |||
| 181 | struct 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 | |||
| 163 | struct R16G16B16A16_UNORMTraits { | 190 | struct 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 | ||
| 307 | struct 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 | |||
| 280 | struct A8B8G8R8_UNORMTraits { | 316 | struct 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 | ||
| 583 | struct 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 | |||
| 592 | struct 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 | |||
| 601 | struct 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 | |||
| 547 | template <class ConverterTraits> | 610 | template <class ConverterTraits> |
| 548 | class ConverterImpl : public Converter { | 611 | class ConverterImpl : public Converter { |
| 549 | private: | 612 | private: |
| @@ -884,9 +947,9 @@ public: | |||
| 884 | 947 | ||
| 885 | Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) { | 948 | Converter* 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 |
| 28 | enum class RenderTargetFormat : u32 { | 28 | enum 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 | ||
| 94 | PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) { | 94 | PixelFormat 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: |