Implement R16S & R16UI & R16I RenderTargetFormats & PixelFormats and more (R16_UNORM needed by Fate Extella) (#848)

* Implement R16S & R16UI & R16I RenderTargetFormats & PixelFormats


Do a separate function in order to get Bytes Per Pixel of DepthFormat


Apply the new function in gpu.h


delete unneeded white space

* correct merging error
This commit is contained in:
greggameplayer 2018-08-11 20:01:50 +02:00 committed by bunnei
parent 4f0818144e
commit dfcde52f39
4 changed files with 92 additions and 19 deletions

View file

@ -34,19 +34,51 @@ u32 RenderTargetBytesPerPixel(RenderTargetFormat format) {
switch (format) { switch (format) {
case RenderTargetFormat::RGBA32_FLOAT: case RenderTargetFormat::RGBA32_FLOAT:
case RenderTargetFormat::RGBA32_UINT:
return 16; return 16;
case RenderTargetFormat::RGBA16_FLOAT: case RenderTargetFormat::RGBA16_FLOAT:
case RenderTargetFormat::RG32_FLOAT: case RenderTargetFormat::RG32_FLOAT:
return 8; return 8;
case RenderTargetFormat::RGBA8_UNORM: case RenderTargetFormat::RGBA8_UNORM:
case RenderTargetFormat::RGBA8_SRGB:
case RenderTargetFormat::RGB10_A2_UNORM: case RenderTargetFormat::RGB10_A2_UNORM:
case RenderTargetFormat::BGRA8_UNORM: case RenderTargetFormat::BGRA8_UNORM:
case RenderTargetFormat::RG16_UNORM:
case RenderTargetFormat::RG16_SNORM:
case RenderTargetFormat::RG16_UINT:
case RenderTargetFormat::RG16_SINT:
case RenderTargetFormat::RG16_FLOAT:
case RenderTargetFormat::R32_FLOAT: case RenderTargetFormat::R32_FLOAT:
case RenderTargetFormat::R11G11B10_FLOAT: case RenderTargetFormat::R11G11B10_FLOAT:
return 4; return 4;
case RenderTargetFormat::R16_UNORM:
case RenderTargetFormat::R16_SNORM:
case RenderTargetFormat::R16_UINT:
case RenderTargetFormat::R16_SINT:
case RenderTargetFormat::R16_FLOAT:
return 2;
case RenderTargetFormat::R8_UNORM:
return 1;
default: default:
UNIMPLEMENTED_MSG("Unimplemented render target format {}", static_cast<u32>(format)); UNIMPLEMENTED_MSG("Unimplemented render target format {}", static_cast<u32>(format));
} }
} }
u32 DepthFormatBytesPerPixel(DepthFormat format) {
switch (format) {
case DepthFormat::Z32_S8_X24_FLOAT:
return 8;
case DepthFormat::Z32_FLOAT:
case DepthFormat::S8_Z24_UNORM:
case DepthFormat::Z24_X8_UNORM:
case DepthFormat::Z24_S8_UNORM:
case DepthFormat::Z24_C8_UNORM:
return 4;
case DepthFormat::Z16_UNORM:
return 2;
default:
UNIMPLEMENTED_MSG("Unimplemented Depth format {}", static_cast<u32>(format));
}
}
} // namespace Tegra } // namespace Tegra

View file

@ -35,6 +35,10 @@ enum class RenderTargetFormat : u32 {
R11G11B10_FLOAT = 0xE0, R11G11B10_FLOAT = 0xE0,
R32_FLOAT = 0xE5, R32_FLOAT = 0xE5,
B5G6R5_UNORM = 0xE8, B5G6R5_UNORM = 0xE8,
R16_UNORM = 0xEE,
R16_SNORM = 0xEF,
R16_SINT = 0xF0,
R16_UINT = 0xF1,
R16_FLOAT = 0xF2, R16_FLOAT = 0xF2,
R8_UNORM = 0xF3, R8_UNORM = 0xF3,
}; };
@ -52,6 +56,9 @@ enum class DepthFormat : u32 {
/// Returns the number of bytes per pixel of each rendertarget format. /// Returns the number of bytes per pixel of each rendertarget format.
u32 RenderTargetBytesPerPixel(RenderTargetFormat format); u32 RenderTargetBytesPerPixel(RenderTargetFormat format);
/// Returns the number of bytes per pixel of each depth format.
u32 DepthFormatBytesPerPixel(DepthFormat format);
class DebugContext; class DebugContext;
/** /**

View file

@ -122,6 +122,9 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form
{GL_R32F, GL_RED, GL_FLOAT, ComponentType::Float, false}, // R32F {GL_R32F, GL_RED, GL_FLOAT, ComponentType::Float, false}, // R32F
{GL_R16F, GL_RED, GL_HALF_FLOAT, ComponentType::Float, false}, // R16F {GL_R16F, GL_RED, GL_HALF_FLOAT, ComponentType::Float, false}, // R16F
{GL_R16, GL_RED, GL_UNSIGNED_SHORT, ComponentType::UNorm, false}, // R16UNORM {GL_R16, GL_RED, GL_UNSIGNED_SHORT, ComponentType::UNorm, false}, // R16UNORM
{GL_R16_SNORM, GL_RED, GL_SHORT, ComponentType::SNorm, false}, // R16S
{GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT, ComponentType::UInt, false}, // R16UI
{GL_R16I, GL_RED_INTEGER, GL_SHORT, ComponentType::SInt, false}, // R16I
{GL_RG16, GL_RG, GL_UNSIGNED_SHORT, ComponentType::UNorm, false}, // RG16 {GL_RG16, GL_RG, GL_UNSIGNED_SHORT, ComponentType::UNorm, false}, // RG16
{GL_RG16F, GL_RG, GL_HALF_FLOAT, ComponentType::Float, false}, // RG16F {GL_RG16F, GL_RG, GL_HALF_FLOAT, ComponentType::Float, false}, // RG16F
{GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT, ComponentType::UInt, false}, // RG16UI {GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT, ComponentType::UInt, false}, // RG16UI
@ -239,13 +242,14 @@ static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPU
MortonCopy<true, PixelFormat::G8R8>, MortonCopy<true, PixelFormat::BGRA8>, MortonCopy<true, PixelFormat::G8R8>, MortonCopy<true, PixelFormat::BGRA8>,
MortonCopy<true, PixelFormat::RGBA32F>, MortonCopy<true, PixelFormat::RG32F>, MortonCopy<true, PixelFormat::RGBA32F>, MortonCopy<true, PixelFormat::RG32F>,
MortonCopy<true, PixelFormat::R32F>, MortonCopy<true, PixelFormat::R16F>, MortonCopy<true, PixelFormat::R32F>, MortonCopy<true, PixelFormat::R16F>,
MortonCopy<true, PixelFormat::R16UNORM>, MortonCopy<true, PixelFormat::RG16>, MortonCopy<true, PixelFormat::R16UNORM>, MortonCopy<true, PixelFormat::R16S>,
MortonCopy<true, PixelFormat::RG16F>, MortonCopy<true, PixelFormat::RG16UI>, MortonCopy<true, PixelFormat::R16UI>, MortonCopy<true, PixelFormat::R16I>,
MortonCopy<true, PixelFormat::RG16I>, MortonCopy<true, PixelFormat::RG16S>, MortonCopy<true, PixelFormat::RG16>, MortonCopy<true, PixelFormat::RG16F>,
MortonCopy<true, PixelFormat::RGB32F>, MortonCopy<true, PixelFormat::SRGBA8>, MortonCopy<true, PixelFormat::RG16UI>, MortonCopy<true, PixelFormat::RG16I>,
MortonCopy<true, PixelFormat::Z24S8>, MortonCopy<true, PixelFormat::S8Z24>, MortonCopy<true, PixelFormat::RG16S>, MortonCopy<true, PixelFormat::RGB32F>,
MortonCopy<true, PixelFormat::Z32F>, MortonCopy<true, PixelFormat::Z16>, MortonCopy<true, PixelFormat::SRGBA8>, MortonCopy<true, PixelFormat::Z24S8>,
MortonCopy<true, PixelFormat::Z32FS8>, MortonCopy<true, PixelFormat::S8Z24>, MortonCopy<true, PixelFormat::Z32F>,
MortonCopy<true, PixelFormat::Z16>, MortonCopy<true, PixelFormat::Z32FS8>,
}; };
static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPUVAddr), static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPUVAddr),
@ -276,6 +280,9 @@ static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPU
MortonCopy<false, PixelFormat::R32F>, MortonCopy<false, PixelFormat::R32F>,
MortonCopy<false, PixelFormat::R16F>, MortonCopy<false, PixelFormat::R16F>,
MortonCopy<false, PixelFormat::R16UNORM>, MortonCopy<false, PixelFormat::R16UNORM>,
MortonCopy<false, PixelFormat::R16S>,
MortonCopy<false, PixelFormat::R16UI>,
MortonCopy<false, PixelFormat::R16I>,
MortonCopy<false, PixelFormat::RG16>, MortonCopy<false, PixelFormat::RG16>,
MortonCopy<false, PixelFormat::RG16F>, MortonCopy<false, PixelFormat::RG16F>,
MortonCopy<false, PixelFormat::RG16UI>, MortonCopy<false, PixelFormat::RG16UI>,

View file

@ -46,22 +46,25 @@ struct SurfaceParams {
R32F = 20, R32F = 20,
R16F = 21, R16F = 21,
R16UNORM = 22, R16UNORM = 22,
RG16 = 23, R16S = 23,
RG16F = 24, R16UI = 24,
RG16UI = 25, R16I = 25,
RG16I = 26, RG16 = 26,
RG16S = 27, RG16F = 27,
RGB32F = 28, RG16UI = 28,
SRGBA8 = 29, RG16I = 29,
RG16S = 30,
RGB32F = 31,
SRGBA8 = 32,
MaxColorFormat, MaxColorFormat,
// DepthStencil formats // DepthStencil formats
Z24S8 = 30, Z24S8 = 33,
S8Z24 = 31, S8Z24 = 34,
Z32F = 32, Z32F = 35,
Z16 = 33, Z16 = 36,
Z32FS8 = 34, Z32FS8 = 37,
MaxDepthStencilFormat, MaxDepthStencilFormat,
@ -122,6 +125,9 @@ struct SurfaceParams {
1, // R32F 1, // R32F
1, // R16F 1, // R16F
1, // R16UNORM 1, // R16UNORM
1, // R16S
1, // R16UI
1, // R16I
1, // RG16 1, // RG16
1, // RG16F 1, // RG16F
1, // RG16UI 1, // RG16UI
@ -168,6 +174,9 @@ struct SurfaceParams {
32, // R32F 32, // R32F
16, // R16F 16, // R16F
16, // R16UNORM 16, // R16UNORM
16, // R16S
16, // R16UI
16, // R16I
32, // RG16 32, // RG16
32, // RG16F 32, // RG16F
32, // RG16UI 32, // RG16UI
@ -245,6 +254,14 @@ struct SurfaceParams {
return PixelFormat::RG16S; return PixelFormat::RG16S;
case Tegra::RenderTargetFormat::R16_FLOAT: case Tegra::RenderTargetFormat::R16_FLOAT:
return PixelFormat::R16F; return PixelFormat::R16F;
case Tegra::RenderTargetFormat::R16_UNORM:
return PixelFormat::R16UNORM;
case Tegra::RenderTargetFormat::R16_SNORM:
return PixelFormat::R16S;
case Tegra::RenderTargetFormat::R16_UINT:
return PixelFormat::R16UI;
case Tegra::RenderTargetFormat::R16_SINT:
return PixelFormat::R16I;
case Tegra::RenderTargetFormat::R32_FLOAT: case Tegra::RenderTargetFormat::R32_FLOAT:
return PixelFormat::R32F; return PixelFormat::R32F;
default: default:
@ -293,6 +310,12 @@ struct SurfaceParams {
return PixelFormat::R16F; return PixelFormat::R16F;
case Tegra::Texture::ComponentType::UNORM: case Tegra::Texture::ComponentType::UNORM:
return PixelFormat::R16UNORM; return PixelFormat::R16UNORM;
case Tegra::Texture::ComponentType::SNORM:
return PixelFormat::R16S;
case Tegra::Texture::ComponentType::UINT:
return PixelFormat::R16UI;
case Tegra::Texture::ComponentType::SINT:
return PixelFormat::R16I;
} }
LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}",
static_cast<u32>(component_type)); static_cast<u32>(component_type));
@ -376,9 +399,11 @@ struct SurfaceParams {
case Tegra::RenderTargetFormat::RGB10_A2_UNORM: case Tegra::RenderTargetFormat::RGB10_A2_UNORM:
case Tegra::RenderTargetFormat::R8_UNORM: case Tegra::RenderTargetFormat::R8_UNORM:
case Tegra::RenderTargetFormat::RG16_UNORM: case Tegra::RenderTargetFormat::RG16_UNORM:
case Tegra::RenderTargetFormat::R16_UNORM:
case Tegra::RenderTargetFormat::B5G6R5_UNORM: case Tegra::RenderTargetFormat::B5G6R5_UNORM:
return ComponentType::UNorm; return ComponentType::UNorm;
case Tegra::RenderTargetFormat::RG16_SNORM: case Tegra::RenderTargetFormat::RG16_SNORM:
case Tegra::RenderTargetFormat::R16_SNORM:
return ComponentType::SNorm; return ComponentType::SNorm;
case Tegra::RenderTargetFormat::RGBA16_FLOAT: case Tegra::RenderTargetFormat::RGBA16_FLOAT:
case Tegra::RenderTargetFormat::R11G11B10_FLOAT: case Tegra::RenderTargetFormat::R11G11B10_FLOAT:
@ -390,8 +415,10 @@ struct SurfaceParams {
return ComponentType::Float; return ComponentType::Float;
case Tegra::RenderTargetFormat::RGBA32_UINT: case Tegra::RenderTargetFormat::RGBA32_UINT:
case Tegra::RenderTargetFormat::RG16_UINT: case Tegra::RenderTargetFormat::RG16_UINT:
case Tegra::RenderTargetFormat::R16_UINT:
return ComponentType::UInt; return ComponentType::UInt;
case Tegra::RenderTargetFormat::RG16_SINT: case Tegra::RenderTargetFormat::RG16_SINT:
case Tegra::RenderTargetFormat::R16_SINT:
return ComponentType::SInt; return ComponentType::SInt;
default: default:
LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));