Fixed ETC1 block decoding.

This commit is contained in:
bkaradzic 2013-09-11 21:12:20 -07:00
parent f84081b0ad
commit 666b431b40

View file

@ -454,21 +454,13 @@ namespace bgfx
{ 47, 183, -47, -183}, { 47, 183, -47, -183},
}; };
int8_t uint8_add2c(int32_t _a, int32_t _b) uint8_t uint8_satadd(int32_t _a, int32_t _b)
{
return _b & 0x4
? _a - ( (~_b + 1) & 0x7)
: _a + _b
;
}
int8_t uint8_satadd(int32_t _a, int32_t _b)
{ {
using namespace bx; using namespace bx;
const int32_t add = _a + _b; const int32_t add = _a + _b;
const uint32_t min = uint32_min(add, 255); const uint32_t min = uint32_imin(add, 255);
const uint32_t result = uint32_max(min, 0); const uint32_t result = uint32_imax(min, 0);
return result; return (uint8_t)result;
} }
void decodeBlockEtc1(uint8_t _dst[16*4], const uint8_t _src[8]) void decodeBlockEtc1(uint8_t _dst[16*4], const uint8_t _src[8])
@ -484,14 +476,14 @@ namespace bgfx
rgb[1] = _src[1] >> 3; rgb[1] = _src[1] >> 3;
rgb[2] = _src[2] >> 3; rgb[2] = _src[2] >> 3;
uint8_t diff[3]; int8_t diff[3];
diff[0] = _src[0] & 0x07; diff[0] = int8_t( (_src[0] & 0x07)<<5)>>5;
diff[1] = _src[1] & 0x07; diff[1] = int8_t( (_src[1] & 0x07)<<5)>>5;
diff[2] = _src[2] & 0x07; diff[2] = int8_t( (_src[2] & 0x07)<<5)>>5;
rgb[4] = uint8_add2c(rgb[0], diff[0]); rgb[4] = rgb[0] + diff[0];
rgb[5] = uint8_add2c(rgb[1], diff[1]); rgb[5] = rgb[1] + diff[1];
rgb[6] = uint8_add2c(rgb[2], diff[2]); rgb[6] = rgb[2] + diff[2];
rgb[0] = bitRangeConvert(rgb[0], 5, 8); rgb[0] = bitRangeConvert(rgb[0], 5, 8);
rgb[1] = bitRangeConvert(rgb[1], 5, 8); rgb[1] = bitRangeConvert(rgb[1], 5, 8);
@ -522,12 +514,8 @@ namespace bgfx
table[0] = (_src[3] >> 5) & 0x7; table[0] = (_src[3] >> 5) & 0x7;
table[1] = (_src[3] >> 2) & 0x7; table[1] = (_src[3] >> 2) & 0x7;
uint32_t indexBits = 0 uint32_t indexMsb = (_src[4]<<8) | _src[5];
| (_src[4]<<24) uint32_t indexLsb = (_src[6]<<8) | _src[7];
| (_src[5]<<16)
| (_src[6]<< 8)
| (_src[7] )
;
if (flipBit) if (flipBit)
{ {
@ -536,13 +524,16 @@ namespace bgfx
const uint32_t block = (ii>>1)&1; const uint32_t block = (ii>>1)&1;
const uint32_t color = block<<2; const uint32_t color = block<<2;
const uint32_t idx = (ii&0xc) | ( (ii & 0x3)<<4); const uint32_t idx = (ii&0xc) | ( (ii & 0x3)<<4);
const uint32_t lsbi = (indexBits >> ii) & 1; const uint32_t lsbi = indexLsb & 1;
const uint32_t msbi = (indexBits >> (16 + ii) ) & 1; const uint32_t msbi = indexMsb & 1;
const int32_t mod = s_mod[table[block] ][lsbi + msbi*2]; const int32_t mod = s_mod[table[block] ][lsbi + msbi*2];
_dst[idx + 0] = uint8_satadd(rgb[color+2], mod); _dst[idx + 0] = uint8_satadd(rgb[color+2], mod);
_dst[idx + 1] = uint8_satadd(rgb[color+1], mod); _dst[idx + 1] = uint8_satadd(rgb[color+1], mod);
_dst[idx + 2] = uint8_satadd(rgb[color+0], mod); _dst[idx + 2] = uint8_satadd(rgb[color+0], mod);
indexLsb >>= 1;
indexMsb >>= 1;
} }
} }
else else
@ -552,13 +543,16 @@ namespace bgfx
const uint32_t block = ii>>3; const uint32_t block = ii>>3;
const uint32_t color = block<<2; const uint32_t color = block<<2;
const uint32_t idx = (ii&0xc) | ( (ii & 0x3)<<4); const uint32_t idx = (ii&0xc) | ( (ii & 0x3)<<4);
const uint32_t lsbi = (indexBits >> ii) & 1; const uint32_t lsbi = indexLsb & 1;
const uint32_t msbi = (indexBits >> (16 + ii) ) & 1; const uint32_t msbi = indexMsb & 1;
const int32_t mod = s_mod[table[block] ][lsbi + msbi*2]; const int32_t mod = s_mod[table[block] ][lsbi + msbi*2];
_dst[idx + 0] = uint8_satadd(rgb[color+2], mod); _dst[idx + 0] = uint8_satadd(rgb[color+2], mod);
_dst[idx + 1] = uint8_satadd(rgb[color+1], mod); _dst[idx + 1] = uint8_satadd(rgb[color+1], mod);
_dst[idx + 2] = uint8_satadd(rgb[color+0], mod); _dst[idx + 2] = uint8_satadd(rgb[color+0], mod);
indexLsb >>= 1;
indexMsb >>= 1;
} }
} }
} }