diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 0712848f5..2f19ddd41 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -4095,14 +4095,26 @@ namespace bgfx { namespace d3d11 if (bimg::imageParse(imageContainer, _mem->data, _mem->size) ) { - uint8_t numMips = imageContainer.m_numMips; - const uint8_t startLod = bx::min(_skip, numMips-1); - numMips -= startLod; const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(imageContainer.m_format) ); - const uint32_t textureWidth = bx::max(blockInfo.blockWidth, imageContainer.m_width >>startLod); - const uint32_t textureHeight = bx::max(blockInfo.blockHeight, imageContainer.m_height>>startLod); - const uint32_t textureDepth = bx::max(1, imageContainer.m_depth >>startLod); - const uint16_t numLayers = imageContainer.m_numLayers; + const uint8_t startLod = bx::min(_skip, imageContainer.m_numMips-1); + + bimg::TextureInfo ti; + imageGetSize( + &ti + , uint16_t(imageContainer.m_width >>startLod) + , uint16_t(imageContainer.m_height>>startLod) + , uint16_t(imageContainer.m_depth >>startLod) + , imageContainer.m_cubeMap + , 1 < imageContainer.m_numMips + , imageContainer.m_numLayers + , imageContainer.m_format + ); + + const uint8_t numMips = ti.numMips; + const uint32_t textureWidth = ti.width; + const uint32_t textureHeight = ti.height; + const uint32_t textureDepth = ti.depth; + const uint16_t numLayers = ti.numLayers; m_flags = _flags; m_width = textureWidth; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index fe02f3589..a8a3f668f 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -4578,18 +4578,34 @@ namespace bgfx { namespace d3d12 if (bimg::imageParse(imageContainer, _mem->data, _mem->size) ) { - uint8_t numMips = imageContainer.m_numMips; - const uint8_t startLod = uint8_t(bx::uint32_min(_skip, numMips-1) ); - numMips -= startLod; const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(imageContainer.m_format); - const uint32_t textureWidth = bx::uint32_max(blockInfo.blockWidth, imageContainer.m_width >>startLod); - const uint32_t textureHeight = bx::uint32_max(blockInfo.blockHeight, imageContainer.m_height>>startLod); - const uint16_t numLayers = imageContainer.m_numLayers; + const uint8_t startLod = bx::min(_skip, imageContainer.m_numMips-1); + + bimg::TextureInfo ti; + imageGetSize( + &ti + , uint16_t(imageContainer.m_width >>startLod) + , uint16_t(imageContainer.m_height>>startLod) + , uint16_t(imageContainer.m_depth >>startLod) + , imageContainer.m_cubeMap + , 1 < imageContainer.m_numMips + , imageContainer.m_numLayers + , imageContainer.m_format + ); + + const uint8_t numMips = ti.numMips; + const uint32_t textureWidth = ti.width; + const uint32_t textureHeight = ti.height; + const uint32_t textureDepth = ti.depth; + const uint16_t numLayers = ti.numLayers; m_flags = _flags; m_width = textureWidth; m_height = textureHeight; - m_depth = imageContainer.m_depth; + m_depth = 1 < imageContainer.m_depth + ? textureDepth + : imageContainer.m_numLayers + ; m_requestedFormat = uint8_t(imageContainer.m_format); m_textureFormat = uint8_t(getViableTextureFormat(imageContainer) ); const bool convert = m_textureFormat != m_requestedFormat; diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 82ae488f4..1eedd04c5 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -2905,17 +2905,32 @@ namespace bgfx { namespace d3d9 if (bimg::imageParse(imageContainer, _mem->data, _mem->size) ) { - uint8_t numMips = imageContainer.m_numMips; - const uint8_t startLod = uint8_t(bx::uint32_min(_skip, numMips-1) ); - numMips -= startLod; const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(imageContainer.m_format) ); - const uint32_t textureWidth = bx::uint32_max(blockInfo.blockWidth, imageContainer.m_width >>startLod); - const uint32_t textureHeight = bx::uint32_max(blockInfo.blockHeight, imageContainer.m_height>>startLod); + + const uint8_t startLod = bx::min(_skip, imageContainer.m_numMips-1); + + bimg::TextureInfo ti; + imageGetSize( + &ti + , uint16_t(imageContainer.m_width >>startLod) + , uint16_t(imageContainer.m_height>>startLod) + , uint16_t(imageContainer.m_depth >>startLod) + , imageContainer.m_cubeMap + , 1 < imageContainer.m_numMips + , imageContainer.m_numLayers + , imageContainer.m_format + ); + + const uint8_t numMips = ti.numMips; + const uint32_t textureWidth = ti.width; + const uint32_t textureHeight = ti.height; + const uint32_t textureDepth = ti.depth; + const uint16_t numLayers = ti.numLayers; m_flags = _flags; m_width = textureWidth; m_height = textureHeight; - m_depth = imageContainer.m_depth; + m_depth = textureDepth; m_numMips = numMips; m_requestedFormat = uint8_t(imageContainer.m_format); m_textureFormat = uint8_t(getViableTextureFormat(imageContainer) ); diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5c7913da3..43f2eaf29 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -4721,22 +4721,25 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) ); if (bimg::imageParse(imageContainer, _mem->data, _mem->size) ) { - uint8_t numMips = imageContainer.m_numMips; - const uint8_t startLod = uint8_t(bx::uint32_min(_skip, numMips-1) ); - numMips -= startLod; - const uint16_t numLayers = imageContainer.m_numLayers; - uint32_t textureWidth; - uint32_t textureHeight; - uint32_t textureDepth; - { - const bimg::ImageBlockInfo& ibi = bimg::getBlockInfo(bimg::TextureFormat::Enum(imageContainer.m_format) ); - textureWidth = bx::uint32_max(ibi.blockWidth, imageContainer.m_width >>startLod); - textureHeight = bx::uint32_max(ibi.blockHeight, imageContainer.m_height>>startLod); - textureDepth = 1 < imageContainer.m_depth - ? imageContainer.m_depth - : imageContainer.m_numLayers - ; - } + const uint8_t startLod = bx::min(_skip, imageContainer.m_numMips-1); + + bimg::TextureInfo ti; + imageGetSize( + &ti + , uint16_t(imageContainer.m_width >>startLod) + , uint16_t(imageContainer.m_height>>startLod) + , uint16_t(imageContainer.m_depth >>startLod) + , imageContainer.m_cubeMap + , 1 < imageContainer.m_numMips + , imageContainer.m_numLayers + , imageContainer.m_format + ); + + const uint8_t numMips = ti.numMips; + const uint32_t textureWidth = ti.width; + const uint32_t textureHeight = ti.height; + const uint32_t textureDepth = ti.depth; + const uint16_t numLayers = ti.numLayers; m_requestedFormat = uint8_t(imageContainer.m_format); m_textureFormat = uint8_t(getViableTextureFormat(imageContainer) ); diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index 1b157f5f2..d3db0dba3 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -2577,18 +2577,34 @@ namespace bgfx { namespace mtl if (bimg::imageParse(imageContainer, _mem->data, _mem->size) ) { - uint8_t numMips = imageContainer.m_numMips; - const uint8_t startLod = uint8_t(bx::uint32_min(_skip, numMips-1) ); - numMips -= startLod; const bimg::ImageBlockInfo& blockInfo = getBlockInfo(bimg::TextureFormat::Enum(imageContainer.m_format) ); - const uint32_t textureWidth = bx::uint32_max(blockInfo.blockWidth, imageContainer.m_width >>startLod); - const uint32_t textureHeight = bx::uint32_max(blockInfo.blockHeight, imageContainer.m_height>>startLod); - const uint16_t numLayers = imageContainer.m_numLayers; + const uint8_t startLod = bx::min(_skip, imageContainer.m_numMips-1); + + bimg::TextureInfo ti; + imageGetSize( + &ti + , uint16_t(imageContainer.m_width >>startLod) + , uint16_t(imageContainer.m_height>>startLod) + , uint16_t(imageContainer.m_depth >>startLod) + , imageContainer.m_cubeMap + , 1 < imageContainer.m_numMips + , imageContainer.m_numLayers + , imageContainer.m_format + ); + + const uint8_t numMips = ti.numMips; + const uint32_t textureWidth = ti.width; + const uint32_t textureHeight = ti.height; + const uint32_t textureDepth = ti.depth; + const uint16_t numLayers = ti.numLayers; m_flags = _flags; m_width = textureWidth; m_height = textureHeight; - m_depth = imageContainer.m_depth; + m_depth = 1 < imageContainer.m_depth + ? textureDepth + : imageContainer.m_numLayers + ; m_requestedFormat = uint8_t(imageContainer.m_format); m_textureFormat = uint8_t(getViableTextureFormat(imageContainer) ); const bool convert = m_textureFormat != m_requestedFormat;