Added constraints for random access flags
authorJari Komppa <jari.komppa@siru.fi>
Tue, 14 Nov 2017 12:21:06 +0000 (14:21 +0200)
committerJari Komppa <jari.komppa@siru.fi>
Wed, 22 Nov 2017 12:26:14 +0000 (14:26 +0200)
The pipeline barrier tests randomize access flags and stages, sometimes
resulting in access flags being enabled for stages that do not support
said accesses. This fix removes the illegal access flags while leaving
the random flag generation intact.

Affects:

dEQP-VK.memory.pipeline_barrier.*

Components: Vulkan

VK-GL-CTS issue: 814

Change-Id: I135ea8a9e41b5d8428ef77fe6ecbdf2380d80c7d

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)