Fix missing dependency on sparse binds
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / renderpass / vktRenderPassTestsUtil.cpp
index 828d7c4..0c3db96 100644 (file)
@@ -72,7 +72,7 @@ AttachmentDescription2::AttachmentDescription2 (const void*                                           pNext_,
                                                                                                VkImageLayout                                   initialLayout_,
                                                                                                VkImageLayout                                   finalLayout_)
 {
-       sType                   = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
+       sType                   = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
        pNext                   = pNext_;
        flags                   = flags_;
        format                  = format_;
@@ -104,7 +104,7 @@ AttachmentReference2::AttachmentReference2 (const void*                     pNext_,
                                                                                        VkImageLayout           layout_,
                                                                                        VkImageAspectFlags      aspectMask_)
 {
-       sType           = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
+       sType           = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2;
        pNext           = pNext_;
        attachment      = attachment_;
        layout          = layout_;
@@ -147,15 +147,15 @@ SubpassDescription2::SubpassDescription2 (const void*                                             pNext_,
                                                                                  VkPipelineBindPoint                           pipelineBindPoint_,
                                                                                  deUint32                                                      viewMask_,
                                                                                  deUint32                                                      inputAttachmentCount_,
-                                                                                 const VkAttachmentReference2KHR*      pInputAttachments_,
+                                                                                 const VkAttachmentReference2*         pInputAttachments_,
                                                                                  deUint32                                                      colorAttachmentCount_,
-                                                                                 const VkAttachmentReference2KHR*      pColorAttachments_,
-                                                                                 const VkAttachmentReference2KHR*      pResolveAttachments_,
-                                                                                 const VkAttachmentReference2KHR*      pDepthStencilAttachment_,
+                                                                                 const VkAttachmentReference2*         pColorAttachments_,
+                                                                                 const VkAttachmentReference2*         pResolveAttachments_,
+                                                                                 const VkAttachmentReference2*         pDepthStencilAttachment_,
                                                                                  deUint32                                                      preserveAttachmentCount_,
                                                                                  const deUint32*                                       pPreserveAttachments_)
 {
-       sType                                   = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
+       sType                                   = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2;
        pNext                                   = pNext_;
        flags                                   = flags_;
        pipelineBindPoint               = pipelineBindPoint_;
@@ -205,7 +205,7 @@ SubpassDependency2::SubpassDependency2 (const void*                         pNext_,
                                                                                VkDependencyFlags               dependencyFlags_,
                                                                                deInt32                                 viewOffset_)
 {
-       sType                   = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR;
+       sType                   = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
        pNext                   = pNext_;
        srcSubpass              = srcSubpass_;
        dstSubpass              = dstSubpass_;
@@ -252,15 +252,15 @@ Move<VkRenderPass>        RenderPassCreateInfo1::createRenderPass (const DeviceInterfac
 RenderPassCreateInfo2::RenderPassCreateInfo2 (const void*                                                      pNext_,
                                                                                          VkRenderPassCreateFlags                               flags_,
                                                                                          deUint32                                                              attachmentCount_,
-                                                                                         const VkAttachmentDescription2KHR*    pAttachments_,
+                                                                                         const VkAttachmentDescription2*               pAttachments_,
                                                                                          deUint32                                                              subpassCount_,
-                                                                                         const VkSubpassDescription2KHR*               pSubpasses_,
+                                                                                         const VkSubpassDescription2*                  pSubpasses_,
                                                                                          deUint32                                                              dependencyCount_,
-                                                                                         const VkSubpassDependency2KHR*                pDependencies_,
+                                                                                         const VkSubpassDependency2*                   pDependencies_,
                                                                                          deUint32                                                              correlatedViewMaskCount_,
                                                                                          const deUint32*                                               pCorrelatedViewMasks_)
 {
-       sType                                   = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
+       sType                                   = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2;
        pNext                                   = pNext_;
        flags                                   = flags_;
        attachmentCount                 = attachmentCount_;
@@ -275,7 +275,7 @@ RenderPassCreateInfo2::RenderPassCreateInfo2 (const void*                                                   pNext_,
 
 Move<VkRenderPass>     RenderPassCreateInfo2::createRenderPass (const DeviceInterface& vk, VkDevice device) const
 {
-       return vk::createRenderPass2KHR(vk, device, this);
+       return vk::createRenderPass2(vk, device, this);
 }
 
 SubpassBeginInfo1::SubpassBeginInfo1 (const void*              pNext_,
@@ -290,7 +290,7 @@ SubpassBeginInfo1::SubpassBeginInfo1 (const void*           pNext_,
 SubpassBeginInfo2::SubpassBeginInfo2 (const void*              pNext_,
                                                                          VkSubpassContents     contents_)
 {
-       sType           = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR;
+       sType           = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO;
        pNext           = pNext_;
        contents        = contents_;
 }
@@ -304,7 +304,7 @@ SubpassEndInfo1::SubpassEndInfo1 (const void*       pNext_)
 
 SubpassEndInfo2::SubpassEndInfo2 (const void*  pNext_)
 {
-       sType   = VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR;
+       sType   = VK_STRUCTURE_TYPE_SUBPASS_END_INFO;
        pNext   = pNext_;
 }
 
@@ -343,7 +343,7 @@ void RenderpassSubpass2::cmdBeginRenderPass (const DeviceInterface&                 vk,
                                                                                         const VkRenderPassBeginInfo*   pRenderPassBegin,
                                                                                         const SubpassBeginInfo*                pSubpassBeginInfo)
 {
-       vk.cmdBeginRenderPass2KHR(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
+       vk.cmdBeginRenderPass2(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
 }
 
 void RenderpassSubpass2::cmdNextSubpass (const DeviceInterface&                vk,
@@ -354,7 +354,7 @@ void RenderpassSubpass2::cmdNextSubpass (const DeviceInterface&             vk,
        DE_ASSERT(pSubpassBeginInfo != DE_NULL);
        DE_ASSERT(pSubpassEndInfo != DE_NULL);
 
-       vk.cmdNextSubpass2KHR(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+       vk.cmdNextSubpass2(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
 }
 
 void RenderpassSubpass2::cmdEndRenderPass (const DeviceInterface&      vk,
@@ -363,7 +363,7 @@ void RenderpassSubpass2::cmdEndRenderPass (const DeviceInterface&   vk,
 {
        DE_ASSERT(pSubpassEndInfo != DE_NULL);
 
-       vk.cmdEndRenderPass2KHR(cmdBuffer, pSubpassEndInfo);
+       vk.cmdEndRenderPass2(cmdBuffer, pSubpassEndInfo);
 }
 
 // For internal to RP/RP2 conversions
@@ -614,7 +614,7 @@ const std::vector<VkInputAttachmentAspectReference>& RenderPass::getInputAspects
 template <typename AttachmentDesc>
 AttachmentDesc createAttachmentDescription (const Attachment& attachment)
 {
-       const AttachmentDesc attachmentDescription      //  VkAttachmentDescription                                                     ||  VkAttachmentDescription2KHR
+       const AttachmentDesc attachmentDescription      //  VkAttachmentDescription                                                     ||  VkAttachmentDescription2
        (
                                                                                                //                                                                                                      ||  VkStructureType                                     sType;
                DE_NULL,                                                                //                                                                                                      ||  const void*                                         pNext;
@@ -635,7 +635,7 @@ AttachmentDesc createAttachmentDescription (const Attachment& attachment)
 template <typename AttachmentRef>
 AttachmentRef createAttachmentReference (const AttachmentReference& referenceInfo)
 {
-       const AttachmentRef     reference               //  VkAttachmentReference                               ||  VkAttachmentReference2KHR
+       const AttachmentRef     reference               //  VkAttachmentReference                               ||  VkAttachmentReference2
        (
                                                                                //                                                                              ||  VkStructureType                             sType;
                DE_NULL,                                                //                                                                              ||  const void*                                 pNext;
@@ -674,7 +674,7 @@ SubpassDesc createSubpassDescription (const Subpass&                                subpass,
        DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size());
 
        {
-               const SubpassDesc subpassDescription                                                                                                            //  VkSubpassDescription                                                                                ||  VkSubpassDescription2KHR
+               const SubpassDesc subpassDescription                                                                                                            //  VkSubpassDescription                                                                                ||  VkSubpassDescription2
                (
                                                                                                                                                                                                        //                                                                                                                              ||  VkStructureType                                             sType;
                        DE_NULL,                                                                                                                                                                //                                                                                                                              ||  const void*                                                 pNext;
@@ -682,11 +682,11 @@ SubpassDesc createSubpassDescription (const Subpass&                              subpass,
                        subpass.getPipelineBindPoint(),                                                                                                                 //  VkPipelineBindPoint                         pipelineBindPoint;                      ||  VkPipelineBindPoint                                 pipelineBindPoint;
                        0u,                                                                                                                                                                             //                                                                                                                              ||  deUint32                                                    viewMask;
                        (deUint32)inputAttachmentReferences.size(),                                                                                             //  deUint32                                            inputAttachmentCount;           ||  deUint32                                                    inputAttachmentCount;
-                       inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0],                    //  const VkAttachmentReference*        pInputAttachments;                      ||  const VkAttachmentReference2KHR*    pInputAttachments;
+                       inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0],                    //  const VkAttachmentReference*        pInputAttachments;                      ||  const VkAttachmentReference2*               pInputAttachments;
                        (deUint32)colorAttachmentReferences.size(),                                                                                             //  deUint32                                            colorAttachmentCount;           ||  deUint32                                                    colorAttachmentCount;
-                       colorAttachmentReferences.empty() ? DE_NULL :  &colorAttachmentReferences[0],                   //  const VkAttachmentReference*        pColorAttachments;                      ||  const VkAttachmentReference2KHR*    pColorAttachments;
-                       resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0],                //  const VkAttachmentReference*        pResolveAttachments;            ||  const VkAttachmentReference2KHR*    pResolveAttachments;
-                       &depthStencilAttachmentReferences[0],                                                                                                   //  const VkAttachmentReference*        pDepthStencilAttachment;        ||  const VkAttachmentReference2KHR*    pDepthStencilAttachment;
+                       colorAttachmentReferences.empty() ? DE_NULL :  &colorAttachmentReferences[0],                   //  const VkAttachmentReference*        pColorAttachments;                      ||  const VkAttachmentReference2*               pColorAttachments;
+                       resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0],                //  const VkAttachmentReference*        pResolveAttachments;            ||  const VkAttachmentReference2*               pResolveAttachments;
+                       &depthStencilAttachmentReferences[0],                                                                                                   //  const VkAttachmentReference*        pDepthStencilAttachment;        ||  const VkAttachmentReference2*               pDepthStencilAttachment;
                        (deUint32)preserveAttachmentReferences->size(),                                                                                 //  deUint32                                            preserveAttachmentCount;        ||  deUint32                                                    preserveAttachmentCount;
                        preserveAttachmentReferences->empty() ? DE_NULL : &(*preserveAttachmentReferences)[0]   //  const deUint32*                                     pPreserveAttachments;           ||  const deUint32*                                             pPreserveAttachments;
                );
@@ -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                                         ||  VkSubpassDependency2KHR
-       (
-                                                                                       //                                                                                      ||      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,20 +783,33 @@ 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                                                              ||  VkRenderPassCreateInfo2KHR
+       const RenderPassCreateInfo      renderPassCreator                               //  VkRenderPassCreateInfo                                                              ||  VkRenderPassCreateInfo2
        (
                                                                                                                                //  VkStructureType                                     sType;                          ||  VkStructureType                                             sType;
                inputAspectCreateInfo.get(),                                                    //  const void*                                         pNext;                          ||  const void*                                                 pNext;
                (VkRenderPassCreateFlags)0u,                                                    //  VkRenderPassCreateFlags                     flags;                          ||  VkRenderPassCreateFlags                             flags;
                (deUint32)attachments.size(),                                                   //  deUint32                                            attachmentCount;        ||  deUint32                                                    attachmentCount;
-               (attachments.empty() ? DE_NULL : &attachments[0]),              //  const VkAttachmentDescription*      pAttachments;           ||  const VkAttachmentDescription2KHR*  pAttachments;
+               (attachments.empty() ? DE_NULL : &attachments[0]),              //  const VkAttachmentDescription*      pAttachments;           ||  const VkAttachmentDescription2*             pAttachments;
                (deUint32)subpasses.size(),                                                             //  deUint32                                            subpassCount;           ||  deUint32                                                    subpassCount;
-               (subpasses.empty() ? DE_NULL : &subpasses[0]),                  //  const VkSubpassDescription*         pSubpasses;                     ||  const VkSubpassDescription2KHR*             pSubpasses;
+               (subpasses.empty() ? DE_NULL : &subpasses[0]),                  //  const VkSubpassDescription*         pSubpasses;                     ||  const VkSubpassDescription2*                pSubpasses;
                (deUint32)dependencies.size(),                                                  //  deUint32                                            dependencyCount;        ||  deUint32                                                    dependencyCount;
-               (dependencies.empty() ? DE_NULL : &dependencies[0]),    //  const VkSubpassDependency*          pDependencies;          ||  const VkSubpassDependency2KHR*              pDependencies;
+               (dependencies.empty() ? DE_NULL : &dependencies[0]),    //  const VkSubpassDependency*          pDependencies;          ||  const VkSubpassDependency2*                 pDependencies;
                0u,                                                                                                             //                                                                                                              ||  deUint32                                                    correlatedViewMaskCount;
                DE_NULL                                                                                                 //                                                                                                              ||  const deUint32*                                             pCorrelatedViewMasks;
        );
@@ -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");
        }