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

Fixed incorrect mipmap generation on Vulkan for Cubemaps (#3236) (#3290)

Nikolay Ivanov 1 год назад
Родитель
Сommit
2d17b9866b
1 измененных файлов с 12 добавлено и 6 удалено
  1. 12 6
      src/renderer_vk.cpp

+ 12 - 6
src/renderer_vk.cpp

@@ -6251,6 +6251,12 @@ VK_DESTROY
 		const VkImageLayout oldLayout = m_currentImageLayout;
 		const VkImageLayout oldSingleMsaaLayout = m_currentSingleMsaaImageLayout;
 
+        auto numLayers = _numLayers;
+        if(m_type == VK_IMAGE_VIEW_TYPE_CUBE || VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
+        {
+            numLayers = m_numSides;
+        }
+
 		if (needResolve)
 		{
 			setImageMemoryBarrier(_commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
@@ -6266,11 +6272,11 @@ VK_DESTROY
 			resolve.srcSubresource.aspectMask     = VK_IMAGE_ASPECT_COLOR_BIT;
 			resolve.srcSubresource.mipLevel       = _mip;
 			resolve.srcSubresource.baseArrayLayer = _layer;
-			resolve.srcSubresource.layerCount     = _numLayers;
+            resolve.srcSubresource.layerCount     = numLayers;
 			resolve.dstSubresource.aspectMask     = VK_IMAGE_ASPECT_COLOR_BIT;
 			resolve.dstSubresource.mipLevel       = _mip;
 			resolve.dstSubresource.baseArrayLayer = _layer;
-			resolve.dstSubresource.layerCount     = _numLayers;
+            resolve.dstSubresource.layerCount     = numLayers;
 			resolve.extent.width  = m_width;
 			resolve.extent.height = m_height;
 			resolve.extent.depth  = 1;
@@ -6304,13 +6310,13 @@ VK_DESTROY
 			blit.srcSubresource.aspectMask = m_aspectMask;
 			blit.srcSubresource.mipLevel = 0;
 			blit.srcSubresource.baseArrayLayer = _layer;
-			blit.srcSubresource.layerCount = _numLayers;
+            blit.srcSubresource.layerCount = numLayers;
 			blit.dstOffsets[0] = { 0, 0, 0 };
 			blit.dstOffsets[1] = { mipWidth, mipHeight, 1 };
 			blit.dstSubresource.aspectMask = m_aspectMask;
 			blit.dstSubresource.mipLevel = 0;
 			blit.dstSubresource.baseArrayLayer = _layer;
-			blit.dstSubresource.layerCount = _numLayers;
+            blit.dstSubresource.layerCount = numLayers;
 
 			for (uint32_t i = _mip + 1; i < m_numMips; i++)
 			{
@@ -6333,7 +6339,7 @@ VK_DESTROY
 					, blit.srcSubresource.mipLevel
 					, 1
 					, _layer
-					, _numLayers
+                    , numLayers
 					);
 
 				vkCmdBlitImage(
@@ -6357,7 +6363,7 @@ VK_DESTROY
 				, _mip
 				, m_numMips - _mip - 1
 				, _layer
-				, _numLayers
+                , numLayers
 				);
 		}