Fix regressions in renderpass tests
authorSlawomir Cygan <slawomir.cygan@intel.com>
Thu, 1 Oct 2020 14:14:14 +0000 (16:14 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Wed, 18 Nov 2020 07:49:47 +0000 (02:49 -0500)
Regressions were introduced in 2e2e79bd:
- reintroduce 'shrink' loop in ALLOCATIONTYPE_GROW_SHRINK test type
- fix value VkDependencyFlags
- fix logic around checking and writing to "lastUseOfAttachment" variable
- add missing access flags to exisitng subpass dependencies

VK-GL-CTS Issue: 2605

Components: Vulkan

Affects: dEQP-VK.renderpass.suballocation.attachment_allocation.input_output.*

Change-Id: Ie19ac124340e40e529997ac67418a2531a4a0319

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

index b8c09a8..3e76537 100644 (file)
@@ -659,6 +659,9 @@ public:
 
        VkDependencyFlags               getFlags                        (void) const { return m_flags;          }
 
+       void                                    setSrcAccessMask        (const VkAccessFlags& flags) { m_srcAccessMask = flags; }
+       void                                    setDstAccessMask        (const VkAccessFlags& flags) { m_dstAccessMask = flags; }
+
 private:
        deUint32                                m_srcPass;
        deUint32                                m_dstPass;
@@ -5386,23 +5389,12 @@ void addAttachmentAllocationTests (tcu::TestCaseGroup* group, const TestConfigEx
                                                        if (lastUseOfAttachment[colorAttachmentIndex])
                                                        {
                                                                deBool foundDuplicate = false;
-                                                               const VkDependencyFlags dependencyFlags = rng.getBool() ? (VkDependencyFlags) VK_DEPENDENCY_BY_REGION_BIT : 0u;
 
-                                                               for (const SubpassDependency& dependency : deps)
-                                                               {
-                                                                       if (dependency.getSrcPass() == *lastUseOfAttachment[colorAttachmentIndex]
-                                                                               && dependency.getDstPass() == subpassIndex
-                                                                               && dependency.getSrcAccessMask() == VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
-                                                                               && dependency.getFlags() == dependencyFlags)
-                                                                       {
-                                                                               foundDuplicate = true;
-                                                                               break;
-                                                                       }
-                                                               }
+                                                               const deUint32                  srcPass                 = *lastUseOfAttachment[colorAttachmentIndex];
+                                                               const deUint32                  dstPass                 = subpassIndex;
+                                                               const VkDependencyFlags dependencyFlags = rng.getBool() ? (VkDependencyFlags) VK_DEPENDENCY_BY_REGION_BIT : 0u;
 
-                                                               if (!foundDuplicate)
-                                                               {
-                                                                       deps.push_back(SubpassDependency(*lastUseOfAttachment[colorAttachmentIndex], subpassIndex,
+                                                               const SubpassDependency newDependency(srcPass, dstPass,
                                                                                                                                          VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
                                                                                                                                          | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
                                                                                                                                          | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
@@ -5416,13 +5408,28 @@ void addAttachmentAllocationTests (tcu::TestCaseGroup* group, const TestConfigEx
                                                                                                                                          VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
                                                                                                                                          VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
 
-                                                                                                                                         dependencyFlags));
-                                                               }
+                                                                                                                                         dependencyFlags);
 
-                                                               lastUseOfAttachment[colorAttachmentIndex] = just(subpassIndex);
+                                                               for (SubpassDependency& dependency : deps)
+                                                               {
+                                                                       if (dependency.getSrcPass() == srcPass && dependency.getDstPass() == dstPass)
+                                                                       {
+                                                                               const VkAccessFlags newDstFlags = dependency.getDstAccessMask() | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
+                                                                               dependency.setDstAccessMask(newDstFlags);
+                                                                               foundDuplicate = true;
+                                                                               break;
+                                                                       }
+                                                               }
 
-                                                               colorAttachmentReferences.push_back(AttachmentReference((deUint32)subpassColorAttachments[colorAttachmentNdx], VK_IMAGE_LAYOUT_GENERAL));
+                                                               if (!foundDuplicate)
+                                                               {
+                                                                       deps.push_back(newDependency);
+                                                               }
                                                        }
+
+                                                       lastUseOfAttachment[colorAttachmentIndex] = just(subpassIndex);
+
+                                                       colorAttachmentReferences.push_back(AttachmentReference((deUint32)subpassColorAttachments[colorAttachmentNdx], VK_IMAGE_LAYOUT_GENERAL));
                                                }
 
                                                for (size_t inputAttachmentNdx = 0; inputAttachmentNdx < subpassInputAttachments.size(); inputAttachmentNdx++)
@@ -5432,15 +5439,34 @@ void addAttachmentAllocationTests (tcu::TestCaseGroup* group, const TestConfigEx
                                                        if(lastUseOfAttachment[inputAttachmentIndex])
                                                        {
                                                                deBool foundDuplicate = false;
-                                                               const VkDependencyFlags dependencyFlags = (*lastUseOfAttachment[inputAttachmentIndex] == subpassIndex) || rng.getBool();
 
-                                                               for (const SubpassDependency& dependency : deps)
+                                                               const deUint32                  srcPass                 = *lastUseOfAttachment[inputAttachmentIndex];
+                                                               const deUint32                  dstPass                 = subpassIndex;
+                                                               const VkDependencyFlags dependencyFlags = ((srcPass == subpassIndex) || rng.getBool()) ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u;
+
+                                                               const SubpassDependency newDependency(srcPass, dstPass,
+                                                                                                                                         VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+
+                                                                                                                                         VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+
+                                                                                                                                         VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+                                                                                                                                         VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
+
+                                                                                                                                         dependencyFlags);
+                                                               for (SubpassDependency& dependency : deps)
                                                                {
-                                                                       if (dependency.getSrcPass() == *lastUseOfAttachment[inputAttachmentIndex]
-                                                                               && dependency.getDstPass()== subpassIndex
-                                                                               && dependency.getSrcAccessMask() == (VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
-                                                                               && dependency.getFlags() == dependencyFlags)
+                                                                       if (dependency.getSrcPass() == srcPass && dependency.getDstPass() == dstPass)
                                                                        {
+                                                                               const VkAccessFlags newSrcFlags = dependency.getSrcAccessMask() | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+                                                                               const VkAccessFlags newDstFlags = dependency.getDstAccessMask() | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
+                                                                               dependency.setDstAccessMask(newSrcFlags);
+                                                                               dependency.setDstAccessMask(newDstFlags);
                                                                                foundDuplicate = true;
                                                                                break;
                                                                        }
@@ -5448,21 +5474,7 @@ void addAttachmentAllocationTests (tcu::TestCaseGroup* group, const TestConfigEx
 
                                                                if (!foundDuplicate)
                                                                {
-                                                                       deps.push_back(SubpassDependency(*lastUseOfAttachment[inputAttachmentIndex], subpassIndex,
-                                                                                                                                        VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-                                                                                                                                               | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-                                                                                                                                               | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-                                                                                                                                               | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
-
-                                                                                                                                        VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-                                                                                                                                               | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-                                                                                                                                               | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-                                                                                                                                               | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
-
-                                                                                                                                        VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
-                                                                                                                                        VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
-
-                                                                                                                                        dependencyFlags));
+                                                                       deps.push_back(newDependency);
                                                                }
 
                                                                lastUseOfAttachment[inputAttachmentIndex] = just(subpassIndex);
@@ -5477,40 +5489,48 @@ void addAttachmentAllocationTests (tcu::TestCaseGroup* group, const TestConfigEx
                                                        }
                                                }
 
-                                               if (depthStencilAttachment && lastUseOfAttachment[*depthStencilAttachment])
+                                               if (depthStencilAttachment)
                                                {
-                                                       deBool foundDuplicate = false;
-                                                       const VkDependencyFlags dependencyFlags = (*lastUseOfAttachment[*depthStencilAttachment] == subpassIndex) || rng.getBool();
-
-                                                       for (const SubpassDependency& dependency : deps)
+                                                       if (lastUseOfAttachment[*depthStencilAttachment])
                                                        {
-                                                               if (dependency.getSrcPass() == *lastUseOfAttachment[*depthStencilAttachment]
-                                                                       && dependency.getDstPass() == subpassIndex
-                                                                       && dependency.getSrcAccessMask() == (VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
-                                                                       && dependency.getFlags() == dependencyFlags)
-                                                               {
-                                                                       foundDuplicate = true;
-                                                                       break;
-                                                               }
-                                                       }
+                                                               deBool foundDuplicate = false;
 
-                                                       if (!foundDuplicate)
-                                                       {
-                                                               deps.push_back(SubpassDependency(*lastUseOfAttachment[*depthStencilAttachment], subpassIndex,
-                                                                                                                                VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-                                                                                                                                | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-                                                                                                                                | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-                                                                                                                                | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+                                                               const deUint32                  srcPass                 = *lastUseOfAttachment[*depthStencilAttachment];
+                                                               const deUint32                  dstPass                 = subpassIndex;
+                                                               const VkDependencyFlags dependencyFlags = ((srcPass == subpassIndex) || rng.getBool()) ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u;
 
-                                                                                                                                VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-                                                                                                                                | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-                                                                                                                                | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-                                                                                                                                | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+                                                               const SubpassDependency newDependency(srcPass, dstPass,
+                                                                                                                                         VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
 
-                                                                                                                                VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
-                                                                                                                                VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
+                                                                                                                                         VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+                                                                                                                                         | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+
+                                                                                                                                         VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+                                                                                                                                         VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
+
+                                                                                                                                         dependencyFlags);
+                                                               for (SubpassDependency& dependency : deps)
+                                                               {
+                                                                       if (dependency.getSrcPass() == srcPass && dependency.getDstPass() == dstPass)
+                                                                       {
+                                                                               const VkAccessFlags newSrcFlags = dependency.getSrcAccessMask() | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+                                                                               const VkAccessFlags newDstFlags = dependency.getDstAccessMask() | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
+                                                                               dependency.setDstAccessMask(newSrcFlags);
+                                                                               dependency.setDstAccessMask(newDstFlags);
+                                                                               foundDuplicate = true;
+                                                                               break;
+                                                                       }
+                                                               }
 
-                                                                                                                                dependencyFlags));
+                                                               if (!foundDuplicate)
+                                                               {
+                                                                       deps.push_back(newDependency);
+                                                               }
                                                        }
 
                                                        lastUseOfAttachment[*depthStencilAttachment] = just(subpassIndex);
@@ -5699,6 +5719,24 @@ void addAttachmentAllocationTests (tcu::TestCaseGroup* group, const TestConfigEx
                                                                                                        AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
                                                                                                        vector<deUint32>()));
                                        }
+                                       for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
+                                       {
+                                               vector<AttachmentReference>     colorAttachmentReferences;
+
+                                               for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
+                                               {
+                                                       const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayoutsColor), DE_ARRAY_END(subpassLayoutsColor));
+
+                                                       colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
+                                               }
+
+                                               subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
+                                                                                                       vector<AttachmentReference>(),
+                                                                                                       colorAttachmentReferences,
+                                                                                                       vector<AttachmentReference>(),
+                                                                                                       AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
+                                                                                                       vector<deUint32>()));
+                                       }
                                }
                                else if (allocationType == ALLOCATIONTYPE_IO_CHAIN)
                                {