mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	GPU: Implemented the Z32_S8_X24 depth buffer format.
This commit is contained in:
		
							parent
							
								
									340771ccd7
								
							
						
					
					
						commit
						daf2504d31
					
				@ -33,6 +33,7 @@ enum class DepthFormat : u32 {
 | 
				
			|||||||
    Z24_X8_UNORM = 0x15,
 | 
					    Z24_X8_UNORM = 0x15,
 | 
				
			||||||
    Z24_S8_UNORM = 0x16,
 | 
					    Z24_S8_UNORM = 0x16,
 | 
				
			||||||
    Z24_C8_UNORM = 0x18,
 | 
					    Z24_C8_UNORM = 0x18,
 | 
				
			||||||
 | 
					    Z32_S8_X24_FLOAT = 0x19,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Returns the number of bytes per pixel of each rendertarget format.
 | 
					/// Returns the number of bytes per pixel of each rendertarget format.
 | 
				
			||||||
 | 
				
			|||||||
@ -122,6 +122,8 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form
 | 
				
			|||||||
    {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, ComponentType::Float, false}, // Z32F
 | 
					    {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, ComponentType::Float, false}, // Z32F
 | 
				
			||||||
    {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, ComponentType::UNorm,
 | 
					    {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, ComponentType::UNorm,
 | 
				
			||||||
     false}, // Z16
 | 
					     false}, // Z16
 | 
				
			||||||
 | 
					    {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV,
 | 
				
			||||||
 | 
					     ComponentType::Float, false}, // Z32FS8
 | 
				
			||||||
}};
 | 
					}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType component_type) {
 | 
					static const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType component_type) {
 | 
				
			||||||
@ -209,7 +211,7 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),
 | 
				
			|||||||
        MortonCopy<true, PixelFormat::R32F>,         MortonCopy<true, PixelFormat::R16F>,
 | 
					        MortonCopy<true, PixelFormat::R32F>,         MortonCopy<true, PixelFormat::R16F>,
 | 
				
			||||||
        MortonCopy<true, PixelFormat::R16UNORM>,     MortonCopy<true, PixelFormat::Z24S8>,
 | 
					        MortonCopy<true, PixelFormat::R16UNORM>,     MortonCopy<true, PixelFormat::Z24S8>,
 | 
				
			||||||
        MortonCopy<true, PixelFormat::S8Z24>,        MortonCopy<true, PixelFormat::Z32F>,
 | 
					        MortonCopy<true, PixelFormat::S8Z24>,        MortonCopy<true, PixelFormat::Z32F>,
 | 
				
			||||||
        MortonCopy<true, PixelFormat::Z16>,
 | 
					        MortonCopy<true, PixelFormat::Z16>,          MortonCopy<true, PixelFormat::Z32FS8>,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),
 | 
					static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),
 | 
				
			||||||
@ -241,6 +243,7 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),
 | 
				
			|||||||
        MortonCopy<false, PixelFormat::S8Z24>,
 | 
					        MortonCopy<false, PixelFormat::S8Z24>,
 | 
				
			||||||
        MortonCopy<false, PixelFormat::Z32F>,
 | 
					        MortonCopy<false, PixelFormat::Z32F>,
 | 
				
			||||||
        MortonCopy<false, PixelFormat::Z16>,
 | 
					        MortonCopy<false, PixelFormat::Z16>,
 | 
				
			||||||
 | 
					        MortonCopy<false, PixelFormat::Z32FS8>,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allocate an uninitialized texture of appropriate size and format for the surface
 | 
					// Allocate an uninitialized texture of appropriate size and format for the surface
 | 
				
			||||||
 | 
				
			|||||||
@ -51,6 +51,7 @@ struct SurfaceParams {
 | 
				
			|||||||
        S8Z24 = 22,
 | 
					        S8Z24 = 22,
 | 
				
			||||||
        Z32F = 23,
 | 
					        Z32F = 23,
 | 
				
			||||||
        Z16 = 24,
 | 
					        Z16 = 24,
 | 
				
			||||||
 | 
					        Z32FS8 = 25,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        MaxDepthStencilFormat,
 | 
					        MaxDepthStencilFormat,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -113,6 +114,7 @@ struct SurfaceParams {
 | 
				
			|||||||
            1, // S8Z24
 | 
					            1, // S8Z24
 | 
				
			||||||
            1, // Z32F
 | 
					            1, // Z32F
 | 
				
			||||||
            1, // Z16
 | 
					            1, // Z16
 | 
				
			||||||
 | 
					            1, // Z32FS8
 | 
				
			||||||
        }};
 | 
					        }};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ASSERT(static_cast<size_t>(format) < compression_factor_table.size());
 | 
					        ASSERT(static_cast<size_t>(format) < compression_factor_table.size());
 | 
				
			||||||
@ -149,6 +151,7 @@ struct SurfaceParams {
 | 
				
			|||||||
            32,  // S8Z24
 | 
					            32,  // S8Z24
 | 
				
			||||||
            32,  // Z32F
 | 
					            32,  // Z32F
 | 
				
			||||||
            16,  // Z16
 | 
					            16,  // Z16
 | 
				
			||||||
 | 
					            64,  // Z32FS8
 | 
				
			||||||
        }};
 | 
					        }};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ASSERT(static_cast<size_t>(format) < bpp_table.size());
 | 
					        ASSERT(static_cast<size_t>(format) < bpp_table.size());
 | 
				
			||||||
@ -169,6 +172,8 @@ struct SurfaceParams {
 | 
				
			|||||||
            return PixelFormat::Z32F;
 | 
					            return PixelFormat::Z32F;
 | 
				
			||||||
        case Tegra::DepthFormat::Z16_UNORM:
 | 
					        case Tegra::DepthFormat::Z16_UNORM:
 | 
				
			||||||
            return PixelFormat::Z16;
 | 
					            return PixelFormat::Z16;
 | 
				
			||||||
 | 
					        case Tegra::DepthFormat::Z32_S8_X24_FLOAT:
 | 
				
			||||||
 | 
					            return PixelFormat::Z32FS8;
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
 | 
					            LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
 | 
				
			||||||
            UNREACHABLE();
 | 
					            UNREACHABLE();
 | 
				
			||||||
@ -325,6 +330,8 @@ struct SurfaceParams {
 | 
				
			|||||||
            return Tegra::DepthFormat::Z32_FLOAT;
 | 
					            return Tegra::DepthFormat::Z32_FLOAT;
 | 
				
			||||||
        case PixelFormat::Z16:
 | 
					        case PixelFormat::Z16:
 | 
				
			||||||
            return Tegra::DepthFormat::Z16_UNORM;
 | 
					            return Tegra::DepthFormat::Z16_UNORM;
 | 
				
			||||||
 | 
					        case PixelFormat::Z32FS8:
 | 
				
			||||||
 | 
					            return Tegra::DepthFormat::Z32_S8_X24_FLOAT;
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
 | 
					            LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
 | 
				
			||||||
            UNREACHABLE();
 | 
					            UNREACHABLE();
 | 
				
			||||||
@ -382,6 +389,7 @@ struct SurfaceParams {
 | 
				
			|||||||
        case Tegra::DepthFormat::Z24_S8_UNORM:
 | 
					        case Tegra::DepthFormat::Z24_S8_UNORM:
 | 
				
			||||||
            return ComponentType::UNorm;
 | 
					            return ComponentType::UNorm;
 | 
				
			||||||
        case Tegra::DepthFormat::Z32_FLOAT:
 | 
					        case Tegra::DepthFormat::Z32_FLOAT:
 | 
				
			||||||
 | 
					        case Tegra::DepthFormat::Z32_S8_X24_FLOAT:
 | 
				
			||||||
            return ComponentType::Float;
 | 
					            return ComponentType::Float;
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
 | 
					            LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
 | 
				
			||||||
 | 
				
			|||||||
@ -90,6 +90,8 @@ static u32 DepthBytesPerPixel(DepthFormat format) {
 | 
				
			|||||||
    case DepthFormat::Z24_S8_UNORM:
 | 
					    case DepthFormat::Z24_S8_UNORM:
 | 
				
			||||||
    case DepthFormat::Z32_FLOAT:
 | 
					    case DepthFormat::Z32_FLOAT:
 | 
				
			||||||
        return 4;
 | 
					        return 4;
 | 
				
			||||||
 | 
					    case DepthFormat::Z32_S8_X24_FLOAT:
 | 
				
			||||||
 | 
					        return 8;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        UNIMPLEMENTED_MSG("Format not implemented");
 | 
					        UNIMPLEMENTED_MSG("Format not implemented");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
@ -150,6 +152,7 @@ std::vector<u8> UnswizzleDepthTexture(VAddr address, DepthFormat format, u32 wid
 | 
				
			|||||||
    case DepthFormat::S8_Z24_UNORM:
 | 
					    case DepthFormat::S8_Z24_UNORM:
 | 
				
			||||||
    case DepthFormat::Z24_S8_UNORM:
 | 
					    case DepthFormat::Z24_S8_UNORM:
 | 
				
			||||||
    case DepthFormat::Z32_FLOAT:
 | 
					    case DepthFormat::Z32_FLOAT:
 | 
				
			||||||
 | 
					    case DepthFormat::Z32_S8_X24_FLOAT:
 | 
				
			||||||
        CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data,
 | 
					        CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data,
 | 
				
			||||||
                         unswizzled_data.data(), true, block_height);
 | 
					                         unswizzled_data.data(), true, block_height);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user