Add missing barrier when rendering to the same view mask.

Components: Vulkan

VK-GL-CTS Issue: 3471

Affects:
dEQP-VK.multiview.*

Change-Id: Ibf0cab45831f321db7f9d83e00d4f6b5c2a5b216
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
index f175e04..d6d4995 100644
--- a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
@@ -296,6 +296,7 @@
 	void									fillTriangle			(const tcu::PixelBufferAccess& pixelBuffer, const tcu::Vec4& color, const int layerNdx, const deUint32 quarter) const;
 	void									fillLayer				(const tcu::PixelBufferAccess& pixelBuffer, const tcu::Vec4& color, const int layerNdx) const;
 	void									fillQuarter				(const tcu::PixelBufferAccess& pixelBuffer, const tcu::Vec4& color, const int layerNdx, const deUint32 quarter, const deUint32 subpassNdx) const;
+	void                                    addRenderingSubpassDependencyIfRequired (deUint32 currentSubpassNdx);
 
 	const TestParameters			m_parameters;
 	const bool						m_useDynamicRendering;
@@ -436,6 +437,41 @@
 		VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
 }
 
+void MultiViewRenderTestInstance::addRenderingSubpassDependencyIfRequired (deUint32 currentSubpassNdx)
+{
+	// Get the combined view mask since the last pipeline barrier.
+	deUint32 viewMask = 0;
+
+	for (deUint32 subpassNdx = 0; subpassNdx < currentSubpassNdx; ++subpassNdx)
+	{
+		if ((viewMask & m_parameters.viewMasks[subpassNdx]) != 0)
+		{
+			viewMask = 0; // This subpass should have a pipeline barrier so reset the view mask.
+		}
+
+		viewMask |= m_parameters.viewMasks[subpassNdx];
+	}
+
+	// Add a pipeline barrier if the view mask for this subpass contains bits used in previous subpasses
+	// since the last pipeline barrier.
+	if ((viewMask & m_parameters.viewMasks[currentSubpassNdx]) != 0)
+	{
+		const VkImageSubresourceRange	subresourceRange		=
+		{
+			VK_IMAGE_ASPECT_COLOR_BIT,	//VkImageAspectFlags	aspectMask;
+			0u,							//deUint32				baseMipLevel;
+			1u,							//deUint32				levelCount;
+			0u,							//deUint32				baseArrayLayer;
+			m_parameters.extent.depth,	//deUint32				layerCount;
+		};
+
+		imageBarrier(*m_device, *m_cmdBuffer, m_colorAttachment->getImage(), subresourceRange,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
+	}
+}
+
 void MultiViewRenderTestInstance::draw (const deUint32 subpassCount, VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
 {
 	const VkRect2D					renderArea				= { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
@@ -472,6 +508,8 @@
 	{
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -1815,6 +1853,8 @@
 	{
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -1906,6 +1946,8 @@
 	{
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -2058,6 +2100,8 @@
 	{
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -2187,6 +2231,8 @@
 
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -2325,6 +2371,8 @@
 
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -2447,6 +2495,8 @@
 
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -2625,6 +2675,8 @@
 
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -2935,6 +2987,8 @@
 
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			beginRendering(
 				*m_device,
 				*m_cmdBuffer,
@@ -3141,6 +3195,8 @@
 
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			VkAttachmentLoadOp loadOperation = VK_ATTACHMENT_LOAD_OP_LOAD;
 			if (clearPass)
 			{
@@ -3681,6 +3737,8 @@
 
 		if (m_useDynamicRendering)
 		{
+			addRenderingSubpassDependencyIfRequired(subpassNdx);
+
 			VkRenderingAttachmentInfoKHR colorAttachment
 			{
 				vk::VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR,	// VkStructureType						sType;