Fix missing dependency on sparse binds
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / renderpass / vktRenderPassTestsUtil.cpp
index 90d2da6..0c3db96 100644 (file)
@@ -695,24 +695,50 @@ SubpassDesc createSubpassDescription (const Subpass&                              subpass,
        }
 }
 
+VkMemoryBarrier2KHR createMemoryBarrierFromSubpassDependency(const SubpassDependency& dependencyInfo)
+{
+       return
+       {
+               VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR,                                                                                         // VkStructureType                              sType
+               DE_NULL,                                                                                                                                                        // const void*                                  pNext
+               static_cast<VkPipelineStageFlags2KHR>   (dependencyInfo.getSrcStageMask()),                     // VkPipelineStageFlags2KHR             srcStageMask
+               static_cast<VkAccessFlags2KHR>                  (dependencyInfo.getSrcAccessMask()),            // VkAccessFlags2KHR                    srcAccessMask
+               static_cast<VkPipelineStageFlags2KHR>   (dependencyInfo.getDstStageMask()),                     // VkPipelineStageFlags2KHR             dstStageMask
+               static_cast<VkAccessFlags2KHR>                  (dependencyInfo.getDstAccessMask())                     // VkAccessFlags2KHR                    dstAccessMask
+       };
+}
+
 template <typename SubpassDep>
-SubpassDep createSubpassDependency (const SubpassDependency& dependencyInfo)
+SubpassDep createSubpassDependency (const SubpassDependency& dependencyInfo, VkMemoryBarrier2KHR* memoryBarrierPtr = DE_NULL)
 {
-       const SubpassDep dependency                             //  VkSubpassDependency                                         ||  VkSubpassDependency2
-       (
-                                                                                       //                                                                                      ||      VkStructureType                         sType
-               DE_NULL,                                                        //                                                                                      ||      const void*                                     pNext
+       VkPipelineStageFlags    srcStageMask    = dependencyInfo.getSrcStageMask();
+       VkPipelineStageFlags    dstStageMask    = dependencyInfo.getDstStageMask();
+       VkAccessFlags                   srcAccessMask   = dependencyInfo.getSrcAccessMask();
+       VkAccessFlags                   dstAccessMask   = dependencyInfo.getDstAccessMask();
+
+       // If an instance of VkMemoryBarrier2KHR is included in the pNext chain, srcStageMask,
+       // dstStageMask, srcAccessMask and dstAccessMask parameters are ignored. The synchronization
+       // and access scopes instead are defined by the parameters of VkMemoryBarrier2KHR.
+       if (memoryBarrierPtr)
+       {
+               srcStageMask    = 0;
+               dstStageMask    = 0;
+               srcAccessMask   = 0;
+               dstAccessMask   = 0;
+       }
+
+       return                                                                  //  VkSubpassDependency                                         ||  VkSubpassDependency2
+       {
+               memoryBarrierPtr,                                       //                                                                                      ||      const void*                                     pNext
                dependencyInfo.getSrcPass(),            //  deUint32                            srcSubpass              ||      deUint32                                        srcSubpass
                dependencyInfo.getDstPass(),            //  deUint32                            dstSubpass              ||      deUint32                                        dstSubpass
-               dependencyInfo.getSrcStageMask(),       //  VkPipelineStageFlags        srcStageMask    ||      VkPipelineStageFlags            srcStageMask
-               dependencyInfo.getDstStageMask(),       //  VkPipelineStageFlags        dstStageMask    ||      VkPipelineStageFlags            dstStageMask
-               dependencyInfo.getSrcAccessMask(),      //  VkAccessFlags                       srcAccessMask   ||      VkAccessFlags                           srcAccessMask
-               dependencyInfo.getDstAccessMask(),      //  VkAccessFlags                       dstAccessMask   ||      VkAccessFlags                           dstAccessMask
+               srcStageMask,                                           //  VkPipelineStageFlags        srcStageMask    ||      VkPipelineStageFlags            srcStageMask
+               dstStageMask,                                           //  VkPipelineStageFlags        dstStageMask    ||      VkPipelineStageFlags            dstStageMask
+               srcAccessMask,                                          //  VkAccessFlags                       srcAccessMask   ||      VkAccessFlags                           srcAccessMask
+               dstAccessMask,                                          //  VkAccessFlags                       dstAccessMask   ||      VkAccessFlags                           dstAccessMask
                dependencyInfo.getFlags(),                      //  VkDependencyFlags           dependencyFlags ||      VkDependencyFlags                       dependencyFlags
                0u                                                                      //      deInt32                                 viewOffset              ||      deInt32                                         viewOffset
-       );
-
-       return dependency;
+       };
 }
 
 de::MovePtr<VkRenderPassInputAttachmentAspectCreateInfo> createRenderPassInputAttachmentAspectCreateInfo (const RenderPass& renderPassInfo)
@@ -739,12 +765,14 @@ de::MovePtr<VkRenderPassInputAttachmentAspectCreateInfo> createRenderPassInputAt
 template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
 Move<VkRenderPass> createRenderPass (const DeviceInterface&    vk,
                                                                         VkDevice                               device,
-                                                                        const RenderPass&              renderPassInfo)
+                                                                        const RenderPass&              renderPassInfo,
+                                                                        SynchronizationType    synchronizationType)
 {
        const size_t                                                                                            perSubpassAttachmentReferenceLists = 4;
        std::vector<AttachmentDesc>                                                                     attachments;
        std::vector<SubpassDesc>                                                                        subpasses;
        std::vector<SubpassDep>                                                                         dependencies;
+       std::vector<VkMemoryBarrier2KHR>                                                        memoryBarriers;
        std::vector<std::vector<AttachmentRef> >                                        attachmentReferenceLists(renderPassInfo.getSubpasses().size() * perSubpassAttachmentReferenceLists);
        std::vector<std::vector<deUint32> >                                                     preserveAttachments(renderPassInfo.getSubpasses().size());
        de::MovePtr<VkRenderPassInputAttachmentAspectCreateInfo>        inputAspectCreateInfo(createRenderPassInputAttachmentAspectCreateInfo(renderPassInfo));
@@ -755,8 +783,21 @@ Move<VkRenderPass> createRenderPass (const DeviceInterface&        vk,
        for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
                subpasses.push_back(createSubpassDescription<SubpassDesc>(renderPassInfo.getSubpasses()[subpassNdx], &(attachmentReferenceLists[subpassNdx * perSubpassAttachmentReferenceLists]), &preserveAttachments[subpassNdx]));
 
-       for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++)
-               dependencies.push_back(createSubpassDependency<SubpassDep>(renderPassInfo.getDependencies()[depNdx]));
+       if (synchronizationType == SYNCHRONIZATION_TYPE_SYNCHRONIZATION2)
+       {
+               // reserve space to avoid reallocation in vector that will invalidate pointers
+               memoryBarriers.reserve(renderPassInfo.getDependencies().size());
+               for (const auto& dependency : renderPassInfo.getDependencies())
+               {
+                       memoryBarriers.push_back(createMemoryBarrierFromSubpassDependency(dependency));
+                       dependencies.push_back(createSubpassDependency<SubpassDep>(dependency, &memoryBarriers.back()));
+               }
+       }
+       else
+       {
+               for (const auto& dependency : renderPassInfo.getDependencies())
+                       dependencies.push_back(createSubpassDependency<SubpassDep>(dependency));
+       }
 
        const RenderPassCreateInfo      renderPassCreator                               //  VkRenderPassCreateInfo                                                              ||  VkRenderPassCreateInfo2
        (
@@ -779,14 +820,23 @@ Move<VkRenderPass> createRenderPass (const DeviceInterface&       vk,
 Move<VkRenderPass> createRenderPass (const DeviceInterface&    vk,
                                                                         VkDevice                               device,
                                                                         const RenderPass&              renderPassInfo,
-                                                                        const RenderPassType   renderPassType)
+                                                                        RenderingType                  renderingType,
+                                                                        SynchronizationType    synchronizationType)
 {
-       switch (renderPassType)
+       switch (renderingType)
        {
-               case RENDERPASS_TYPE_LEGACY:
-                       return createRenderPass<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>(vk, device, renderPassInfo);
-               case RENDERPASS_TYPE_RENDERPASS2:
-                       return createRenderPass<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>(vk, device, renderPassInfo);
+               case RENDERING_TYPE_RENDERPASS_LEGACY:
+                       return createRenderPass<AttachmentDescription1,
+                                                                       AttachmentReference1,
+                                                                       SubpassDescription1,
+                                                                       SubpassDependency1,
+                                                                       RenderPassCreateInfo1>(vk, device, renderPassInfo, SYNCHRONIZATION_TYPE_LEGACY);
+               case RENDERING_TYPE_RENDERPASS2:
+                       return createRenderPass<AttachmentDescription2,
+                                                                       AttachmentReference2,
+                                                                       SubpassDescription2,
+                                                                       SubpassDependency2,
+                                                                       RenderPassCreateInfo2>(vk, device, renderPassInfo, synchronizationType);
                default:
                        TCU_THROW(InternalError, "Impossible");
        }