Browse Source

Fix layout transitions during series of blit (#2640)

Christophe Dehais 4 years ago
parent
commit
dd7fb33595
1 changed files with 33 additions and 32 deletions
  1. 33 32
      src/renderer_vk.cpp

+ 33 - 32
src/renderer_vk.cpp

@@ -7890,43 +7890,42 @@ VK_DESTROY
 
 
 	void RendererContextVK::submitBlit(BlitState& _bs, uint16_t _view)
 	void RendererContextVK::submitBlit(BlitState& _bs, uint16_t _view)
 	{
 	{
-		TextureHandle currentSrc = { kInvalidHandle };
-		TextureHandle currentDst = { kInvalidHandle };
-		VkImageLayout oldSrcLayout = VK_IMAGE_LAYOUT_UNDEFINED;
-		VkImageLayout oldDstLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+		VkImageLayout srcLayouts[BGFX_CONFIG_MAX_BLIT_ITEMS];
+		VkImageLayout dstLayouts[BGFX_CONFIG_MAX_BLIT_ITEMS];
 
 
-		while (_bs.hasItem(_view) )
+		BlitState bs0 = _bs;
+
+		while (bs0.hasItem(_view) )
 		{
 		{
-			const BlitItem& blit = _bs.advance();
+			uint16_t item = bs0.m_item;
+
+			const BlitItem& blit = bs0.advance();
 
 
 			TextureVK& src = m_textures[blit.m_src.idx];
 			TextureVK& src = m_textures[blit.m_src.idx];
 			TextureVK& dst = m_textures[blit.m_dst.idx];
 			TextureVK& dst = m_textures[blit.m_dst.idx];
 
 
-			if (currentSrc.idx != blit.m_src.idx)
-			{
-				if (oldSrcLayout != VK_IMAGE_LAYOUT_UNDEFINED)
-				{
-					TextureVK& texture = m_textures[currentSrc.idx];
-					texture.setImageMemoryBarrier(m_commandBuffer, oldSrcLayout, VK_NULL_HANDLE != texture.m_singleMsaaImage);
-				}
+			srcLayouts[item] = VK_NULL_HANDLE != src.m_singleMsaaImage ? src.m_currentSingleMsaaImageLayout : src.m_currentImageLayout;
+			dstLayouts[item] = dst.m_currentImageLayout;
+		}
+
+		bs0 = _bs;
+
+		while (bs0.hasItem(_view) )
+		{
+			const BlitItem& blit = bs0.advance();
+
+			TextureVK& src = m_textures[blit.m_src.idx];
+			TextureVK& dst = m_textures[blit.m_dst.idx];
 
 
-				oldSrcLayout = src.setImageMemoryBarrier(
+			src.setImageMemoryBarrier(
 					  m_commandBuffer
 					  m_commandBuffer
-					, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
+					, blit.m_src.idx == blit.m_dst.idx ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
 					, VK_NULL_HANDLE != src.m_singleMsaaImage
 					, VK_NULL_HANDLE != src.m_singleMsaaImage
 					);
 					);
-				currentSrc = blit.m_src;
-			}
 
 
-			if (currentDst.idx != blit.m_dst.idx)
+			if (blit.m_src.idx != blit.m_dst.idx)
 			{
 			{
-				if (oldDstLayout != VK_IMAGE_LAYOUT_UNDEFINED)
-				{
-					m_textures[currentDst.idx].setImageMemoryBarrier(m_commandBuffer, oldDstLayout);
-				}
-
-				oldDstLayout = dst.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-				currentDst = blit.m_dst;
+				dst.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
 			}
 			}
 
 
 			const uint16_t srcSamples = VK_NULL_HANDLE != src.m_singleMsaaImage ? 1 : src.m_sampler.Count;
 			const uint16_t srcSamples = VK_NULL_HANDLE != src.m_singleMsaaImage ? 1 : src.m_sampler.Count;
@@ -7994,15 +7993,17 @@ VK_DESTROY
 				);
 				);
 		}
 		}
 
 
-		if (oldSrcLayout != VK_IMAGE_LAYOUT_UNDEFINED)
+		while (_bs.hasItem(_view) )
 		{
 		{
-			TextureVK& texture = m_textures[currentSrc.idx];
-			texture.setImageMemoryBarrier(m_commandBuffer, oldSrcLayout, VK_NULL_HANDLE != texture.m_singleMsaaImage);
-		}
+			uint16_t item = _bs.m_item;
 
 
-		if (oldDstLayout != VK_IMAGE_LAYOUT_UNDEFINED)
-		{
-			m_textures[currentDst.idx].setImageMemoryBarrier(m_commandBuffer, oldDstLayout);
+			const BlitItem& blit = _bs.advance();
+
+			TextureVK& src = m_textures[blit.m_src.idx];
+			TextureVK& dst = m_textures[blit.m_dst.idx];
+
+			src.setImageMemoryBarrier(m_commandBuffer, srcLayouts[item], VK_NULL_HANDLE != src.m_singleMsaaImage);
+			dst.setImageMemoryBarrier(m_commandBuffer, dstLayouts[item]);
 		}
 		}
 	}
 	}