|
|
|
@ -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> 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> 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 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; |
|
|
|
} |
|
|
|
|
|
|
|
|