Implement ASTC_2D_10X8 & ASTC_2D_10X8_SRGB (#1666)
* Implement ASTC_2D_10X8 & ASTC_2D_10X8_SRGB ( needed by Mario+Rabbids Kingdom Battle ) * Small placement correction
This commit is contained in:
		
							parent
							
								
									d08b876c9d
								
							
						
					
					
						commit
						c8b3f09876
					
				@ -314,6 +314,8 @@ static constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> tex
 | 
			
		||||
    {GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // ASTC_2D_5X4_SRGB
 | 
			
		||||
    {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false},        // ASTC_2D_5X5
 | 
			
		||||
    {GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // ASTC_2D_5X5_SRGB
 | 
			
		||||
    {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false},        // ASTC_2D_10X8
 | 
			
		||||
    {GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // ASTC_2D_10X8_SRGB
 | 
			
		||||
 | 
			
		||||
    // Depth formats
 | 
			
		||||
    {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, ComponentType::Float, false}, // Z32F
 | 
			
		||||
@ -456,6 +458,8 @@ static constexpr GLConversionArray morton_to_gl_fns = {
 | 
			
		||||
        MortonCopy<true, PixelFormat::ASTC_2D_5X4_SRGB>,
 | 
			
		||||
        MortonCopy<true, PixelFormat::ASTC_2D_5X5>,
 | 
			
		||||
        MortonCopy<true, PixelFormat::ASTC_2D_5X5_SRGB>,
 | 
			
		||||
        MortonCopy<true, PixelFormat::ASTC_2D_10X8>,
 | 
			
		||||
        MortonCopy<true, PixelFormat::ASTC_2D_10X8_SRGB>,
 | 
			
		||||
        MortonCopy<true, PixelFormat::Z32F>,
 | 
			
		||||
        MortonCopy<true, PixelFormat::Z16>,
 | 
			
		||||
        MortonCopy<true, PixelFormat::Z24S8>,
 | 
			
		||||
@ -526,6 +530,8 @@ static constexpr GLConversionArray gl_to_morton_fns = {
 | 
			
		||||
        nullptr,
 | 
			
		||||
        nullptr,
 | 
			
		||||
        nullptr,
 | 
			
		||||
        nullptr,
 | 
			
		||||
        nullptr,
 | 
			
		||||
        MortonCopy<false, PixelFormat::Z32F>,
 | 
			
		||||
        MortonCopy<false, PixelFormat::Z16>,
 | 
			
		||||
        MortonCopy<false, PixelFormat::Z24S8>,
 | 
			
		||||
@ -932,7 +938,9 @@ static void ConvertFormatAsNeeded_LoadGLBuffer(std::vector<u8>& data, PixelForma
 | 
			
		||||
    case PixelFormat::ASTC_2D_8X8_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_8X5_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_5X4_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_5X5_SRGB: {
 | 
			
		||||
    case PixelFormat::ASTC_2D_5X5_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_10X8:
 | 
			
		||||
    case PixelFormat::ASTC_2D_10X8_SRGB: {
 | 
			
		||||
        // Convert ASTC pixel formats to RGBA8, as most desktop GPUs do not support ASTC.
 | 
			
		||||
        u32 block_width{};
 | 
			
		||||
        u32 block_height{};
 | 
			
		||||
@ -967,7 +975,11 @@ static void ConvertFormatAsNeeded_FlushGLBuffer(std::vector<u8>& data, PixelForm
 | 
			
		||||
    case PixelFormat::ASTC_2D_4X4:
 | 
			
		||||
    case PixelFormat::ASTC_2D_8X8:
 | 
			
		||||
    case PixelFormat::ASTC_2D_4X4_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_8X8_SRGB: {
 | 
			
		||||
    case PixelFormat::ASTC_2D_8X8_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_5X5:
 | 
			
		||||
    case PixelFormat::ASTC_2D_5X5_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_10X8:
 | 
			
		||||
    case PixelFormat::ASTC_2D_10X8_SRGB: {
 | 
			
		||||
        LOG_CRITICAL(HW_GPU, "Conversion of format {} after texture flushing is not implemented",
 | 
			
		||||
                     static_cast<u32>(pixel_format));
 | 
			
		||||
        UNREACHABLE();
 | 
			
		||||
 | 
			
		||||
@ -306,6 +306,8 @@ PixelFormat PixelFormatFromTextureFormat(Tegra::Texture::TextureFormat format,
 | 
			
		||||
        return is_srgb ? PixelFormat::ASTC_2D_8X8_SRGB : PixelFormat::ASTC_2D_8X8;
 | 
			
		||||
    case Tegra::Texture::TextureFormat::ASTC_2D_8X5:
 | 
			
		||||
        return is_srgb ? PixelFormat::ASTC_2D_8X5_SRGB : PixelFormat::ASTC_2D_8X5;
 | 
			
		||||
    case Tegra::Texture::TextureFormat::ASTC_2D_10X8:
 | 
			
		||||
        return is_srgb ? PixelFormat::ASTC_2D_10X8_SRGB : PixelFormat::ASTC_2D_10X8;
 | 
			
		||||
    case Tegra::Texture::TextureFormat::R16_G16:
 | 
			
		||||
        switch (component_type) {
 | 
			
		||||
        case Tegra::Texture::ComponentType::FLOAT:
 | 
			
		||||
@ -453,6 +455,8 @@ bool IsPixelFormatASTC(PixelFormat format) {
 | 
			
		||||
    case PixelFormat::ASTC_2D_5X5_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_8X8_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_8X5_SRGB:
 | 
			
		||||
    case PixelFormat::ASTC_2D_10X8:
 | 
			
		||||
    case PixelFormat::ASTC_2D_10X8_SRGB:
 | 
			
		||||
        return true;
 | 
			
		||||
    default:
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
@ -74,19 +74,21 @@ enum class PixelFormat {
 | 
			
		||||
    ASTC_2D_5X4_SRGB = 56,
 | 
			
		||||
    ASTC_2D_5X5 = 57,
 | 
			
		||||
    ASTC_2D_5X5_SRGB = 58,
 | 
			
		||||
    ASTC_2D_10X8 = 59,
 | 
			
		||||
    ASTC_2D_10X8_SRGB = 60,
 | 
			
		||||
 | 
			
		||||
    MaxColorFormat,
 | 
			
		||||
 | 
			
		||||
    // Depth formats
 | 
			
		||||
    Z32F = 59,
 | 
			
		||||
    Z16 = 60,
 | 
			
		||||
    Z32F = 61,
 | 
			
		||||
    Z16 = 62,
 | 
			
		||||
 | 
			
		||||
    MaxDepthFormat,
 | 
			
		||||
 | 
			
		||||
    // DepthStencil formats
 | 
			
		||||
    Z24S8 = 61,
 | 
			
		||||
    S8Z24 = 62,
 | 
			
		||||
    Z32FS8 = 63,
 | 
			
		||||
    Z24S8 = 63,
 | 
			
		||||
    S8Z24 = 64,
 | 
			
		||||
    Z32FS8 = 65,
 | 
			
		||||
 | 
			
		||||
    MaxDepthStencilFormat,
 | 
			
		||||
 | 
			
		||||
@ -193,6 +195,8 @@ static constexpr u32 GetCompressionFactor(PixelFormat format) {
 | 
			
		||||
        4, // ASTC_2D_5X4_SRGB
 | 
			
		||||
        4, // ASTC_2D_5X5
 | 
			
		||||
        4, // ASTC_2D_5X5_SRGB
 | 
			
		||||
        4, // ASTC_2D_10X8
 | 
			
		||||
        4, // ASTC_2D_10X8_SRGB
 | 
			
		||||
        1, // Z32F
 | 
			
		||||
        1, // Z16
 | 
			
		||||
        1, // Z24S8
 | 
			
		||||
@ -208,70 +212,72 @@ static constexpr u32 GetDefaultBlockWidth(PixelFormat format) {
 | 
			
		||||
    if (format == PixelFormat::Invalid)
 | 
			
		||||
        return 0;
 | 
			
		||||
    constexpr std::array<u32, MaxPixelFormat> block_width_table = {{
 | 
			
		||||
        1, // ABGR8U
 | 
			
		||||
        1, // ABGR8S
 | 
			
		||||
        1, // ABGR8UI
 | 
			
		||||
        1, // B5G6R5U
 | 
			
		||||
        1, // A2B10G10R10U
 | 
			
		||||
        1, // A1B5G5R5U
 | 
			
		||||
        1, // R8U
 | 
			
		||||
        1, // R8UI
 | 
			
		||||
        1, // RGBA16F
 | 
			
		||||
        1, // RGBA16U
 | 
			
		||||
        1, // RGBA16UI
 | 
			
		||||
        1, // R11FG11FB10F
 | 
			
		||||
        1, // RGBA32UI
 | 
			
		||||
        4, // DXT1
 | 
			
		||||
        4, // DXT23
 | 
			
		||||
        4, // DXT45
 | 
			
		||||
        4, // DXN1
 | 
			
		||||
        4, // DXN2UNORM
 | 
			
		||||
        4, // DXN2SNORM
 | 
			
		||||
        4, // BC7U
 | 
			
		||||
        4, // BC6H_UF16
 | 
			
		||||
        4, // BC6H_SF16
 | 
			
		||||
        4, // ASTC_2D_4X4
 | 
			
		||||
        1, // G8R8U
 | 
			
		||||
        1, // G8R8S
 | 
			
		||||
        1, // BGRA8
 | 
			
		||||
        1, // RGBA32F
 | 
			
		||||
        1, // RG32F
 | 
			
		||||
        1, // R32F
 | 
			
		||||
        1, // R16F
 | 
			
		||||
        1, // R16U
 | 
			
		||||
        1, // R16S
 | 
			
		||||
        1, // R16UI
 | 
			
		||||
        1, // R16I
 | 
			
		||||
        1, // RG16
 | 
			
		||||
        1, // RG16F
 | 
			
		||||
        1, // RG16UI
 | 
			
		||||
        1, // RG16I
 | 
			
		||||
        1, // RG16S
 | 
			
		||||
        1, // RGB32F
 | 
			
		||||
        1, // RGBA8_SRGB
 | 
			
		||||
        1, // RG8U
 | 
			
		||||
        1, // RG8S
 | 
			
		||||
        1, // RG32UI
 | 
			
		||||
        1, // R32UI
 | 
			
		||||
        8, // ASTC_2D_8X8
 | 
			
		||||
        8, // ASTC_2D_8X5
 | 
			
		||||
        5, // ASTC_2D_5X4
 | 
			
		||||
        1, // BGRA8_SRGB
 | 
			
		||||
        4, // DXT1_SRGB
 | 
			
		||||
        4, // DXT23_SRGB
 | 
			
		||||
        4, // DXT45_SRGB
 | 
			
		||||
        4, // BC7U_SRGB
 | 
			
		||||
        4, // ASTC_2D_4X4_SRGB
 | 
			
		||||
        8, // ASTC_2D_8X8_SRGB
 | 
			
		||||
        8, // ASTC_2D_8X5_SRGB
 | 
			
		||||
        5, // ASTC_2D_5X4_SRGB
 | 
			
		||||
        5, // ASTC_2D_5X5
 | 
			
		||||
        5, // ASTC_2D_5X5_SRGB
 | 
			
		||||
        1, // Z32F
 | 
			
		||||
        1, // Z16
 | 
			
		||||
        1, // Z24S8
 | 
			
		||||
        1, // S8Z24
 | 
			
		||||
        1, // Z32FS8
 | 
			
		||||
        1,  // ABGR8U
 | 
			
		||||
        1,  // ABGR8S
 | 
			
		||||
        1,  // ABGR8UI
 | 
			
		||||
        1,  // B5G6R5U
 | 
			
		||||
        1,  // A2B10G10R10U
 | 
			
		||||
        1,  // A1B5G5R5U
 | 
			
		||||
        1,  // R8U
 | 
			
		||||
        1,  // R8UI
 | 
			
		||||
        1,  // RGBA16F
 | 
			
		||||
        1,  // RGBA16U
 | 
			
		||||
        1,  // RGBA16UI
 | 
			
		||||
        1,  // R11FG11FB10F
 | 
			
		||||
        1,  // RGBA32UI
 | 
			
		||||
        4,  // DXT1
 | 
			
		||||
        4,  // DXT23
 | 
			
		||||
        4,  // DXT45
 | 
			
		||||
        4,  // DXN1
 | 
			
		||||
        4,  // DXN2UNORM
 | 
			
		||||
        4,  // DXN2SNORM
 | 
			
		||||
        4,  // BC7U
 | 
			
		||||
        4,  // BC6H_UF16
 | 
			
		||||
        4,  // BC6H_SF16
 | 
			
		||||
        4,  // ASTC_2D_4X4
 | 
			
		||||
        1,  // G8R8U
 | 
			
		||||
        1,  // G8R8S
 | 
			
		||||
        1,  // BGRA8
 | 
			
		||||
        1,  // RGBA32F
 | 
			
		||||
        1,  // RG32F
 | 
			
		||||
        1,  // R32F
 | 
			
		||||
        1,  // R16F
 | 
			
		||||
        1,  // R16U
 | 
			
		||||
        1,  // R16S
 | 
			
		||||
        1,  // R16UI
 | 
			
		||||
        1,  // R16I
 | 
			
		||||
        1,  // RG16
 | 
			
		||||
        1,  // RG16F
 | 
			
		||||
        1,  // RG16UI
 | 
			
		||||
        1,  // RG16I
 | 
			
		||||
        1,  // RG16S
 | 
			
		||||
        1,  // RGB32F
 | 
			
		||||
        1,  // RGBA8_SRGB
 | 
			
		||||
        1,  // RG8U
 | 
			
		||||
        1,  // RG8S
 | 
			
		||||
        1,  // RG32UI
 | 
			
		||||
        1,  // R32UI
 | 
			
		||||
        8,  // ASTC_2D_8X8
 | 
			
		||||
        8,  // ASTC_2D_8X5
 | 
			
		||||
        5,  // ASTC_2D_5X4
 | 
			
		||||
        1,  // BGRA8_SRGB
 | 
			
		||||
        4,  // DXT1_SRGB
 | 
			
		||||
        4,  // DXT23_SRGB
 | 
			
		||||
        4,  // DXT45_SRGB
 | 
			
		||||
        4,  // BC7U_SRGB
 | 
			
		||||
        4,  // ASTC_2D_4X4_SRGB
 | 
			
		||||
        8,  // ASTC_2D_8X8_SRGB
 | 
			
		||||
        8,  // ASTC_2D_8X5_SRGB
 | 
			
		||||
        5,  // ASTC_2D_5X4_SRGB
 | 
			
		||||
        5,  // ASTC_2D_5X5
 | 
			
		||||
        5,  // ASTC_2D_5X5_SRGB
 | 
			
		||||
        10, // ASTC_2D_10X8
 | 
			
		||||
        10, // ASTC_2D_10X8_SRGB
 | 
			
		||||
        1,  // Z32F
 | 
			
		||||
        1,  // Z16
 | 
			
		||||
        1,  // Z24S8
 | 
			
		||||
        1,  // S8Z24
 | 
			
		||||
        1,  // Z32FS8
 | 
			
		||||
    }};
 | 
			
		||||
    ASSERT(static_cast<std::size_t>(format) < block_width_table.size());
 | 
			
		||||
    return block_width_table[static_cast<std::size_t>(format)];
 | 
			
		||||
@ -341,6 +347,8 @@ static constexpr u32 GetDefaultBlockHeight(PixelFormat format) {
 | 
			
		||||
        4, // ASTC_2D_5X4_SRGB
 | 
			
		||||
        5, // ASTC_2D_5X5
 | 
			
		||||
        5, // ASTC_2D_5X5_SRGB
 | 
			
		||||
        8, // ASTC_2D_10X8
 | 
			
		||||
        8, // ASTC_2D_10X8_SRGB
 | 
			
		||||
        1, // Z32F
 | 
			
		||||
        1, // Z16
 | 
			
		||||
        1, // Z24S8
 | 
			
		||||
@ -416,6 +424,8 @@ static constexpr u32 GetFormatBpp(PixelFormat format) {
 | 
			
		||||
        128, // ASTC_2D_5X4_SRGB
 | 
			
		||||
        128, // ASTC_2D_5X5
 | 
			
		||||
        128, // ASTC_2D_5X5_SRGB
 | 
			
		||||
        128, // ASTC_2D_10X8
 | 
			
		||||
        128, // ASTC_2D_10X8_SRGB
 | 
			
		||||
        32,  // Z32F
 | 
			
		||||
        16,  // Z16
 | 
			
		||||
        32,  // Z24S8
 | 
			
		||||
 | 
			
		||||
@ -202,6 +202,8 @@ u32 BytesPerPixel(TextureFormat format) {
 | 
			
		||||
    case TextureFormat::ASTC_2D_5X4:
 | 
			
		||||
    case TextureFormat::ASTC_2D_8X8:
 | 
			
		||||
    case TextureFormat::ASTC_2D_8X5:
 | 
			
		||||
    case TextureFormat::ASTC_2D_10X8:
 | 
			
		||||
    case TextureFormat::ASTC_2D_5X5:
 | 
			
		||||
    case TextureFormat::A8R8G8B8:
 | 
			
		||||
    case TextureFormat::A2B10G10R10:
 | 
			
		||||
    case TextureFormat::BF10GF11RF11:
 | 
			
		||||
@ -294,6 +296,8 @@ std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat
 | 
			
		||||
    case TextureFormat::BC6H_SF16:
 | 
			
		||||
    case TextureFormat::ASTC_2D_4X4:
 | 
			
		||||
    case TextureFormat::ASTC_2D_8X8:
 | 
			
		||||
    case TextureFormat::ASTC_2D_5X5:
 | 
			
		||||
    case TextureFormat::ASTC_2D_10X8:
 | 
			
		||||
    case TextureFormat::A8R8G8B8:
 | 
			
		||||
    case TextureFormat::A2B10G10R10:
 | 
			
		||||
    case TextureFormat::A1B5G5R5:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user