gl_rasterizer_cache: Implement G8R8S format.
- Used by Super Mario Odyssey.
This commit is contained in:
parent
d1520410a3
commit
d8fd3ef4fe
|
@ -119,7 +119,8 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form
|
||||||
{GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, ComponentType::UNorm,
|
{GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, ComponentType::UNorm,
|
||||||
true}, // BC7U
|
true}, // BC7U
|
||||||
{GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // ASTC_2D_4X4
|
{GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // ASTC_2D_4X4
|
||||||
{GL_RG8, GL_RG, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // G8R8
|
{GL_RG8, GL_RG, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // G8R8U
|
||||||
|
{GL_RG8, GL_RG, GL_BYTE, ComponentType::SNorm, false}, // G8R8S
|
||||||
{GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // BGRA8
|
{GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // BGRA8
|
||||||
{GL_RGBA32F, GL_RGBA, GL_FLOAT, ComponentType::Float, false}, // RGBA32F
|
{GL_RGBA32F, GL_RGBA, GL_FLOAT, ComponentType::Float, false}, // RGBA32F
|
||||||
{GL_RG32F, GL_RG, GL_FLOAT, ComponentType::Float, false}, // RG32F
|
{GL_RG32F, GL_RG, GL_FLOAT, ComponentType::Float, false}, // RG32F
|
||||||
|
@ -260,7 +261,8 @@ static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPU
|
||||||
MortonCopy<true, PixelFormat::DXN2SNORM>,
|
MortonCopy<true, PixelFormat::DXN2SNORM>,
|
||||||
MortonCopy<true, PixelFormat::BC7U>,
|
MortonCopy<true, PixelFormat::BC7U>,
|
||||||
MortonCopy<true, PixelFormat::ASTC_2D_4X4>,
|
MortonCopy<true, PixelFormat::ASTC_2D_4X4>,
|
||||||
MortonCopy<true, PixelFormat::G8R8>,
|
MortonCopy<true, PixelFormat::G8R8U>,
|
||||||
|
MortonCopy<true, PixelFormat::G8R8S>,
|
||||||
MortonCopy<true, PixelFormat::BGRA8>,
|
MortonCopy<true, PixelFormat::BGRA8>,
|
||||||
MortonCopy<true, PixelFormat::RGBA32F>,
|
MortonCopy<true, PixelFormat::RGBA32F>,
|
||||||
MortonCopy<true, PixelFormat::RG32F>,
|
MortonCopy<true, PixelFormat::RG32F>,
|
||||||
|
@ -315,7 +317,8 @@ static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPU
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr,
|
nullptr,
|
||||||
MortonCopy<false, PixelFormat::G8R8>,
|
MortonCopy<false, PixelFormat::G8R8U>,
|
||||||
|
MortonCopy<false, PixelFormat::G8R8S>,
|
||||||
MortonCopy<false, PixelFormat::BGRA8>,
|
MortonCopy<false, PixelFormat::BGRA8>,
|
||||||
MortonCopy<false, PixelFormat::RGBA32F>,
|
MortonCopy<false, PixelFormat::RGBA32F>,
|
||||||
MortonCopy<false, PixelFormat::RG32F>,
|
MortonCopy<false, PixelFormat::RG32F>,
|
||||||
|
@ -461,7 +464,7 @@ static void ConvertS8Z24ToZ24S8(std::vector<u8>& data, u32 width, u32 height) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ConvertG8R8ToR8G8(std::vector<u8>& data, u32 width, u32 height) {
|
static void ConvertG8R8ToR8G8(std::vector<u8>& data, u32 width, u32 height) {
|
||||||
const auto bpp{CachedSurface::GetGLBytesPerPixel(PixelFormat::G8R8)};
|
const auto bpp{CachedSurface::GetGLBytesPerPixel(PixelFormat::G8R8U)};
|
||||||
for (size_t y = 0; y < height; ++y) {
|
for (size_t y = 0; y < height; ++y) {
|
||||||
for (size_t x = 0; x < width; ++x) {
|
for (size_t x = 0; x < width; ++x) {
|
||||||
const size_t offset{bpp * (y * width + x)};
|
const size_t offset{bpp * (y * width + x)};
|
||||||
|
@ -493,7 +496,8 @@ static void ConvertFormatAsNeeded_LoadGLBuffer(std::vector<u8>& data, PixelForma
|
||||||
ConvertS8Z24ToZ24S8(data, width, height);
|
ConvertS8Z24ToZ24S8(data, width, height);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PixelFormat::G8R8:
|
case PixelFormat::G8R8U:
|
||||||
|
case PixelFormat::G8R8S:
|
||||||
// Convert the G8R8 color format to R8G8, as OpenGL does not support G8R8.
|
// Convert the G8R8 color format to R8G8, as OpenGL does not support G8R8.
|
||||||
ConvertG8R8ToR8G8(data, width, height);
|
ConvertG8R8ToR8G8(data, width, height);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -43,36 +43,37 @@ struct SurfaceParams {
|
||||||
DXN2SNORM = 17,
|
DXN2SNORM = 17,
|
||||||
BC7U = 18,
|
BC7U = 18,
|
||||||
ASTC_2D_4X4 = 19,
|
ASTC_2D_4X4 = 19,
|
||||||
G8R8 = 20,
|
G8R8U = 20,
|
||||||
BGRA8 = 21,
|
G8R8S = 21,
|
||||||
RGBA32F = 22,
|
BGRA8 = 22,
|
||||||
RG32F = 23,
|
RGBA32F = 23,
|
||||||
R32F = 24,
|
RG32F = 24,
|
||||||
R16F = 25,
|
R32F = 25,
|
||||||
R16UNORM = 26,
|
R16F = 26,
|
||||||
R16S = 27,
|
R16UNORM = 27,
|
||||||
R16UI = 28,
|
R16S = 28,
|
||||||
R16I = 29,
|
R16UI = 29,
|
||||||
RG16 = 30,
|
R16I = 30,
|
||||||
RG16F = 31,
|
RG16 = 31,
|
||||||
RG16UI = 32,
|
RG16F = 32,
|
||||||
RG16I = 33,
|
RG16UI = 33,
|
||||||
RG16S = 34,
|
RG16I = 34,
|
||||||
RGB32F = 35,
|
RG16S = 35,
|
||||||
SRGBA8 = 36,
|
RGB32F = 36,
|
||||||
RG8U = 37,
|
SRGBA8 = 37,
|
||||||
RG8S = 38,
|
RG8U = 38,
|
||||||
RG32UI = 39,
|
RG8S = 39,
|
||||||
R32UI = 40,
|
RG32UI = 40,
|
||||||
|
R32UI = 41,
|
||||||
|
|
||||||
MaxColorFormat,
|
MaxColorFormat,
|
||||||
|
|
||||||
// DepthStencil formats
|
// DepthStencil formats
|
||||||
Z24S8 = 41,
|
Z24S8 = 42,
|
||||||
S8Z24 = 42,
|
S8Z24 = 43,
|
||||||
Z32F = 43,
|
Z32F = 44,
|
||||||
Z16 = 44,
|
Z16 = 45,
|
||||||
Z32FS8 = 45,
|
Z32FS8 = 46,
|
||||||
|
|
||||||
MaxDepthStencilFormat,
|
MaxDepthStencilFormat,
|
||||||
|
|
||||||
|
@ -130,7 +131,8 @@ struct SurfaceParams {
|
||||||
4, // DXN2SNORM
|
4, // DXN2SNORM
|
||||||
4, // BC7U
|
4, // BC7U
|
||||||
4, // ASTC_2D_4X4
|
4, // ASTC_2D_4X4
|
||||||
1, // G8R8
|
1, // G8R8U
|
||||||
|
1, // G8R8S
|
||||||
1, // BGRA8
|
1, // BGRA8
|
||||||
1, // RGBA32F
|
1, // RGBA32F
|
||||||
1, // RG32F
|
1, // RG32F
|
||||||
|
@ -187,7 +189,8 @@ struct SurfaceParams {
|
||||||
128, // DXN2SNORM
|
128, // DXN2SNORM
|
||||||
128, // BC7U
|
128, // BC7U
|
||||||
32, // ASTC_2D_4X4
|
32, // ASTC_2D_4X4
|
||||||
16, // G8R8
|
16, // G8R8U
|
||||||
|
16, // G8R8S
|
||||||
32, // BGRA8
|
32, // BGRA8
|
||||||
128, // RGBA32F
|
128, // RGBA32F
|
||||||
64, // RG32F
|
64, // RG32F
|
||||||
|
@ -341,7 +344,15 @@ struct SurfaceParams {
|
||||||
static_cast<u32>(component_type));
|
static_cast<u32>(component_type));
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
case Tegra::Texture::TextureFormat::G8R8:
|
case Tegra::Texture::TextureFormat::G8R8:
|
||||||
return PixelFormat::G8R8;
|
switch (component_type) {
|
||||||
|
case Tegra::Texture::ComponentType::UNORM:
|
||||||
|
return PixelFormat::G8R8U;
|
||||||
|
case Tegra::Texture::ComponentType::SNORM:
|
||||||
|
return PixelFormat::G8R8S;
|
||||||
|
}
|
||||||
|
LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}",
|
||||||
|
static_cast<u32>(component_type));
|
||||||
|
UNREACHABLE();
|
||||||
case Tegra::Texture::TextureFormat::R16_G16_B16_A16:
|
case Tegra::Texture::TextureFormat::R16_G16_B16_A16:
|
||||||
return PixelFormat::RGBA16F;
|
return PixelFormat::RGBA16F;
|
||||||
case Tegra::Texture::TextureFormat::BF10GF11RF11:
|
case Tegra::Texture::TextureFormat::BF10GF11RF11:
|
||||||
|
|
Reference in New Issue