GPU: Allow using a configurable block height when unswizzling textures.
This commit is contained in:
		
							parent
							
								
									db5f2bfa7e
								
							
						
					
					
						commit
						6b63aaa5b4
					
				@ -1041,9 +1041,18 @@ Surface RasterizerCacheOpenGL::GetTextureSurface(const Tegra::Texture::FullTextu
 | 
			
		||||
    params.height = config.tic.Height();
 | 
			
		||||
    params.is_tiled = config.tic.IsTiled();
 | 
			
		||||
    params.pixel_format = SurfaceParams::PixelFormatFromTextureFormat(config.tic.format);
 | 
			
		||||
 | 
			
		||||
    if (config.tic.IsTiled()) {
 | 
			
		||||
        params.block_height = config.tic.BlockHeight();
 | 
			
		||||
    } else {
 | 
			
		||||
        // Use the texture-provided stride value if the texture isn't tiled.
 | 
			
		||||
        params.stride = params.PixelsInBytes(config.tic.Pitch());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    params.UpdateParams();
 | 
			
		||||
 | 
			
		||||
    if (config.tic.Width() % 8 != 0 || config.tic.Height() % 8 != 0) {
 | 
			
		||||
    if (config.tic.Width() % 8 != 0 || config.tic.Height() % 8 != 0 ||
 | 
			
		||||
        params.stride != params.width) {
 | 
			
		||||
        Surface src_surface;
 | 
			
		||||
        MathUtil::Rectangle<u32> rect;
 | 
			
		||||
        std::tie(src_surface, rect) = GetSurfaceSubRect(params, ScaleMatch::Ignore, true);
 | 
			
		||||
 | 
			
		||||
@ -56,23 +56,22 @@ u32 BytesPerPixel(TextureFormat format) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width, u32 height) {
 | 
			
		||||
std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width, u32 height,
 | 
			
		||||
                                 u32 block_height) {
 | 
			
		||||
    u8* data = Memory::GetPointer(address);
 | 
			
		||||
    u32 bytes_per_pixel = BytesPerPixel(format);
 | 
			
		||||
 | 
			
		||||
    static constexpr u32 DefaultBlockHeight = 16;
 | 
			
		||||
 | 
			
		||||
    std::vector<u8> unswizzled_data(width * height * bytes_per_pixel);
 | 
			
		||||
 | 
			
		||||
    switch (format) {
 | 
			
		||||
    case TextureFormat::DXT1:
 | 
			
		||||
        // In the DXT1 format, each 4x4 tile is swizzled instead of just individual pixel values.
 | 
			
		||||
        CopySwizzledData(width / 4, height / 4, bytes_per_pixel, bytes_per_pixel, data,
 | 
			
		||||
                         unswizzled_data.data(), true, DefaultBlockHeight);
 | 
			
		||||
                         unswizzled_data.data(), true, block_height);
 | 
			
		||||
        break;
 | 
			
		||||
    case TextureFormat::A8R8G8B8:
 | 
			
		||||
        CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data,
 | 
			
		||||
                         unswizzled_data.data(), true, DefaultBlockHeight);
 | 
			
		||||
                         unswizzled_data.data(), true, block_height);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        UNIMPLEMENTED_MSG("Format not implemented");
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,8 @@ namespace Texture {
 | 
			
		||||
/**
 | 
			
		||||
 * Unswizzles a swizzled texture without changing its format.
 | 
			
		||||
 */
 | 
			
		||||
std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width, u32 height);
 | 
			
		||||
std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width, u32 height,
 | 
			
		||||
                                 u32 block_height = TICEntry::DefaultBlockHeight);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Decodes an unswizzled texture into a A8R8G8B8 texture.
 | 
			
		||||
 | 
			
		||||
@ -105,6 +105,13 @@ struct TICEntry {
 | 
			
		||||
        return height_minus_1 + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    u32 BlockHeight() const {
 | 
			
		||||
        ASSERT(header_version == TICHeaderVersion::BlockLinear ||
 | 
			
		||||
               header_version == TICHeaderVersion::BlockLinearColorKey);
 | 
			
		||||
        // The block height is stored in log2 format.
 | 
			
		||||
        return 1 << block_height;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool IsTiled() const {
 | 
			
		||||
        return header_version == TICHeaderVersion::BlockLinear ||
 | 
			
		||||
               header_version == TICHeaderVersion::BlockLinearColorKey;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user