VkDependencyFlags getFlags (void) const { return m_flags; }
+ void setSrcAccessMask (const VkAccessFlags& flags) { m_srcAccessMask = flags; }
+ void setDstAccessMask (const VkAccessFlags& flags) { m_dstAccessMask = flags; }
+
private:
deUint32 m_srcPass;
deUint32 m_dstPass;
if (lastUseOfAttachment[colorAttachmentIndex])
{
deBool foundDuplicate = false;
- const VkDependencyFlags dependencyFlags = rng.getBool() ? (VkDependencyFlags) VK_DEPENDENCY_BY_REGION_BIT : 0u;
- for (const SubpassDependency& dependency : deps)
- {
- if (dependency.getSrcPass() == *lastUseOfAttachment[colorAttachmentIndex]
- && dependency.getDstPass() == subpassIndex
- && dependency.getSrcAccessMask() == VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
- && dependency.getFlags() == dependencyFlags)
- {
- foundDuplicate = true;
- break;
- }
- }
+ const deUint32 srcPass = *lastUseOfAttachment[colorAttachmentIndex];
+ const deUint32 dstPass = subpassIndex;
+ const VkDependencyFlags dependencyFlags = rng.getBool() ? (VkDependencyFlags) VK_DEPENDENCY_BY_REGION_BIT : 0u;
- if (!foundDuplicate)
- {
- deps.push_back(SubpassDependency(*lastUseOfAttachment[colorAttachmentIndex], subpassIndex,
+ const SubpassDependency newDependency(srcPass, dstPass,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
- dependencyFlags));
- }
+ dependencyFlags);
- lastUseOfAttachment[colorAttachmentIndex] = just(subpassIndex);
+ for (SubpassDependency& dependency : deps)
+ {
+ if (dependency.getSrcPass() == srcPass && dependency.getDstPass() == dstPass)
+ {
+ const VkAccessFlags newDstFlags = dependency.getDstAccessMask() | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
+ dependency.setDstAccessMask(newDstFlags);
+ foundDuplicate = true;
+ break;
+ }
+ }
- colorAttachmentReferences.push_back(AttachmentReference((deUint32)subpassColorAttachments[colorAttachmentNdx], VK_IMAGE_LAYOUT_GENERAL));
+ if (!foundDuplicate)
+ {
+ deps.push_back(newDependency);
+ }
}
+
+ lastUseOfAttachment[colorAttachmentIndex] = just(subpassIndex);
+
+ colorAttachmentReferences.push_back(AttachmentReference((deUint32)subpassColorAttachments[colorAttachmentNdx], VK_IMAGE_LAYOUT_GENERAL));
}
for (size_t inputAttachmentNdx = 0; inputAttachmentNdx < subpassInputAttachments.size(); inputAttachmentNdx++)
if(lastUseOfAttachment[inputAttachmentIndex])
{
deBool foundDuplicate = false;
- const VkDependencyFlags dependencyFlags = (*lastUseOfAttachment[inputAttachmentIndex] == subpassIndex) || rng.getBool();
- for (const SubpassDependency& dependency : deps)
+ const deUint32 srcPass = *lastUseOfAttachment[inputAttachmentIndex];
+ const deUint32 dstPass = subpassIndex;
+ const VkDependencyFlags dependencyFlags = ((srcPass == subpassIndex) || rng.getBool()) ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u;
+
+ const SubpassDependency newDependency(srcPass, dstPass,
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+ | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+ | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+ | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+ | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
+
+ dependencyFlags);
+ for (SubpassDependency& dependency : deps)
{
- if (dependency.getSrcPass() == *lastUseOfAttachment[inputAttachmentIndex]
- && dependency.getDstPass()== subpassIndex
- && dependency.getSrcAccessMask() == (VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
- && dependency.getFlags() == dependencyFlags)
+ if (dependency.getSrcPass() == srcPass && dependency.getDstPass() == dstPass)
{
+ const VkAccessFlags newSrcFlags = dependency.getSrcAccessMask() | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ const VkAccessFlags newDstFlags = dependency.getDstAccessMask() | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
+ dependency.setDstAccessMask(newSrcFlags);
+ dependency.setDstAccessMask(newDstFlags);
foundDuplicate = true;
break;
}
if (!foundDuplicate)
{
- deps.push_back(SubpassDependency(*lastUseOfAttachment[inputAttachmentIndex], subpassIndex,
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
- | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
- | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
- | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
-
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
- | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
- | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
- | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
-
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
-
- dependencyFlags));
+ deps.push_back(newDependency);
}
lastUseOfAttachment[inputAttachmentIndex] = just(subpassIndex);
}
}
- if (depthStencilAttachment && lastUseOfAttachment[*depthStencilAttachment])
+ if (depthStencilAttachment)
{
- deBool foundDuplicate = false;
- const VkDependencyFlags dependencyFlags = (*lastUseOfAttachment[*depthStencilAttachment] == subpassIndex) || rng.getBool();
-
- for (const SubpassDependency& dependency : deps)
+ if (lastUseOfAttachment[*depthStencilAttachment])
{
- if (dependency.getSrcPass() == *lastUseOfAttachment[*depthStencilAttachment]
- && dependency.getDstPass() == subpassIndex
- && dependency.getSrcAccessMask() == (VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
- && dependency.getFlags() == dependencyFlags)
- {
- foundDuplicate = true;
- break;
- }
- }
+ deBool foundDuplicate = false;
- if (!foundDuplicate)
- {
- deps.push_back(SubpassDependency(*lastUseOfAttachment[*depthStencilAttachment], subpassIndex,
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
- | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
- | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
- | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+ const deUint32 srcPass = *lastUseOfAttachment[*depthStencilAttachment];
+ const deUint32 dstPass = subpassIndex;
+ const VkDependencyFlags dependencyFlags = ((srcPass == subpassIndex) || rng.getBool()) ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u;
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
- | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
- | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
- | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+ const SubpassDependency newDependency(srcPass, dstPass,
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+ | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+ | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
- VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+ | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+ | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
+
+ dependencyFlags);
+ for (SubpassDependency& dependency : deps)
+ {
+ if (dependency.getSrcPass() == srcPass && dependency.getDstPass() == dstPass)
+ {
+ const VkAccessFlags newSrcFlags = dependency.getSrcAccessMask() | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ const VkAccessFlags newDstFlags = dependency.getDstAccessMask() | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
+ dependency.setDstAccessMask(newSrcFlags);
+ dependency.setDstAccessMask(newDstFlags);
+ foundDuplicate = true;
+ break;
+ }
+ }
- dependencyFlags));
+ if (!foundDuplicate)
+ {
+ deps.push_back(newDependency);
+ }
}
lastUseOfAttachment[*depthStencilAttachment] = just(subpassIndex);
AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
vector<deUint32>()));
}
+ for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
+ {
+ vector<AttachmentReference> colorAttachmentReferences;
+
+ for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
+ {
+ const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayoutsColor), DE_ARRAY_END(subpassLayoutsColor));
+
+ colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
+ }
+
+ subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
+ vector<AttachmentReference>(),
+ colorAttachmentReferences,
+ vector<AttachmentReference>(),
+ AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
+ vector<deUint32>()));
+ }
}
else if (allocationType == ALLOCATIONTYPE_IO_CHAIN)
{