|
|
|
@ -86,88 +86,11 @@ u32 BytesPerPixel(TextureFormat format) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static u32 DepthBytesPerPixel(DepthFormat format) {
|
|
|
|
|
switch (format) {
|
|
|
|
|
case DepthFormat::Z16_UNORM:
|
|
|
|
|
return 2;
|
|
|
|
|
case DepthFormat::S8_Z24_UNORM:
|
|
|
|
|
case DepthFormat::Z24_S8_UNORM:
|
|
|
|
|
case DepthFormat::Z32_FLOAT:
|
|
|
|
|
return 4;
|
|
|
|
|
case DepthFormat::Z32_S8_X24_FLOAT:
|
|
|
|
|
return 8;
|
|
|
|
|
default:
|
|
|
|
|
UNIMPLEMENTED_MSG("Format not implemented");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
std::vector<u8> UnswizzleTexture(VAddr address, u32 tile_size, u32 bytes_per_pixel, u32 width,
|
|
|
|
|
u32 height, u32 block_height) {
|
|
|
|
|
std::vector<u8> unswizzled_data(width * height * bytes_per_pixel);
|
|
|
|
|
|
|
|
|
|
switch (format) {
|
|
|
|
|
case TextureFormat::DXT1:
|
|
|
|
|
case TextureFormat::DXT23:
|
|
|
|
|
case TextureFormat::DXT45:
|
|
|
|
|
case TextureFormat::DXN1:
|
|
|
|
|
case TextureFormat::DXN2:
|
|
|
|
|
case TextureFormat::BC7U:
|
|
|
|
|
// In the DXT and DXN formats, 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, block_height);
|
|
|
|
|
break;
|
|
|
|
|
case TextureFormat::A8R8G8B8:
|
|
|
|
|
case TextureFormat::A2B10G10R10:
|
|
|
|
|
case TextureFormat::A1B5G5R5:
|
|
|
|
|
case TextureFormat::B5G6R5:
|
|
|
|
|
case TextureFormat::R8:
|
|
|
|
|
case TextureFormat::G8R8:
|
|
|
|
|
case TextureFormat::R16_G16_B16_A16:
|
|
|
|
|
case TextureFormat::R32_G32_B32_A32:
|
|
|
|
|
case TextureFormat::R32_G32:
|
|
|
|
|
case TextureFormat::R32:
|
|
|
|
|
case TextureFormat::R16:
|
|
|
|
|
case TextureFormat::R16_G16:
|
|
|
|
|
case TextureFormat::BF10GF11RF11:
|
|
|
|
|
case TextureFormat::ASTC_2D_4X4:
|
|
|
|
|
case TextureFormat::R32_G32_B32:
|
|
|
|
|
CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data,
|
|
|
|
|
unswizzled_data.data(), true, block_height);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
UNIMPLEMENTED_MSG("Format not implemented");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return unswizzled_data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<u8> UnswizzleDepthTexture(VAddr address, DepthFormat format, u32 width, u32 height,
|
|
|
|
|
u32 block_height) {
|
|
|
|
|
u8* data = Memory::GetPointer(address);
|
|
|
|
|
u32 bytes_per_pixel = DepthBytesPerPixel(format);
|
|
|
|
|
|
|
|
|
|
std::vector<u8> unswizzled_data(width * height * bytes_per_pixel);
|
|
|
|
|
|
|
|
|
|
switch (format) {
|
|
|
|
|
case DepthFormat::Z16_UNORM:
|
|
|
|
|
case DepthFormat::S8_Z24_UNORM:
|
|
|
|
|
case DepthFormat::Z24_S8_UNORM:
|
|
|
|
|
case DepthFormat::Z32_FLOAT:
|
|
|
|
|
case DepthFormat::Z32_S8_X24_FLOAT:
|
|
|
|
|
CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data,
|
|
|
|
|
unswizzled_data.data(), true, block_height);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
UNIMPLEMENTED_MSG("Format not implemented");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CopySwizzledData(width / tile_size, height / tile_size, bytes_per_pixel, bytes_per_pixel,
|
|
|
|
|
Memory::GetPointer(address), unswizzled_data.data(), true, block_height);
|
|
|
|
|
return unswizzled_data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|