mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	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:
		
							parent
							
								
									4f0818144e
								
							
						
					
					
						commit
						dfcde52f39
					
				@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
@ -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>,
 | 
				
			||||||
 | 
				
			|||||||
@ -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));
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user