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_;
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_;
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_;
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_;
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_;
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_,
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_;
}
SubpassEndInfo2::SubpassEndInfo2 (const void* pNext_)
{
- sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR;
+ sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO;
pNext = pNext_;
}
const VkRenderPassBeginInfo* pRenderPassBegin,
const SubpassBeginInfo* pSubpassBeginInfo)
{
- vk.cmdBeginRenderPass2KHR(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ vk.cmdBeginRenderPass2(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
}
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,
{
DE_ASSERT(pSubpassEndInfo != DE_NULL);
- vk.cmdEndRenderPass2KHR(cmdBuffer, pSubpassEndInfo);
+ vk.cmdEndRenderPass2(cmdBuffer, pSubpassEndInfo);
}
// For internal to RP/RP2 conversions
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;
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;
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;
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;
);
}
}
+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)
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));
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;
);
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");
}