From b622e894d62677684291cba29fddeb2cc94b3c31 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Wed, 23 Oct 2019 23:47:17 +0300 Subject: [PATCH] [D3D12] Replicate the last texture component into non-existent ones --- src/xenia/gpu/d3d12/texture_cache.cc | 50 +++++++++++++++------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/xenia/gpu/d3d12/texture_cache.cc b/src/xenia/gpu/d3d12/texture_cache.cc index 99f40e26f..347ebe2d8 100644 --- a/src/xenia/gpu/d3d12/texture_cache.cc +++ b/src/xenia/gpu/d3d12/texture_cache.cc @@ -97,10 +97,14 @@ constexpr uint32_t TextureCache::kScaledResolveBufferSize; constexpr uint32_t TextureCache::kScaledResolveHeapSizeLog2; constexpr uint32_t TextureCache::kScaledResolveHeapSize; -// Assuming all single-component textures have its only component replicated. -// For DXT3A and DXT5A, this is according to: +// For formats with less than 4 components, assuming the last component is +// replicated into the non-existent ones, similar to what is done for unused +// components of operands in shaders. +// For DXT3A and DXT5A, RRRR swizzle is specified in: // http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf // Halo 3 also expects replicated components in k_8 sprites. +// DXN is read as RG in Halo 3, but as RA in Call of Duty. +// TODO(Triang3l): Find out the correct contents of unused texture components. const TextureCache::HostFormat TextureCache::host_formats_[64] = { // k_1_REVERSE {DXGI_FORMAT_UNKNOWN, @@ -158,7 +162,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_B5G6R5_UNORM, ResolveTileMode::k16bpp, - {0, 1, 2, 3}}, + {0, 1, 2, 2}}, // k_6_5_5 // On the host, green bits in blue, blue bits in green. {DXGI_FORMAT_B5G6R5_UNORM, @@ -170,7 +174,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_B5G6R5_UNORM, ResolveTileMode::k16bpp, - {0, 2, 1, 3}}, + {0, 2, 1, 1}}, // k_8_8_8_8 {DXGI_FORMAT_R8G8B8A8_TYPELESS, DXGI_FORMAT_R8G8B8A8_UNORM, @@ -225,7 +229,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R8G8_UNORM, ResolveTileMode::k16bpp, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_Cr_Y1_Cb_Y0_REP // Red and blue probably must be swapped, similar to k_Y1_Cr_Y0_Cb_REP. {DXGI_FORMAT_G8R8_G8B8_UNORM, @@ -265,7 +269,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_8_8_8_8_A {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, @@ -299,7 +303,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R16G16B16A16_UNORM, ResolveTileMode::kR11G11B10AsRGBA16, - {0, 1, 2, 3}}, + {0, 1, 2, 2}}, // k_11_11_10 {DXGI_FORMAT_R16G16B16A16_TYPELESS, DXGI_FORMAT_R16G16B16A16_UNORM, @@ -310,7 +314,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R16G16B16A16_UNORM, ResolveTileMode::kR10G11B11AsRGBA16, - {0, 1, 2, 3}}, + {0, 1, 2, 2}}, // k_DXT1 {DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, @@ -403,7 +407,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R16G16_UNORM, ResolveTileMode::k32bpp, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_16_16_16_16 // The resolve format being unorm is correct (with snorm distortion effects // in Halo 3 cause stretching of one corner of the screen). @@ -438,7 +442,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R16G16_FLOAT, ResolveTileMode::k32bpp, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_16_16_16_16_EXPAND {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, @@ -471,7 +475,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R16G16_FLOAT, ResolveTileMode::k32bpp, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_16_16_16_16_FLOAT {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, @@ -504,7 +508,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_32_32_32_32 {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, @@ -537,7 +541,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R32G32_FLOAT, ResolveTileMode::k64bpp, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_32_32_32_32_FLOAT {DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, @@ -570,7 +574,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_16_MPEG {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, @@ -592,7 +596,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_8_INTERLACED {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, @@ -625,7 +629,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_16_INTERLACED {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, @@ -658,10 +662,8 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_DXN - // Appears to be luminance-alpha, like ATI 3Dc and LATC in OpenGL. Call of - // Duty 4 reads this with XW swizzle in the shader. {DXGI_FORMAT_BC5_UNORM, DXGI_FORMAT_BC5_UNORM, LoadMode::k128bpb, @@ -671,7 +673,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kDXNToRG8, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 0, 0, 1}}, + {0, 1, 1, 1}}, // k_8_8_8_8_AS_16_16_16_16 {DXGI_FORMAT_R8G8B8A8_TYPELESS, DXGI_FORMAT_R8G8B8A8_UNORM, @@ -737,7 +739,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R16G16B16A16_UNORM, ResolveTileMode::kR11G11B10AsRGBA16, - {0, 1, 2, 3}}, + {0, 1, 2, 2}}, // k_11_11_10_AS_16_16_16_16 {DXGI_FORMAT_R16G16B16A16_TYPELESS, DXGI_FORMAT_R16G16B16A16_UNORM, @@ -748,7 +750,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_R16G16B16A16_UNORM, ResolveTileMode::kR10G11B11AsRGBA16, - {0, 1, 2, 3}}, + {0, 1, 2, 2}}, // k_32_32_32_FLOAT {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, @@ -759,7 +761,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 2, 2}}, // k_DXT3A // R8_UNORM has the same size as BC2, but doesn't have the 4x4 size // alignment requirement. @@ -794,7 +796,7 @@ const TextureCache::HostFormat TextureCache::host_formats_[64] = { LoadMode::kUnknown, DXGI_FORMAT_UNKNOWN, ResolveTileMode::kUnknown, - {0, 1, 2, 3}}, + {0, 1, 1, 1}}, // k_DXT3A_AS_1_1_1_1 {DXGI_FORMAT_B4G4R4A4_UNORM, DXGI_FORMAT_B4G4R4A4_UNORM,