From 1ee5352d3eccd9886de99dad1ac57d98bc913545 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 09:35:53 -0700 Subject: [PATCH] TexCache: Correct DXT5 alpha calculation. This matches PSP alpha values from an exhaustive test. --- GPU/Common/TextureDecoder.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/GPU/Common/TextureDecoder.cpp b/GPU/Common/TextureDecoder.cpp index 750fc3f9b7..72da3fd761 100644 --- a/GPU/Common/TextureDecoder.cpp +++ b/GPU/Common/TextureDecoder.cpp @@ -375,20 +375,19 @@ void DXTDecoder::DecodeColors(const DXT1Block *src, bool ignore1bitAlpha) { } static inline u8 lerp8(const DXT5Block *src, int n) { - // These weights translate alpha1/alpha2 to fixed 8.8 point, pre-divided by 7. - int weight1 = ((7 - n) << 8) / 7; - int weight2 = (n << 8) / 7; - return (u8)((src->alpha1 * weight1 + src->alpha2 * weight2 + 255) >> 8); + // These weights multiple alpha1/alpha2 to fixed 8.8 point. + int alpha1 = (src->alpha1 * ((7 - n) << 8)) / 7; + int alpha2 = (src->alpha2 * (n << 8)) / 7; + return (u8)((alpha1 + alpha2 + 31) >> 8); } static inline u8 lerp6(const DXT5Block *src, int n) { - int weight1 = ((5 - n) << 8) / 5; - int weight2 = (n << 8) / 5; - return (u8)((src->alpha1 * weight1 + src->alpha2 * weight2 + 255) >> 8); + int alpha1 = (src->alpha1 * ((5 - n) << 8)) / 5; + int alpha2 = (src->alpha2 * (n << 8)) / 5; + return (u8)((alpha1 + alpha2 + 31) >> 8); } void DXTDecoder::DecodeAlphaDXT5(const DXT5Block *src) { - // TODO: Check if alpha is still not 100% correct. alpha_[0] = src->alpha1; alpha_[1] = src->alpha2; if (alpha_[0] > alpha_[1]) { @@ -460,7 +459,6 @@ void DecodeDXT3Block(u32 *dst, const DXT3Block *src, int pitch, int height) { dxt.WriteColorsDXT3(dst, src, pitch, height); } -// The alpha channel is not 100% correct void DecodeDXT5Block(u32 *dst, const DXT5Block *src, int pitch, int height) { DXTDecoder dxt; dxt.DecodeColors(&src->color, true);