Use MemoryBarrier2 in SubpassDependency2 chain
authorPiotr Byszewski <piotr.byszewski@mobica.com>
Fri, 20 Nov 2020 15:49:14 +0000 (16:49 +0100)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Tue, 16 Feb 2021 08:21:06 +0000 (08:21 +0000)
VK_KHR_synchronization2 allows VkMemoryBarrier2KHR to be
provided in the pNext chain of a VkSubpassDependency2.

Components: Vulkan

VK-GL-CTS issue: 2365

New tests:
dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.*_sync_2

Affects:
dEQP-VK.renderpass*

Change-Id: I0f7a7cb76064b0e6e565e1f716e2acd0e17c7041

android/cts/master/vk-master-2020-03-01.txt
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp
external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.cpp
external/vulkancts/modules/vulkan/renderpass/vktRenderPassTestsUtil.hpp
external/vulkancts/mustpass/master/vk-default.txt

index 2154d4a..e558e30 100644 (file)
@@ -177618,6 +177618,15 @@ dEQP-VK.renderpass2.suballocation.multisample_resolve.r32g32b32a32_sfloat.max_at
 dEQP-VK.renderpass2.suballocation.multisample_resolve.r32g32b32a32_sfloat.max_attachments_8_samples_8
 dEQP-VK.renderpass2.suballocation.multisample_resolve.r32g32b32a32_sfloat.max_attachments_16_samples_8
 dEQP-VK.renderpass2.suballocation.multisample_resolve.r32g32b32a32_sfloat.compatibility_samples_8
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_2_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_3_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_5_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_2_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_3_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_5_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_2_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_3_sync_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_5_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.self_dependency.render_size_64_64.geometry_to_indirectdraw
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.self_dependency.render_size_128_128.geometry_to_indirectdraw
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.self_dependency.render_size_512_512.geometry_to_indirectdraw
index 9fba3ab..599a45d 100644 (file)
@@ -471987,14 +471987,23 @@ dEQP-VK.renderpass2.suballocation.multisample_resolve.layers_6.r32g32b32a32_sint
 dEQP-VK.renderpass2.suballocation.multisample_resolve.layers_6.r32g32b32a32_sfloat.samples_2
 dEQP-VK.renderpass2.suballocation.multisample_resolve.layers_6.r32g32b32a32_sfloat.samples_4
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_2_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_3
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_3_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_5
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_5_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_2_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_3
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_3_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_5
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_5_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_2_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_3
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_3_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_5
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_5_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.implicit_dependencies.render_passes_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.implicit_dependencies.render_passes_3
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.implicit_dependencies.render_passes_5
index 0a467bb..748f7f3 100644 (file)
@@ -381,16 +381,18 @@ vector<SharedPtrVkDescriptorPool> createDescriptorPools (const DeviceInterface&
 
 struct ExternalTestConfig
 {
-       ExternalTestConfig      (VkFormat                       format_,
-                                                UVec2                          imageSize_,
-                                                vector<RenderPass>     renderPasses_,
-                                                RenderPassType         renderPassType_,
-                                                deUint32                       blurKernel_ = 4)
-               : format                        (format_)
-               , imageSize                     (imageSize_)
-               , renderPasses          (renderPasses_)
-               , renderPassType        (renderPassType_)
-               , blurKernel            (blurKernel_)
+       ExternalTestConfig      (VkFormat                               format_,
+                                                UVec2                                  imageSize_,
+                                                vector<RenderPass>             renderPasses_,
+                                                RenderPassType                 renderPassType_,
+                                                SynchronizationType    synchronizationType_,
+                                                deUint32                               blurKernel_ = 4)
+               : format                                (format_)
+               , imageSize                             (imageSize_)
+               , renderPasses                  (renderPasses_)
+               , renderPassType                (renderPassType_)
+               , synchronizationType   (synchronizationType_)
+               , blurKernel                    (blurKernel_)
        {
        }
 
@@ -398,6 +400,7 @@ struct ExternalTestConfig
        UVec2                           imageSize;
        vector<RenderPass>      renderPasses;
        RenderPassType          renderPassType;
+       SynchronizationType     synchronizationType;
        deUint32                        blurKernel;
 };
 
@@ -424,9 +427,10 @@ public:
        vector<SharedPtrVkRenderPass>                   createRenderPasses                              (const DeviceInterface&                                 vkd,
                                                                                                                                                         VkDevice                                                               device,
                                                                                                                                                         vector<RenderPass>                                             renderPassInfos,
-                                                                                                                                                        const RenderPassType                                   renderPassType);
+                                                                                                                                                        const RenderPassType                                   renderPassType,
+                                                                                                                                                        const SynchronizationType                              synchronizationType);
 
-        vector<SharedPtrVkFramebuffer>                 createFramebuffers                              (const DeviceInterface&                                 vkd,
+       vector<SharedPtrVkFramebuffer>                  createFramebuffers                              (const DeviceInterface&                                 vkd,
                                                                                                                                                         VkDevice                                                               device,
                                                                                                                                                         vector<SharedPtrVkRenderPass>&                 renderPasses,
                                                                                                                                                         vector<SharedPtrVkImageView>&                  dstImageViews,
@@ -459,7 +463,8 @@ public:
        tcu::TestStatus                                                 iterateInternal                                 (void);
 
 private:
-       const bool                                                              m_extensionSupported;
+       const bool                                                              m_renderPass2Supported;
+       const bool                                                              m_synchronization2Supported;
        const RenderPassType                                    m_renderPassType;
 
        const deUint32                                                  m_width;
@@ -491,7 +496,8 @@ private:
 
 ExternalDependencyTestInstance::ExternalDependencyTestInstance (Context& context, ExternalTestConfig testConfig)
        : TestInstance                                  (context)
-       , m_extensionSupported                  ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
+       , m_renderPass2Supported                ((testConfig.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceFunctionality("VK_KHR_create_renderpass2"))
+       , m_synchronization2Supported   ((testConfig.synchronizationType == SYNCHRONIZATION_TYPE_SYNCHRONIZATION2) && context.requireDeviceFunctionality("VK_KHR_synchronization2"))
        , m_renderPassType                              (testConfig.renderPassType)
        , m_width                                               (testConfig.imageSize.x())
        , m_height                                              (testConfig.imageSize.y())
@@ -502,7 +508,7 @@ ExternalDependencyTestInstance::ExternalDependencyTestInstance (Context& context
        , m_samplers                                    (createSamplers(context.getDeviceInterface(), context.getDevice(), testConfig.renderPasses))
        , m_dstBuffer                                   (createBuffer(context.getDeviceInterface(), context.getDevice(), m_format, m_width, m_height))
        , m_dstBufferMemory                             (createBufferMemory(context.getDeviceInterface(), context.getDevice(), context.getDefaultAllocator(), *m_dstBuffer))
-       , m_renderPasses                                (createRenderPasses(context.getDeviceInterface(), context.getDevice(), testConfig.renderPasses, testConfig.renderPassType))
+       , m_renderPasses                                (createRenderPasses(context.getDeviceInterface(), context.getDevice(), testConfig.renderPasses, testConfig.renderPassType, testConfig.synchronizationType))
        , m_framebuffers                                (createFramebuffers(context.getDeviceInterface(), context.getDevice(), m_renderPasses, m_imageViews, m_width, m_height))
        , m_subpassDescriptorSetLayouts (createDescriptorSetLayouts(context.getDeviceInterface(), context.getDevice(), m_samplers))
        , m_subpassDescriptorPools              (createDescriptorPools(context.getDeviceInterface(), context.getDevice(), m_subpassDescriptorSetLayouts, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER))
@@ -606,14 +612,14 @@ vector<SharedPtrVkSampler> ExternalDependencyTestInstance::createSamplers (const
 vector<SharedPtrVkRenderPass> ExternalDependencyTestInstance::createRenderPasses (const DeviceInterface&       vkd,
                                                                                                                                                                  VkDevice                                      device,
                                                                                                                                                                  vector<RenderPass>            renderPassInfos,
-                                                                                                                                                                 const RenderPassType          renderPassType)
+                                                                                                                                                                 const RenderPassType          renderPassType,
+                                                                                                                                                                 const SynchronizationType     synchronizationType)
 {
        vector<SharedPtrVkRenderPass> renderPasses;
+       renderPasses.reserve(renderPassInfos.size());
 
-       for (size_t renderPassNdx = 0; renderPassNdx < renderPassInfos.size(); renderPassNdx++)
-       {
-               renderPasses.push_back(makeSharedPtr(createRenderPass(vkd, device, renderPassInfos[renderPassNdx], renderPassType)));
-       }
+       for (const auto& renderPassInfo : renderPassInfos)
+               renderPasses.push_back(makeSharedPtr(createRenderPass(vkd, device, renderPassInfo, renderPassType, synchronizationType)));
 
        return renderPasses;
 }
@@ -3885,8 +3891,8 @@ void initTests (tcu::TestCaseGroup* group, const RenderPassType renderPassType)
 
                for (size_t renderSizeNdx = 0; renderSizeNdx < DE_LENGTH_OF_ARRAY(renderSizes); renderSizeNdx++)
                {
-                       string groupName        ("render_size_" + de::toString(renderSizes[renderSizeNdx].x()) + "_" + de::toString(renderSizes[renderSizeNdx].y()));
-                       de::MovePtr<tcu::TestCaseGroup> renderSizeGroup (new tcu::TestCaseGroup(testCtx, groupName.c_str(), groupName.c_str()));
+                       string groupName ("render_size_" + de::toString(renderSizes[renderSizeNdx].x()) + "_" + de::toString(renderSizes[renderSizeNdx].y()));
+                       de::MovePtr<tcu::TestCaseGroup> renderSizeGroup (new tcu::TestCaseGroup(testCtx, groupName.c_str(), groupName.c_str()));
 
                        for (size_t renderPassCountNdx = 0; renderPassCountNdx < DE_LENGTH_OF_ARRAY(renderPassCounts); renderPassCountNdx++)
                        {
@@ -3936,11 +3942,25 @@ void initTests (tcu::TestCaseGroup* group, const RenderPassType renderPassType)
                                        renderPasses.push_back(renderPass);
                                }
 
-                               const deUint32                          blurKernel      (12u);
-                               const ExternalTestConfig        testConfig      (VK_FORMAT_R8G8B8A8_UNORM, renderSizes[renderSizeNdx], renderPasses, renderPassType, blurKernel);
-                               const string                            testName        ("render_passes_" + de::toString(renderPassCounts[renderPassCountNdx]));
+                               const deUint32          blurKernel      (12u);
+                               string                          testName        ("render_passes_" + de::toString(renderPassCounts[renderPassCountNdx]));
+                               ExternalTestConfig      testConfig
+                               {
+                                       VK_FORMAT_R8G8B8A8_UNORM,
+                                       renderSizes[renderSizeNdx],
+                                       renderPasses,
+                                       renderPassType,
+                                       SYNCHRONIZATION_TYPE_LEGACY,
+                                       blurKernel
+                               };
 
                                renderSizeGroup->addChild(new InstanceFactory1<ExternalDependencyTestInstance, ExternalTestConfig, ExternalPrograms>(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName.c_str(), testName.c_str(), testConfig));
+                               if (renderPassType == RENDERPASS_TYPE_RENDERPASS2)
+                               {
+                                       testName += "_sync_2";
+                                       testConfig.synchronizationType = SYNCHRONIZATION_TYPE_SYNCHRONIZATION2;
+                                       renderSizeGroup->addChild(new InstanceFactory1<ExternalDependencyTestInstance, ExternalTestConfig, ExternalPrograms>(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName.c_str(), testName.c_str(), testConfig));
+                               }
                        }
 
                        externalGroup->addChild(renderSizeGroup.release());
@@ -4002,7 +4022,7 @@ void initTests (tcu::TestCaseGroup* group, const RenderPassType renderPassType)
                        }
 
                        const deUint32                          blurKernel      (12u);
-                       const ExternalTestConfig        testConfig      (VK_FORMAT_R8G8B8A8_UNORM, UVec2(128, 128), renderPasses, renderPassType, blurKernel);
+                       const ExternalTestConfig        testConfig      (VK_FORMAT_R8G8B8A8_UNORM, UVec2(128, 128), renderPasses, renderPassType, SYNCHRONIZATION_TYPE_LEGACY, blurKernel);
                        const string                            testName        ("render_passes_" + de::toString(renderPassCounts[renderPassCountNdx]));
 
                        implicitGroup->addChild(new InstanceFactory1<ExternalDependencyTestInstance, ExternalTestConfig, ExternalPrograms>(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName.c_str(), testName.c_str(), testConfig));
index 90d2da6..1ba834d 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)
+                                                                        RenderPassType                 renderPassType,
+                                                                        SynchronizationType    synchronizationType)
 {
        switch (renderPassType)
        {
                case RENDERPASS_TYPE_LEGACY:
-                       return createRenderPass<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>(vk, device, renderPassInfo);
+                       return createRenderPass<AttachmentDescription1,
+                                                                       AttachmentReference1,
+                                                                       SubpassDescription1,
+                                                                       SubpassDependency1,
+                                                                       RenderPassCreateInfo1>(vk, device, renderPassInfo, SYNCHRONIZATION_TYPE_LEGACY);
                case RENDERPASS_TYPE_RENDERPASS2:
-                       return createRenderPass<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>(vk, device, renderPassInfo);
+                       return createRenderPass<AttachmentDescription2,
+                                                                       AttachmentReference2,
+                                                                       SubpassDescription2,
+                                                                       SubpassDependency2,
+                                                                       RenderPassCreateInfo2>(vk, device, renderPassInfo, synchronizationType);
                default:
                        TCU_THROW(InternalError, "Impossible");
        }
index 7ec2510..7d17222 100644 (file)
@@ -44,6 +44,12 @@ enum RenderPassType
        RENDERPASS_TYPE_RENDERPASS2,
 };
 
+enum SynchronizationType
+{
+       SYNCHRONIZATION_TYPE_LEGACY = 0,
+       SYNCHRONIZATION_TYPE_SYNCHRONIZATION2,
+};
+
 class AttachmentDescription1 : public vk::VkAttachmentDescription
 {
 public:
@@ -415,7 +421,8 @@ private:
 Move<VkRenderPass> createRenderPass (const DeviceInterface&    vk,
                                                                         VkDevice                               device,
                                                                         const RenderPass&              renderPassInfo,
-                                                                        const RenderPassType   renderPassType);
+                                                                        RenderPassType                 renderPassType,
+                                                                        SynchronizationType    synchronizationType = SYNCHRONIZATION_TYPE_LEGACY);
 
 } // renderpass
 
index 6e54d77..2e36446 100644 (file)
@@ -472021,14 +472021,23 @@ dEQP-VK.renderpass2.suballocation.multisample_resolve.layers_6.r32g32b32a32_sint
 dEQP-VK.renderpass2.suballocation.multisample_resolve.layers_6.r32g32b32a32_sfloat.samples_2
 dEQP-VK.renderpass2.suballocation.multisample_resolve.layers_6.r32g32b32a32_sfloat.samples_4
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_2_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_3
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_3_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_5
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_64_64.render_passes_5_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_2_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_3
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_3_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_5
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_128_128.render_passes_5_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_2
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_2_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_3
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_3_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_5
+dEQP-VK.renderpass2.suballocation.subpass_dependencies.external_subpass.render_size_512_512.render_passes_5_sync_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.implicit_dependencies.render_passes_2
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.implicit_dependencies.render_passes_3
 dEQP-VK.renderpass2.suballocation.subpass_dependencies.implicit_dependencies.render_passes_5