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
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
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_)
{
}
UVec2 imageSize;
vector<RenderPass> renderPasses;
RenderPassType renderPassType;
+ SynchronizationType synchronizationType;
deUint32 blurKernel;
};
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,
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;
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())
, 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))
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;
}
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++)
{
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());
}
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));
}
}
+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)
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 || VkRenderPassCreateInfo2
(
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");
}
RENDERPASS_TYPE_RENDERPASS2,
};
+enum SynchronizationType
+{
+ SYNCHRONIZATION_TYPE_LEGACY = 0,
+ SYNCHRONIZATION_TYPE_SYNCHRONIZATION2,
+};
+
class AttachmentDescription1 : public vk::VkAttachmentDescription
{
public:
Move<VkRenderPass> createRenderPass (const DeviceInterface& vk,
VkDevice device,
const RenderPass& renderPassInfo,
- const RenderPassType renderPassType);
+ RenderPassType renderPassType,
+ SynchronizationType synchronizationType = SYNCHRONIZATION_TYPE_LEGACY);
} // renderpass
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