gl_rasterizer_cache: Implement G8R8S format.

- Used by Super Mario Odyssey.
master
bunnei 2018-08-14 20:31:19 +07:00
parent d1520410a3
commit d8fd3ef4fe
2 changed files with 49 additions and 34 deletions

@ -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: