Просмотр исходного кода

Fixed skip mips when crating BC textures.

Бранимир Караџић 7 лет назад
Родитель
Сommit
ec4b823db7
5 измененных файлов с 105 добавлено и 43 удалено
  1. 19 7
      src/renderer_d3d11.cpp
  2. 23 7
      src/renderer_d3d12.cpp
  3. 21 6
      src/renderer_d3d9.cpp
  4. 19 16
      src/renderer_gl.cpp
  5. 23 7
      src/renderer_mtl.mm

+ 19 - 7
src/renderer_d3d11.cpp

@@ -4095,14 +4095,26 @@ namespace bgfx { namespace d3d11
 
 
 		if (bimg::imageParse(imageContainer, _mem->data, _mem->size) )
 		if (bimg::imageParse(imageContainer, _mem->data, _mem->size) )
 		{
 		{
-			uint8_t numMips = imageContainer.m_numMips;
-			const uint8_t startLod = bx::min<uint8_t>(_skip, numMips-1);
-			numMips -= startLod;
 			const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(imageContainer.m_format) );
 			const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(imageContainer.m_format) );
-			const uint32_t textureWidth  = bx::max<uint32_t>(blockInfo.blockWidth,  imageContainer.m_width >>startLod);
-			const uint32_t textureHeight = bx::max<uint32_t>(blockInfo.blockHeight, imageContainer.m_height>>startLod);
-			const uint32_t textureDepth  = bx::max<uint32_t>(1,                     imageContainer.m_depth >>startLod);
-			const uint16_t numLayers     = imageContainer.m_numLayers;
+			const uint8_t startLod = bx::min<uint8_t>(_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_flags  = _flags;
 			m_width  = textureWidth;
 			m_width  = textureWidth;

+ 23 - 7
src/renderer_d3d12.cpp

@@ -4578,18 +4578,34 @@ namespace bgfx { namespace d3d12
 
 
 		if (bimg::imageParse(imageContainer, _mem->data, _mem->size) )
 		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 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<uint8_t>(_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_flags  = _flags;
 			m_width  = textureWidth;
 			m_width  = textureWidth;
 			m_height = textureHeight;
 			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_requestedFormat  = uint8_t(imageContainer.m_format);
 			m_textureFormat    = uint8_t(getViableTextureFormat(imageContainer) );
 			m_textureFormat    = uint8_t(getViableTextureFormat(imageContainer) );
 			const bool convert = m_textureFormat != m_requestedFormat;
 			const bool convert = m_textureFormat != m_requestedFormat;

+ 21 - 6
src/renderer_d3d9.cpp

@@ -2905,17 +2905,32 @@ namespace bgfx { namespace d3d9
 
 
 		if (bimg::imageParse(imageContainer, _mem->data, _mem->size) )
 		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 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<uint8_t>(_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_flags   = _flags;
 			m_width   = textureWidth;
 			m_width   = textureWidth;
 			m_height  = textureHeight;
 			m_height  = textureHeight;
-			m_depth   = imageContainer.m_depth;
+			m_depth   = textureDepth;
 			m_numMips = numMips;
 			m_numMips = numMips;
 			m_requestedFormat = uint8_t(imageContainer.m_format);
 			m_requestedFormat = uint8_t(imageContainer.m_format);
 			m_textureFormat   = uint8_t(getViableTextureFormat(imageContainer) );
 			m_textureFormat   = uint8_t(getViableTextureFormat(imageContainer) );

+ 19 - 16
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) )
 		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<uint8_t>(_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_requestedFormat  = uint8_t(imageContainer.m_format);
 			m_textureFormat    = uint8_t(getViableTextureFormat(imageContainer) );
 			m_textureFormat    = uint8_t(getViableTextureFormat(imageContainer) );

+ 23 - 7
src/renderer_mtl.mm

@@ -2577,18 +2577,34 @@ namespace bgfx { namespace mtl
 
 
 		if (bimg::imageParse(imageContainer, _mem->data, _mem->size) )
 		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 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<uint8_t>(_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_flags  = _flags;
 			m_width  = textureWidth;
 			m_width  = textureWidth;
 			m_height = textureHeight;
 			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_requestedFormat  = uint8_t(imageContainer.m_format);
 			m_textureFormat    = uint8_t(getViableTextureFormat(imageContainer) );
 			m_textureFormat    = uint8_t(getViableTextureFormat(imageContainer) );
 			const bool convert = m_textureFormat != m_requestedFormat;
 			const bool convert = m_textureFormat != m_requestedFormat;