2
1
Fork 0
mirror of https://github.com/yuzu-emu/yuzu.git synced 2024-07-04 23:31:19 +01:00

GPU: Implement additional render target formats.

This commit is contained in:
Fernando Sahmkow 2022-11-06 15:19:08 +01:00
parent daf2ef8f1c
commit 7356ab1de6
7 changed files with 126 additions and 12 deletions

View file

@ -133,13 +133,13 @@ constexpr std::array<f32, 256> RGB_TO_SRGB_LUT = {
} // namespace } // namespace
struct R32B32G32A32_FLOATTraits { struct R32G32B32A32_FLOATTraits {
static constexpr size_t num_components = 4; static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = { static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT}; ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT};
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32}; static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
static constexpr std::array<Swizzle, num_components> component_swizzle = { static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::R, Swizzle::B, Swizzle::G, Swizzle::A}; Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A};
}; };
struct R32G32B32A32_SINTTraits { struct R32G32B32A32_SINTTraits {
@ -160,6 +160,33 @@ struct R32G32B32A32_UINTTraits {
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A}; Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A};
}; };
struct R32G32B32X32_FLOATTraits {
static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT};
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
};
struct R32G32B32X32_SINTTraits {
static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::SINT, ComponentType::SINT, ComponentType::SINT, ComponentType::SINT};
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
};
struct R32G32B32X32_UINTTraits {
static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::UINT, ComponentType::UINT, ComponentType::UINT, ComponentType::UINT};
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
};
struct R16G16B16A16_UNORMTraits { struct R16G16B16A16_UNORMTraits {
static constexpr size_t num_components = 4; static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = { static constexpr std::array<ComponentType, num_components> component_types = {
@ -277,6 +304,15 @@ struct A2B10G10R10_UINTTraits {
Swizzle::A, Swizzle::B, Swizzle::G, Swizzle::R}; Swizzle::A, Swizzle::B, Swizzle::G, Swizzle::R};
}; };
struct A2R10G10B10_UNORMTraits {
static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
static constexpr std::array<size_t, num_components> component_sizes = {2, 10, 10, 10};
static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::A, Swizzle::R, Swizzle::G, Swizzle::B};
};
struct A8B8G8R8_UNORMTraits { struct A8B8G8R8_UNORMTraits {
static constexpr size_t num_components = 4; static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = { static constexpr std::array<ComponentType, num_components> component_types = {
@ -544,6 +580,33 @@ struct R8_UINTTraits {
static constexpr std::array<Swizzle, num_components> component_swizzle = {Swizzle::R}; static constexpr std::array<Swizzle, num_components> component_swizzle = {Swizzle::R};
}; };
struct X1R5G5B5_UNORMTraits {
static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
static constexpr std::array<size_t, num_components> component_sizes = {1, 5, 5, 5};
static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::None, Swizzle::R, Swizzle::G, Swizzle::B};
};
struct X8B8G8R8_UNORMTraits {
static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
static constexpr std::array<size_t, num_components> component_sizes = {8, 8, 8, 8};
static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::None, Swizzle::B, Swizzle::G, Swizzle::R};
};
struct X8B8G8R8_SRGBTraits {
static constexpr size_t num_components = 4;
static constexpr std::array<ComponentType, num_components> component_types = {
ComponentType::SRGB, ComponentType::SRGB, ComponentType::SRGB, ComponentType::SRGB};
static constexpr std::array<size_t, num_components> component_sizes = {8, 8, 8, 8};
static constexpr std::array<Swizzle, num_components> component_swizzle = {
Swizzle::None, Swizzle::B, Swizzle::G, Swizzle::R};
};
template <class ConverterTraits> template <class ConverterTraits>
class ConverterImpl : public Converter { class ConverterImpl : public Converter {
private: private:
@ -884,9 +947,9 @@ public:
Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) { Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
switch (format) { switch (format) {
case RenderTargetFormat::R32B32G32A32_FLOAT: case RenderTargetFormat::R32G32B32A32_FLOAT:
return impl->converters_cache return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<R32B32G32A32_FLOATTraits>>()) .emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_FLOATTraits>>())
.first->second.get(); .first->second.get();
break; break;
case RenderTargetFormat::R32G32B32A32_SINT: case RenderTargetFormat::R32G32B32A32_SINT:
@ -899,6 +962,21 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
.emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_UINTTraits>>()) .emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_UINTTraits>>())
.first->second.get(); .first->second.get();
break; break;
case RenderTargetFormat::R32G32B32X32_FLOAT:
return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_FLOATTraits>>())
.first->second.get();
break;
case RenderTargetFormat::R32G32B32X32_SINT:
return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_SINTTraits>>())
.first->second.get();
break;
case RenderTargetFormat::R32G32B32X32_UINT:
return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_UINTTraits>>())
.first->second.get();
break;
case RenderTargetFormat::R16G16B16A16_UNORM: case RenderTargetFormat::R16G16B16A16_UNORM:
return impl->converters_cache return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<R16G16B16A16_UNORMTraits>>()) .emplace(format, std::make_unique<ConverterImpl<R16G16B16A16_UNORMTraits>>())
@ -964,6 +1042,11 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
.emplace(format, std::make_unique<ConverterImpl<A2B10G10R10_UINTTraits>>()) .emplace(format, std::make_unique<ConverterImpl<A2B10G10R10_UINTTraits>>())
.first->second.get(); .first->second.get();
break; break;
case RenderTargetFormat::A2R10G10B10_UNORM:
return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<A2R10G10B10_UNORMTraits>>())
.first->second.get();
break;
case RenderTargetFormat::A8B8G8R8_UNORM: case RenderTargetFormat::A8B8G8R8_UNORM:
return impl->converters_cache return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<A8B8G8R8_UNORMTraits>>()) .emplace(format, std::make_unique<ConverterImpl<A8B8G8R8_UNORMTraits>>())
@ -1119,6 +1202,21 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
.emplace(format, std::make_unique<ConverterImpl<R8_UINTTraits>>()) .emplace(format, std::make_unique<ConverterImpl<R8_UINTTraits>>())
.first->second.get(); .first->second.get();
break; break;
case RenderTargetFormat::X1R5G5B5_UNORM:
return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<X1R5G5B5_UNORMTraits>>())
.first->second.get();
break;
case RenderTargetFormat::X8B8G8R8_UNORM:
return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<X8B8G8R8_UNORMTraits>>())
.first->second.get();
break;
case RenderTargetFormat::X8B8G8R8_SRGB:
return impl->converters_cache
.emplace(format, std::make_unique<ConverterImpl<X8B8G8R8_SRGBTraits>>())
.first->second.get();
break;
default: { default: {
UNIMPLEMENTED_MSG("This format {} converter is not implemented", format); UNIMPLEMENTED_MSG("This format {} converter is not implemented", format);
return impl->converters_cache.emplace(format, std::make_unique<NullConverter>()) return impl->converters_cache.emplace(format, std::make_unique<NullConverter>())

View file

@ -27,12 +27,12 @@ struct CommandList;
// TODO: Implement the commented ones // TODO: Implement the commented ones
enum class RenderTargetFormat : u32 { enum class RenderTargetFormat : u32 {
NONE = 0x0, NONE = 0x0,
R32B32G32A32_FLOAT = 0xC0, R32G32B32A32_FLOAT = 0xC0,
R32G32B32A32_SINT = 0xC1, R32G32B32A32_SINT = 0xC1,
R32G32B32A32_UINT = 0xC2, R32G32B32A32_UINT = 0xC2,
// R32G32B32X32_FLOAT = 0xC3, R32G32B32X32_FLOAT = 0xC3,
// R32G32B32X32_SINT = 0xC4, R32G32B32X32_SINT = 0xC4,
// R32G32B32X32_UINT = 0xC5, R32G32B32X32_UINT = 0xC5,
R16G16B16A16_UNORM = 0xC6, R16G16B16A16_UNORM = 0xC6,
R16G16B16A16_SNORM = 0xC7, R16G16B16A16_SNORM = 0xC7,
R16G16B16A16_SINT = 0xC8, R16G16B16A16_SINT = 0xC8,
@ -56,7 +56,7 @@ enum class RenderTargetFormat : u32 {
R16G16_SINT = 0xDC, R16G16_SINT = 0xDC,
R16G16_UINT = 0xDD, R16G16_UINT = 0xDD,
R16G16_FLOAT = 0xDE, R16G16_FLOAT = 0xDE,
// A2R10G10B10_UNORM = 0xDF, A2R10G10B10_UNORM = 0xDF,
B10G11R11_FLOAT = 0xE0, B10G11R11_FLOAT = 0xE0,
R32_SINT = 0xE3, R32_SINT = 0xE3,
R32_UINT = 0xE4, R32_UINT = 0xE4,
@ -79,11 +79,11 @@ enum class RenderTargetFormat : u32 {
R8_SINT = 0xF5, R8_SINT = 0xF5,
R8_UINT = 0xF6, R8_UINT = 0xF6,
/* // A8_UNORM = 0xF7,
A8_UNORM = 0xF7,
X1R5G5B5_UNORM = 0xF8, X1R5G5B5_UNORM = 0xF8,
X8B8G8R8_UNORM = 0xF9, X8B8G8R8_UNORM = 0xF9,
X8B8G8R8_SRGB = 0xFA, X8B8G8R8_SRGB = 0xFA,
/*
Z1R5G5B5_UNORM = 0xFB, Z1R5G5B5_UNORM = 0xFB,
O1R5G5B5_UNORM = 0xFC, O1R5G5B5_UNORM = 0xFC,
Z8R8G8B8_UNORM = 0xFD, Z8R8G8B8_UNORM = 0xFD,

View file

@ -28,6 +28,7 @@ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> FORMAT_TAB
{GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1R5G5B5_UNORM {GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1R5G5B5_UNORM
{GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM
{GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT
{GL_RGB10_A2, GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2R10G10B10_UNORM
{GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM
{GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // A5B5G5R1_UNORM {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // A5B5G5R1_UNORM
{GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM

View file

@ -125,6 +125,7 @@ struct FormatTuple {
{VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM
{VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM
{VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT
{VK_FORMAT_A2R10G10B10_UNORM_PACK32, Attachable | Storage}, // A2R10G10B10_UNORM
{VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle)
{VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled) {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled)
{VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM

View file

@ -93,11 +93,14 @@ PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) { PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) {
switch (format) { switch (format) {
case Tegra::RenderTargetFormat::R32B32G32A32_FLOAT: case Tegra::RenderTargetFormat::R32G32B32A32_FLOAT:
case Tegra::RenderTargetFormat::R32G32B32X32_FLOAT:
return PixelFormat::R32G32B32A32_FLOAT; return PixelFormat::R32G32B32A32_FLOAT;
case Tegra::RenderTargetFormat::R32G32B32A32_SINT: case Tegra::RenderTargetFormat::R32G32B32A32_SINT:
case Tegra::RenderTargetFormat::R32G32B32X32_SINT:
return PixelFormat::R32G32B32A32_SINT; return PixelFormat::R32G32B32A32_SINT;
case Tegra::RenderTargetFormat::R32G32B32A32_UINT: case Tegra::RenderTargetFormat::R32G32B32A32_UINT:
case Tegra::RenderTargetFormat::R32G32B32X32_UINT:
return PixelFormat::R32G32B32A32_UINT; return PixelFormat::R32G32B32A32_UINT;
case Tegra::RenderTargetFormat::R16G16B16A16_UNORM: case Tegra::RenderTargetFormat::R16G16B16A16_UNORM:
return PixelFormat::R16G16B16A16_UNORM; return PixelFormat::R16G16B16A16_UNORM;
@ -127,9 +130,13 @@ PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format)
return PixelFormat::A2B10G10R10_UNORM; return PixelFormat::A2B10G10R10_UNORM;
case Tegra::RenderTargetFormat::A2B10G10R10_UINT: case Tegra::RenderTargetFormat::A2B10G10R10_UINT:
return PixelFormat::A2B10G10R10_UINT; return PixelFormat::A2B10G10R10_UINT;
case Tegra::RenderTargetFormat::A2R10G10B10_UNORM:
return PixelFormat::A2R10G10B10_UNORM;
case Tegra::RenderTargetFormat::A8B8G8R8_UNORM: case Tegra::RenderTargetFormat::A8B8G8R8_UNORM:
case Tegra::RenderTargetFormat::X8B8G8R8_UNORM:
return PixelFormat::A8B8G8R8_UNORM; return PixelFormat::A8B8G8R8_UNORM;
case Tegra::RenderTargetFormat::A8B8G8R8_SRGB: case Tegra::RenderTargetFormat::A8B8G8R8_SRGB:
case Tegra::RenderTargetFormat::X8B8G8R8_SRGB:
return PixelFormat::A8B8G8R8_SRGB; return PixelFormat::A8B8G8R8_SRGB;
case Tegra::RenderTargetFormat::A8B8G8R8_SNORM: case Tegra::RenderTargetFormat::A8B8G8R8_SNORM:
return PixelFormat::A8B8G8R8_SNORM; return PixelFormat::A8B8G8R8_SNORM;
@ -158,6 +165,7 @@ PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format)
case Tegra::RenderTargetFormat::R5G6B5_UNORM: case Tegra::RenderTargetFormat::R5G6B5_UNORM:
return PixelFormat::R5G6B5_UNORM; return PixelFormat::R5G6B5_UNORM;
case Tegra::RenderTargetFormat::A1R5G5B5_UNORM: case Tegra::RenderTargetFormat::A1R5G5B5_UNORM:
case Tegra::RenderTargetFormat::X1R5G5B5_UNORM:
return PixelFormat::A1R5G5B5_UNORM; return PixelFormat::A1R5G5B5_UNORM;
case Tegra::RenderTargetFormat::R8G8_UNORM: case Tegra::RenderTargetFormat::R8G8_UNORM:
return PixelFormat::R8G8_UNORM; return PixelFormat::R8G8_UNORM;

View file

@ -23,6 +23,7 @@ enum class PixelFormat {
A1R5G5B5_UNORM, A1R5G5B5_UNORM,
A2B10G10R10_UNORM, A2B10G10R10_UNORM,
A2B10G10R10_UINT, A2B10G10R10_UINT,
A2R10G10B10_UNORM,
A1B5G5R5_UNORM, A1B5G5R5_UNORM,
A5B5G5R1_UNORM, A5B5G5R1_UNORM,
R8_UNORM, R8_UNORM,
@ -159,6 +160,7 @@ constexpr std::array<u8, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{
1, // A1R5G5B5_UNORM 1, // A1R5G5B5_UNORM
1, // A2B10G10R10_UNORM 1, // A2B10G10R10_UNORM
1, // A2B10G10R10_UINT 1, // A2B10G10R10_UINT
1, // A2R10G10B10_UNORM
1, // A1B5G5R5_UNORM 1, // A1B5G5R5_UNORM
1, // A5B5G5R1_UNORM 1, // A5B5G5R1_UNORM
1, // R8_UNORM 1, // R8_UNORM
@ -264,6 +266,7 @@ constexpr std::array<u8, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{
1, // A1R5G5B5_UNORM 1, // A1R5G5B5_UNORM
1, // A2B10G10R10_UNORM 1, // A2B10G10R10_UNORM
1, // A2B10G10R10_UINT 1, // A2B10G10R10_UINT
1, // A2R10G10B10_UNORM
1, // A1B5G5R5_UNORM 1, // A1B5G5R5_UNORM
1, // A5B5G5R1_UNORM 1, // A5B5G5R1_UNORM
1, // R8_UNORM 1, // R8_UNORM
@ -369,6 +372,7 @@ constexpr std::array<u8, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{
16, // A1R5G5B5_UNORM 16, // A1R5G5B5_UNORM
32, // A2B10G10R10_UNORM 32, // A2B10G10R10_UNORM
32, // A2B10G10R10_UINT 32, // A2B10G10R10_UINT
32, // A2R10G10B10_UNORM
16, // A1B5G5R5_UNORM 16, // A1B5G5R5_UNORM
16, // A5B5G5R1_UNORM 16, // A5B5G5R1_UNORM
8, // R8_UNORM 8, // R8_UNORM

View file

@ -35,6 +35,8 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str
return "A2B10G10R10_UNORM"; return "A2B10G10R10_UNORM";
case PixelFormat::A2B10G10R10_UINT: case PixelFormat::A2B10G10R10_UINT:
return "A2B10G10R10_UINT"; return "A2B10G10R10_UINT";
case PixelFormat::A2R10G10B10_UNORM:
return "A2R10G10B10_UNORM";
case PixelFormat::A1B5G5R5_UNORM: case PixelFormat::A1B5G5R5_UNORM:
return "A1B5G5R5_UNORM"; return "A1B5G5R5_UNORM";
case PixelFormat::A5B5G5R1_UNORM: case PixelFormat::A5B5G5R1_UNORM: