Fixed compressed image block size.

This commit is contained in:
Branimir Karadžić
2014-03-01 19:27:34 -08:00
parent 673a80363c
commit f04798d3e0
5 changed files with 78 additions and 91 deletions

View File

@@ -10,41 +10,41 @@
namespace bgfx
{
static const uint32_t s_bitsPerPixel[TextureFormat::Count] =
static const ImageBlockInfo s_imageBlockInfo[TextureFormat::Count] =
{
4, // BC1
8, // BC2
8, // BC3
4, // BC4
8, // BC5
4, // ETC1
4, // ETC2
4, // ETC2A
4, // ETC2A1
2, // PTC12
4, // PTC14
2, // PTC12A
4, // PTC14A
2, // PTC22
4, // PTC24
0, // Unknown
8, // L8
32, // BGRA8
64, // RGBA16
64, // RGBA16F
16, // R5G6B5
16, // RGBA4
16, // RGB5A1
32, // RGB10A2
0, // UnknownDepth
16, // D16
24, // D24
32, // D24S8
32, // D32
16, // D16F
24, // D24F
32, // D32F
8, // D0S8
{ 4, 4, 4, 8 }, // BC1
{ 8, 4, 4, 16 }, // BC2
{ 8, 4, 4, 16 }, // BC3
{ 4, 4, 4, 8 }, // BC4
{ 8, 4, 4, 16 }, // BC5
{ 4, 4, 4, 8 }, // ETC1
{ 4, 4, 4, 8 }, // ETC2
{ 4, 4, 4, 8 }, // ETC2A
{ 4, 4, 4, 8 }, // ETC2A1
{ 2, 8, 4, 8 }, // PTC12
{ 4, 4, 4, 8 }, // PTC14
{ 2, 8, 4, 8 }, // PTC12A
{ 4, 4, 4, 8 }, // PTC14A
{ 2, 8, 4, 8 }, // PTC22
{ 4, 4, 4, 8 }, // PTC24
{ 0, 0, 0, 0 }, // Unknown
{ 8, 1, 1, 1 }, // L8
{ 32, 1, 1, 4 }, // BGRA8
{ 64, 1, 1, 8 }, // RGBA16
{ 64, 1, 1, 8 }, // RGBA16F
{ 16, 1, 1, 2 }, // R5G6B5
{ 16, 1, 1, 2 }, // RGBA4
{ 16, 1, 1, 2 }, // RGB5A1
{ 32, 1, 1, 4 }, // RGB10A2
{ 0, 0, 0, 0 }, // UnknownDepth
{ 16, 1, 1, 2 }, // D16
{ 24, 1, 1, 3 }, // D24
{ 32, 1, 1, 4 }, // D24S8
{ 32, 1, 1, 4 }, // D32
{ 16, 1, 1, 2 }, // D16F
{ 24, 1, 1, 3 }, // D24F
{ 32, 1, 1, 4 }, // D32F
{ 8, 1, 1, 1 }, // D0S8
};
static const char* s_textureFormatName[TextureFormat::Count] =
@@ -103,9 +103,19 @@ namespace bgfx
;
}
uint32_t getBitsPerPixel(TextureFormat::Enum _format)
uint8_t getBitsPerPixel(TextureFormat::Enum _format)
{
return s_bitsPerPixel[_format];
return s_imageBlockInfo[_format].bitsPerPixel;
}
const ImageBlockInfo& getBlockInfo(TextureFormat::Enum _format)
{
return s_imageBlockInfo[_format];
}
uint8_t getBlockSize(TextureFormat::Enum _format)
{
return s_imageBlockInfo[_format].blockSize;
}
const char* getName(TextureFormat::Enum _format)
@@ -1053,8 +1063,6 @@ namespace bgfx
bx::skip(_reader, 4); // reserved
uint8_t bpp = 0;
uint8_t blockSize = 1;
TextureFormat::Enum format = TextureFormat::Unknown;
bool hasAlpha = pixelFlags & DDPF_ALPHAPIXELS;
@@ -1068,10 +1076,6 @@ namespace bgfx
}
}
bpp = getBitsPerPixel(format);
blockSize = isCompressed(format) ? 4*4 : 1;
blockSize = blockSize*bpp/8;
_imageContainer.m_data = NULL;
_imageContainer.m_size = 0;
_imageContainer.m_offset = DDS_IMAGE_DATA_OFFSET;
@@ -1079,9 +1083,7 @@ namespace bgfx
_imageContainer.m_height = height;
_imageContainer.m_depth = depth;
_imageContainer.m_format = format;
_imageContainer.m_blockSize = blockSize;
_imageContainer.m_numMips = (caps[0] & DDSCAPS_MIPMAP) ? mips : 1;
_imageContainer.m_bpp = bpp;
_imageContainer.m_hasAlpha = hasAlpha;
_imageContainer.m_cubeMap = cubeMap;
_imageContainer.m_ktx = false;
@@ -1206,8 +1208,6 @@ namespace bgfx
// skip meta garbage...
int64_t offset = bx::skip(_reader, metaDataSize);
uint8_t bpp = 0;
uint8_t blockSize = 1;
TextureFormat::Enum format = TextureFormat::Unknown;
bool hasAlpha = false;
@@ -1220,10 +1220,6 @@ namespace bgfx
}
}
bpp = getBitsPerPixel(format);
blockSize = isCompressed(format) ? 4*4 : 1;
blockSize = blockSize*bpp/8;
_imageContainer.m_data = NULL;
_imageContainer.m_size = 0;
_imageContainer.m_offset = (uint32_t)offset;
@@ -1231,9 +1227,7 @@ namespace bgfx
_imageContainer.m_height = height;
_imageContainer.m_depth = depth;
_imageContainer.m_format = format;
_imageContainer.m_blockSize = blockSize;
_imageContainer.m_numMips = numMips;
_imageContainer.m_bpp = bpp;
_imageContainer.m_hasAlpha = hasAlpha;
_imageContainer.m_cubeMap = numFaces > 1;
_imageContainer.m_ktx = true;
@@ -1330,8 +1324,6 @@ namespace bgfx
// skip meta garbage...
int64_t offset = bx::skip(_reader, metaDataSize);
uint8_t bpp = 0;
uint8_t blockSize = 1;
TextureFormat::Enum format = TextureFormat::Unknown;
bool hasAlpha = false;
@@ -1345,10 +1337,6 @@ namespace bgfx
}
}
bpp = getBitsPerPixel(format);
blockSize = isCompressed(format) ? 4*4 : 1;
blockSize = blockSize*bpp/8;
_imageContainer.m_data = NULL;
_imageContainer.m_size = 0;
_imageContainer.m_offset = (uint32_t)offset;
@@ -1356,9 +1344,7 @@ namespace bgfx
_imageContainer.m_height = height;
_imageContainer.m_depth = depth;
_imageContainer.m_format = format;
_imageContainer.m_blockSize = blockSize;
_imageContainer.m_numMips = numMips;
_imageContainer.m_bpp = bpp;
_imageContainer.m_hasAlpha = hasAlpha;
_imageContainer.m_cubeMap = numFaces > 1;
_imageContainer.m_ktx = false;
@@ -1388,10 +1374,6 @@ namespace bgfx
TextureCreate tc;
bx::read(_reader, tc);
uint32_t bpp = getBitsPerPixel(TextureFormat::Enum(tc.m_format) );
uint32_t blockSize = isCompressed(TextureFormat::Enum(tc.m_format) ) ? 4*4 : 1;
blockSize = blockSize*bpp/8;
_imageContainer.m_format = tc.m_format;
_imageContainer.m_offset = UINT32_MAX;
if (NULL == tc.m_mem)
@@ -1407,9 +1389,7 @@ namespace bgfx
_imageContainer.m_width = tc.m_width;
_imageContainer.m_height = tc.m_height;
_imageContainer.m_depth = tc.m_depth;
_imageContainer.m_blockSize = blockSize;
_imageContainer.m_numMips = tc.m_numMips;
_imageContainer.m_bpp = getBitsPerPixel(TextureFormat::Enum(tc.m_format) );
_imageContainer.m_hasAlpha = false;
_imageContainer.m_cubeMap = tc.m_cubeMap;
_imageContainer.m_ktx = false;
@@ -1604,12 +1584,16 @@ namespace bgfx
bool imageGetRawData(const ImageContainer& _imageContainer, uint8_t _side, uint8_t _lod, const void* _data, uint32_t _size, ImageMip& _mip)
{
const uint32_t blockSize = _imageContainer.m_blockSize;
uint32_t offset = _imageContainer.m_offset;
const uint8_t bpp = _imageContainer.m_bpp;
TextureFormat::Enum type = TextureFormat::Enum(_imageContainer.m_format);
bool hasAlpha = _imageContainer.m_hasAlpha;
const ImageBlockInfo& blockInfo = s_imageBlockInfo[type];
const uint8_t bpp = blockInfo.bitsPerPixel;
const uint32_t blockSize = blockInfo.blockSize;
const uint32_t blockWidth = blockInfo.blockWidth;
const uint32_t blockHeight = blockInfo.blockHeight;
if (UINT32_MAX == _imageContainer.m_offset)
{
if (NULL == _imageContainer.m_data)
@@ -1633,20 +1617,11 @@ namespace bgfx
// skip imageSize in KTX format.
offset += _imageContainer.m_ktx ? sizeof(uint32_t) : 0;
width = bx::uint32_max(1, width);
height = bx::uint32_max(1, height);
width = bx::uint32_max(blockWidth, width);
height = bx::uint32_max(blockHeight, height);
depth = bx::uint32_max(1, depth);
uint32_t size = width*height*depth*blockSize;
if (isCompressed(type) )
{
width = bx::uint32_max(1, (width + 3)>>2);
height = bx::uint32_max(1, (height + 3)>>2);
size = width*height*depth*blockSize;
width <<= 2;
height <<= 2;
}
uint32_t size = width*height*depth*bpp/8;
if (side == _side
&& lod == _lod)