[D3D12] DXT5A swizzle
This commit is contained in:
parent
ed7f4ec4be
commit
e572f65d11
|
@ -542,18 +542,22 @@ void TextureCache::TextureKeyFromFetchConstant(
|
||||||
key_out.endianness = Endian(fetch.endianness);
|
key_out.endianness = Endian(fetch.endianness);
|
||||||
|
|
||||||
uint32_t swizzle = fetch.swizzle;
|
uint32_t swizzle = fetch.swizzle;
|
||||||
|
const uint32_t swizzle_constant_mask = 4 | (4 << 3) | (4 << 6) | (4 << 9);
|
||||||
|
uint32_t swizzle_constant = swizzle & swizzle_constant_mask;
|
||||||
|
uint32_t swizzle_not_constant = swizzle_constant ^ swizzle_constant_mask;
|
||||||
// Get rid of 6 and 7 values (to prevent device losses if the game has
|
// Get rid of 6 and 7 values (to prevent device losses if the game has
|
||||||
// something broken) the quick and dirty way - by changing them to 4 and 5.
|
// something broken) the quick and dirty way - by changing them to 4 and 5.
|
||||||
swizzle &= ~((swizzle & (4 | (4 << 3) | (4 << 6) | (4 << 9))) >> 1);
|
swizzle &= ~(swizzle_constant >> 1);
|
||||||
// Remap the swizzle according to the texture format.
|
// Remap the swizzle according to the texture format.
|
||||||
if (format == TextureFormat::k_DXT3A) {
|
if (format == TextureFormat::k_DXT3A) {
|
||||||
// DXT3A is emulated as DXT3 with zero color, but the alpha should be
|
// DXT3A is emulated as DXT3 with zero color, but the alpha should be
|
||||||
// replicated into all channels.
|
// replicated into all channels.
|
||||||
// http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
// http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
||||||
// If not 0.0 or 1.0 (if the high bit isn't set), make 3 (alpha).
|
// If not 0.0 or 1.0 (if the high bit isn't set), make 3 (alpha).
|
||||||
uint32_t swizzle_not_constant =
|
|
||||||
~swizzle & (4 | (4 << 3) | (4 << 6) | (4 << 9));
|
|
||||||
swizzle |= (swizzle_not_constant >> 1) | (swizzle_not_constant >> 2);
|
swizzle |= (swizzle_not_constant >> 1) | (swizzle_not_constant >> 2);
|
||||||
|
} else if (format == TextureFormat::k_DXT5A) {
|
||||||
|
// DXT5A is emulated as BC4, but DXT5 alpha (BC4 red) should be replicated.
|
||||||
|
swizzle &= ~((swizzle_not_constant >> 1) | (swizzle_not_constant >> 2));
|
||||||
}
|
}
|
||||||
swizzle_out = swizzle;
|
swizzle_out = swizzle;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue