Added constraints for random access flags
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / memory / vktMemoryPipelineBarrierTests.cpp
index 7069ef4..c62db51 100644 (file)
@@ -8345,6 +8345,71 @@ void getAvailableOps (const State& state, bool supportsBuffers, bool supportsIma
                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)
@@ -8486,6 +8551,9 @@ void applyOp (State& state, const Memory& memory, Op op, Usage usage)
                        if (!srcStages)
                                srcStages = dstStages;
 
+                       removeIllegalAccessFlags(dstAccesses, dstStages);
+                       removeIllegalAccessFlags(srcAccesses, srcStages);
+
                        if (srcLayout == vk::VK_IMAGE_LAYOUT_UNDEFINED)
                                state.imageDefined = false;
 
@@ -8615,6 +8683,9 @@ void applyOp (State& state, const Memory& memory, Op op, Usage usage)
                        if (!srcStages)
                                srcStages = dstStages;
 
+                       removeIllegalAccessFlags(dstAccesses, dstStages);
+                       removeIllegalAccessFlags(srcAccesses, srcStages);
+
                        state.commandBufferIsEmpty = false;
                        state.cache.barrier(srcStages, srcAccesses, dstStages, dstAccesses);
                        break;
@@ -8804,6 +8875,9 @@ de::MovePtr<CmdCommand> createCmdCommand (de::Random&     rng,
                        if (!srcStages)
                                srcStages = dstStages;
 
+                       removeIllegalAccessFlags(dstAccesses, dstStages);
+                       removeIllegalAccessFlags(srcAccesses, srcStages);
+
                        return de::MovePtr<CmdCommand>(new ImageTransition(srcStages, srcAccesses, dstStages, dstAccesses, srcLayout, dstLayout));
                }
 
@@ -8853,6 +8927,9 @@ de::MovePtr<CmdCommand> createCmdCommand (de::Random&     rng,
                        if (!srcStages)
                                srcStages = dstStages;
 
+                       removeIllegalAccessFlags(dstAccesses, dstStages);
+                       removeIllegalAccessFlags(srcAccesses, srcStages);
+
                        PipelineBarrier::Type type;
 
                        if (op == OP_PIPELINE_BARRIER_IMAGE)