DE_FATAL("Unknown stage");
}
+void removeIllegalAccessFlags (vk::VkAccessFlags& accessflags, vk::VkPipelineStageFlags stageflags)
+{
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT))
+ accessflags &= ~vk::VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_VERTEX_INPUT_BIT))
+ accessflags &= ~vk::VK_ACCESS_INDEX_READ_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_VERTEX_INPUT_BIT))
+ accessflags &= ~vk::VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
+
+ if (!(stageflags & (vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)))
+ accessflags &= ~vk::VK_ACCESS_UNIFORM_READ_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT))
+ accessflags &= ~vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
+
+ if (!(stageflags & (vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)))
+ accessflags &= ~vk::VK_ACCESS_SHADER_READ_BIT;
+
+ if (!(stageflags & (vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)))
+ accessflags &= ~vk::VK_ACCESS_SHADER_WRITE_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT))
+ accessflags &= ~vk::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT))
+ accessflags &= ~vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+
+ if (!(stageflags & (vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT)))
+ accessflags &= ~vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
+
+ if (!(stageflags & (vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT)))
+ accessflags &= ~vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_TRANSFER_BIT))
+ accessflags &= ~vk::VK_ACCESS_TRANSFER_READ_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_TRANSFER_BIT))
+ accessflags &= ~vk::VK_ACCESS_TRANSFER_WRITE_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_HOST_BIT))
+ accessflags &= ~vk::VK_ACCESS_HOST_READ_BIT;
+
+ if (!(stageflags & vk::VK_PIPELINE_STAGE_HOST_BIT))
+ accessflags &= ~vk::VK_ACCESS_HOST_WRITE_BIT;
+}
+
void applyOp (State& state, const Memory& memory, Op op, Usage usage)
{
switch (op)
if (!srcStages)
srcStages = dstStages;
+ removeIllegalAccessFlags(dstAccesses, dstStages);
+ removeIllegalAccessFlags(srcAccesses, srcStages);
+
if (srcLayout == vk::VK_IMAGE_LAYOUT_UNDEFINED)
state.imageDefined = false;
if (!srcStages)
srcStages = dstStages;
+ removeIllegalAccessFlags(dstAccesses, dstStages);
+ removeIllegalAccessFlags(srcAccesses, srcStages);
+
state.commandBufferIsEmpty = false;
state.cache.barrier(srcStages, srcAccesses, dstStages, dstAccesses);
break;
if (!srcStages)
srcStages = dstStages;
+ removeIllegalAccessFlags(dstAccesses, dstStages);
+ removeIllegalAccessFlags(srcAccesses, srcStages);
+
return de::MovePtr<CmdCommand>(new ImageTransition(srcStages, srcAccesses, dstStages, dstAccesses, srcLayout, dstLayout));
}
if (!srcStages)
srcStages = dstStages;
+ removeIllegalAccessFlags(dstAccesses, dstStages);
+ removeIllegalAccessFlags(srcAccesses, srcStages);
+
PipelineBarrier::Type type;
if (op == OP_PIPELINE_BARRIER_IMAGE)