Replace incorrect undefined->transfer-dst-opt layout transfers
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Sat, 26 Sep 2020 12:27:56 +0000 (15:27 +0300)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 16 Oct 2020 10:49:53 +0000 (06:49 -0400)
The additional transfer from the UNDEFINED layout right after a clear
command seem incorrect, as they can have the effect of discarding the
previous command's effect on some implementations.

Put barriers in front of the clears using the same source & destination
layouts.

Affects:

dEQP-VK.api.image_clearing.core.clear_color_image.*

Components: Vulkan

VK-GL-CTS issue: 2603

Change-Id: I57377f12968f6ffd38ac017f874324cd4bfdf3e4

external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp

index 99d167a..1701dc0 100644 (file)
@@ -1383,27 +1383,28 @@ TestStatus ClearColorImageTestInstance::iterate (void)
                        VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);                                          // VkImageLayout                        newLayout;
        }
 
+       pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,                            // VkPipelineStageFlags         srcStageMask
+                                                VK_PIPELINE_STAGE_TRANSFER_BIT,                                // VkPipelineStageFlags         dstStageMask
+                                                VK_ACCESS_TRANSFER_WRITE_BIT,                                  // VkAccessFlags                        srcAccessMask
+                                                VK_ACCESS_TRANSFER_WRITE_BIT,                                  // VkAccessFlags                        dstAccessMask
+                                                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                  // VkImageLayout                        oldLayout;
+                                                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);                 // VkImageLayout                        newLayout;
+
        // Different clear color per range
        for (std::size_t i = 0u; i < subresourceRanges.size(); ++i)
        {
                m_vkd.cmdClearColorImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[i].color, 1, &subresourceRanges[i]);
 
-               pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,                    // VkPipelineStageFlags         srcStageMask
-                                                        VK_PIPELINE_STAGE_TRANSFER_BIT,                        // VkPipelineStageFlags         dstStageMask
-                                                        VK_ACCESS_TRANSFER_WRITE_BIT,                          // VkAccessFlags                        srcAccessMask
-                                                        VK_ACCESS_TRANSFER_WRITE_BIT,                          // VkAccessFlags                        dstAccessMask
-                                                        VK_IMAGE_LAYOUT_UNDEFINED,                                     // VkImageLayout                        oldLayout;
-                                                        VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);         // VkImageLayout                        newLayout;
                if (m_twoStep)
                {
-                       m_vkd.cmdClearColorImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[i].color, 1, &steptwoRanges[i]);
+                       pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,                            // VkPipelineStageFlags         srcStageMask
+                                                                VK_PIPELINE_STAGE_TRANSFER_BIT,                                // VkPipelineStageFlags         dstStageMask
+                                                                VK_ACCESS_TRANSFER_WRITE_BIT,                                  // VkAccessFlags                        srcAccessMask
+                                                                VK_ACCESS_TRANSFER_WRITE_BIT,                                  // VkAccessFlags                        dstAccessMask
+                                                                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                  // VkImageLayout                        oldLayout;
+                                                                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);                 // VkImageLayout                        newLayout;
 
-                       pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,            // VkPipelineStageFlags         srcStageMask
-                                                                VK_PIPELINE_STAGE_TRANSFER_BIT,                // VkPipelineStageFlags         dstStageMask
-                                                                VK_ACCESS_TRANSFER_WRITE_BIT,                  // VkAccessFlags                        srcAccessMask
-                                                                VK_ACCESS_TRANSFER_WRITE_BIT,                  // VkAccessFlags                        dstAccessMask
-                                                                VK_IMAGE_LAYOUT_UNDEFINED,                             // VkImageLayout                        oldLayout;
-                                                                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout                        newLayout;
+                       m_vkd.cmdClearColorImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[i].color, 1, &steptwoRanges[i]);
                }
        }