Fixed texture size calculation.

This commit is contained in:
Branimir Karadžić 2015-02-02 20:30:57 -08:00
parent c9bc550758
commit 8942628ec1

View file

@ -2311,22 +2311,24 @@ again:
void calcTextureSize(TextureInfo& _info, uint16_t _width, uint16_t _height, uint16_t _depth, uint8_t _numMips, TextureFormat::Enum _format) void calcTextureSize(TextureInfo& _info, uint16_t _width, uint16_t _height, uint16_t _depth, uint8_t _numMips, TextureFormat::Enum _format)
{ {
_width = bx::uint32_max(1, _width); const ImageBlockInfo& blockInfo = getBlockInfo(_format);
_height = bx::uint32_max(1, _height); const uint8_t bpp = blockInfo.bitsPerPixel;
_depth = bx::uint32_max(1, _depth); const uint32_t blockWidth = blockInfo.blockWidth;
const uint32_t blockHeight = blockInfo.blockHeight;
const uint32_t minBlockX = blockInfo.minBlockX;
const uint32_t minBlockY = blockInfo.minBlockY;
_numMips = bx::uint32_max(1, _numMips); _numMips = bx::uint32_max(1, _numMips);
uint32_t width = _width; uint32_t width = bx::uint32_max(1, _width);
uint32_t height = _height; uint32_t height = bx::uint32_max(1, _height);
uint32_t depth = _depth; uint32_t depth = bx::uint32_max(1, _depth);
uint32_t bpp = getBitsPerPixel(_format);
uint32_t size = 0; uint32_t size = 0;
for (uint32_t lod = 0; lod < _numMips; ++lod) for (uint32_t lod = 0; lod < _numMips; ++lod)
{ {
width = bx::uint32_max(1, width); width = bx::uint32_max(blockWidth * minBlockX, ( (width + blockWidth - 1) / blockWidth )*blockWidth);
height = bx::uint32_max(1, height); height = bx::uint32_max(blockHeight * minBlockY, ( (height + blockHeight - 1) / blockHeight)*blockHeight);
depth = bx::uint32_max(1, depth); depth = bx::uint32_max(1, depth);
size += width*height*depth*bpp/8; size += width*height*depth*bpp/8;