mirror of
https://github.com/libretro/ppsspp.git
synced 2024-11-26 18:00:41 +00:00
Implement DXT3 alpha.
This commit is contained in:
parent
c937a22f26
commit
4b91c7e707
@ -619,7 +619,16 @@ static void decodeDXT1Block(u32 *dst, const DXT1Block *src, int pitch, bool igno
|
|||||||
static void decodeDXT3Block(u32 *dst, const DXT3Block *src, int pitch)
|
static void decodeDXT3Block(u32 *dst, const DXT3Block *src, int pitch)
|
||||||
{
|
{
|
||||||
decodeDXT1Block(dst, &src->color, pitch, true);
|
decodeDXT1Block(dst, &src->color, pitch, true);
|
||||||
// Alpha: TODO
|
|
||||||
|
for (int y = 0; y < 4; y++) {
|
||||||
|
u32 line = src->alphaLines[y];
|
||||||
|
for (int x = 0; x < 4; x++) {
|
||||||
|
const u8 a4 = line & 0xF;
|
||||||
|
dst[x] = (dst[x] & 0xFFFFFF) | (a4 << 24) | (a4 << 28);
|
||||||
|
line >>= 4;
|
||||||
|
}
|
||||||
|
dst += pitch;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u8 lerp8(const DXT5Block *src, int n) {
|
static inline u8 lerp8(const DXT5Block *src, int n) {
|
||||||
@ -1229,18 +1238,12 @@ void *TextureCache::DecodeTextureLevel(u8 format, u8 clutformat, int level, u32
|
|||||||
case GE_TFMT_DXT3:
|
case GE_TFMT_DXT3:
|
||||||
dstFmt = GL_UNSIGNED_BYTE;
|
dstFmt = GL_UNSIGNED_BYTE;
|
||||||
{
|
{
|
||||||
static bool dxt3Reported = false;
|
|
||||||
if (!dxt3Reported)
|
|
||||||
ERROR_LOG_REPORT(G3D, "Warning: DXT3 textures not well supported");
|
|
||||||
dxt3Reported = true;
|
|
||||||
|
|
||||||
int minw = std::min(bufw, w);
|
int minw = std::min(bufw, w);
|
||||||
tmpTexBuf32.resize(std::max(bufw, w) * h);
|
tmpTexBuf32.resize(std::max(bufw, w) * h);
|
||||||
tmpTexBufRearrange.resize(std::max(bufw, w) * h);
|
tmpTexBufRearrange.resize(std::max(bufw, w) * h);
|
||||||
u32 *dst = tmpTexBuf32.data();
|
u32 *dst = tmpTexBuf32.data();
|
||||||
DXT3Block *src = (DXT3Block*)texptr;
|
DXT3Block *src = (DXT3Block*)texptr;
|
||||||
|
|
||||||
// Alpha is off
|
|
||||||
for (int y = 0; y < h; y += 4) {
|
for (int y = 0; y < h; y += 4) {
|
||||||
u32 blockIndex = (y / 4) * (bufw / 4);
|
u32 blockIndex = (y / 4) * (bufw / 4);
|
||||||
for (int x = 0; x < minw; x += 4) {
|
for (int x = 0; x < minw; x += 4) {
|
||||||
|
Loading…
Reference in New Issue
Block a user