Add missing barrier to dynamic rendering tests
authorjaxl <Jax.Lin@amd.com>
Wed, 15 Sep 2021 03:14:19 +0000 (11:14 +0800)
committerMatthew Netsch <quic_mnetsch@quicinc.com>
Fri, 22 Oct 2021 22:00:45 +0000 (22:00 +0000)
Vulkan spec requires driver to do automatic layout transition when
subpass of render pass begins. However, for dynamic rendering,
there is no such requirement in spec, so the application should
transfer image layout.

Affected tests:
VK.renderpass_with_dynamic_rendering.suballocation.multisample_resolve.*

Components: Vulkan
VK-GL-CTS issue: 3162

Change-Id: Id3bb8fa83ac4f891150f1a8f74bf61e7d7d5e854
(cherry picked from commit 430ab25e4964bd195c58e15e7b51a7de620ebd40)

external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp

index 677ee12..798f8c4 100644 (file)
@@ -730,6 +730,43 @@ void MultisampleRenderPassTestInstance::submit (void)
                vkd.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, (deUint32)barriers.size(), &barriers[0]);
        }
 
+       // Memory barriers to set multisample image layout to COLOR_ATTACHMENT_OPTIMAL
+       if (m_renderingType == RENDERING_TYPE_DYNAMIC_RENDERING)
+       {
+               std::vector<VkImageMemoryBarrier> barriers;
+
+               for (size_t dstNdx = 0; dstNdx < m_multisampleImages.size(); dstNdx++)
+               {
+                       const VkImageMemoryBarrier barrier =
+                       {
+                               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                               DE_NULL,
+
+                               0,
+                               VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+
+                               VK_IMAGE_LAYOUT_UNDEFINED,
+                               VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+
+                               VK_QUEUE_FAMILY_IGNORED,
+                               VK_QUEUE_FAMILY_IGNORED,
+
+                               **m_multisampleImages[dstNdx],
+                               {
+                                       VK_IMAGE_ASPECT_COLOR_BIT,
+                                       0u,
+                                       1u,
+                                       0u,
+                                       m_layerCount
+                               }
+                       };
+
+                       barriers.push_back(barrier);
+               }
+
+               vkd.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, (deUint32)barriers.size(), &barriers[0]);
+       }
+
        VkRect2D renderArea = makeRect2D(m_width, m_height);
        if (m_renderingType == RENDERING_TYPE_DYNAMIC_RENDERING)
        {