Test not writing to the Position built-in
New set of tests to check nothing breaks if a vertex processing shader
stage does not write to the position built-in.
New tests:
dEQP-VK.pipeline.no_position.*
Components: Vulkan
VK-GL-CTS issue: 2664
Change-Id: If2bb6d704937d5bbf828f253fd5094990fc432b5
diff --git a/AndroidGen.mk b/AndroidGen.mk
index b0407c2..0f269f5 100644
--- a/AndroidGen.mk
+++ b/AndroidGen.mk
@@ -236,6 +236,7 @@
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.cpp \
+ external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelinePushConstantTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineReferenceRenderer.cpp \
diff --git a/android/cts/master/vk-master-2020-03-01.txt b/android/cts/master/vk-master-2020-03-01.txt
index 20d6f72..6a78c45 100644
--- a/android/cts/master/vk-master-2020-03-01.txt
+++ b/android/cts/master/vk-master-2020-03-01.txt
@@ -155375,6 +155375,246 @@
dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_batch_pipelines_explicit_cache
dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_batch_pipelines_no_cache
dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_batch_pipelines_derivative_index
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e1_g1
dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_zero
dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_zero_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_one
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index 42301c2..ce6ab92 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
Binary files differ
diff --git a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
index 1f6ed5e..f71b4ec 100644
--- a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
@@ -100,6 +100,8 @@
vktPipelineExtendedDynamicStateTests.hpp
vktPipelineCreationCacheControlTests.cpp
vktPipelineCreationCacheControlTests.hpp
+ vktPipelineNoPositionTests.cpp
+ vktPipelineNoPositionTests.hpp
)
set(DEQP_VK_PIPELINE_LIBS
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp
new file mode 100644
index 0000000..f90eec4
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp
@@ -0,0 +1,782 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests with shaders that do not write to the Position built-in.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineNoPositionTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkQueryUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vktPipelineImageUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkBuilderUtil.hpp"
+
+#include "tcuVector.hpp"
+#include "tcuTestLog.hpp"
+
+#include "deUniquePtr.hpp"
+
+#include <vector>
+#include <set>
+#include <sstream>
+#include <array>
+
+namespace vkt
+{
+namespace pipeline
+{
+
+namespace
+{
+
+using namespace vk;
+
+enum ShaderStageBits
+{
+ STAGE_VERTEX = (1 << 0),
+ STAGE_TESS_CONTROL = (1 << 1),
+ STAGE_TESS_EVALUATION = (1 << 2),
+ STAGE_GEOMETRY = (1 << 3),
+ STAGE_MASK_COUNT = (1 << 4),
+};
+
+using ShaderStageFlags = deUint32;
+
+constexpr deUint32 kStageCount = 4u;
+
+static_assert((1u << kStageCount) == static_cast<deUint32>(STAGE_MASK_COUNT),
+ "Total stage count does not match stage mask bits");
+
+struct TestParams
+{
+ ShaderStageFlags selectedStages; // Stages that will be present in the pipeline.
+ ShaderStageFlags writeStages; // Subset of selectedStages that will write to the Position built-in.
+ deUint32 numViews; // Number of views for multiview.
+ bool explicitDeclarations; // Explicitly declare the input and output blocks or not.
+ bool useSSBO; // Write to an SSBO from the selected stages.
+
+ // Commonly used checks.
+ bool tessellation (void) const { return (selectedStages & (STAGE_TESS_CONTROL | STAGE_TESS_EVALUATION)); }
+ bool geometry (void) const { return (selectedStages & STAGE_GEOMETRY); }
+};
+
+// Generates the combinations list of stage flags for writeStages when a given subset of stages are selected.
+std::vector<ShaderStageFlags> getWriteSubCases (ShaderStageFlags selectedStages)
+{
+ std::set<ShaderStageFlags> uniqueCases;
+ for (ShaderStageFlags stages = 0; stages < STAGE_MASK_COUNT; ++stages)
+ uniqueCases.insert(stages & selectedStages);
+ return std::vector<ShaderStageFlags>(begin(uniqueCases), end(uniqueCases));
+}
+
+class NoPositionCase : public vkt::TestCase
+{
+public:
+ NoPositionCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~NoPositionCase (void) {}
+
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
+ static tcu::Vec4 getBackGroundColor (void) { return tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f); }
+ static VkFormat getImageFormat (void) { return VK_FORMAT_R8G8B8A8_UNORM; }
+ static VkExtent3D getImageExtent (void) { return makeExtent3D(64u, 64u, 1u); }
+
+private:
+ TestParams m_params;
+};
+
+class NoPositionInstance : public vkt::TestInstance
+{
+public:
+ NoPositionInstance (Context& context, const TestParams& params);
+ virtual ~NoPositionInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+private:
+ TestParams m_params;
+};
+
+NoPositionCase::NoPositionCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (params)
+{
+ DE_ASSERT(params.numViews >= 1u);
+}
+
+void NoPositionCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ // Add shaders for the selected stages and write to gl_Position in the subset of stages marked for writing.
+
+ // Optional writes, extensions and declarations.
+ std::string ssboDecl;
+ std::string extensions;
+ std::string vertSSBOWrite;
+ std::string tescSSBOWrite;
+ std::string teseSSBOWrite;
+ std::string geomSSBOWrite;
+
+ const bool multiview = (m_params.numViews > 1u);
+
+ if (multiview)
+ extensions = "#extension GL_EXT_multiview : require\n";
+
+ if (m_params.useSSBO)
+ {
+ const auto stageCountStr = de::toString(kStageCount);
+ const auto ssboElementCount = kStageCount * m_params.numViews;
+ ssboDecl = "layout (set=0, binding=0, std430) buffer StorageBlock { uint counters[" + de::toString(ssboElementCount) + "]; } ssbo;\n";
+
+ const std::array<std::string*, kStageCount> writeStrings = {{ &vertSSBOWrite, &tescSSBOWrite, &teseSSBOWrite, &geomSSBOWrite }};
+ for (size_t i = 0; i < writeStrings.size(); ++i)
+ *writeStrings[i] = " atomicAdd(ssbo.counters[" + de::toString(i) + (multiview ? (" + uint(gl_ViewIndex) * " + stageCountStr) : "") + "], 1u);\n";
+ }
+
+ if (m_params.selectedStages & STAGE_VERTEX)
+ {
+ std::ostringstream vert;
+ vert
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (location=0) in vec4 in_pos;\n"
+ << (m_params.explicitDeclarations ?
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "};\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << ((m_params.writeStages & STAGE_VERTEX) ? " gl_Position = in_pos;\n" : "")
+ << vertSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vert.str());
+ }
+
+ if (m_params.selectedStages & STAGE_TESS_CONTROL)
+ {
+ std::ostringstream tesc;
+ tesc
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (vertices = 3) out;\n"
+ << (m_params.explicitDeclarations ?
+ "in gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_in[gl_MaxPatchVertices];\n"
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_out[];\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << " gl_TessLevelInner[0] = 1.0;\n"
+ << " gl_TessLevelInner[1] = 1.0;\n"
+ << " gl_TessLevelOuter[0] = 1.0;\n"
+ << " gl_TessLevelOuter[1] = 1.0;\n"
+ << " gl_TessLevelOuter[2] = 1.0;\n"
+ << " gl_TessLevelOuter[3] = 1.0;\n"
+ << "\n"
+ << ((m_params.writeStages & STAGE_TESS_CONTROL) ? " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n" : "")
+ << tescSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("tesc") << glu::TessellationControlSource(tesc.str());
+ }
+
+ if (m_params.selectedStages & STAGE_TESS_EVALUATION)
+ {
+ std::ostringstream tese;
+ tese
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (triangles, fractional_odd_spacing, cw) in;\n"
+ << (m_params.explicitDeclarations ?
+ "in gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_in[gl_MaxPatchVertices];\n"
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "};\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << ((m_params.writeStages & STAGE_TESS_EVALUATION) ?
+ " gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +\n"
+ " (gl_TessCoord.y * gl_in[1].gl_Position) +\n"
+ " (gl_TessCoord.z * gl_in[2].gl_Position);\n"
+ : "")
+ << teseSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(tese.str());
+ }
+
+ if (m_params.selectedStages & STAGE_GEOMETRY)
+ {
+ std::ostringstream geom;
+ geom
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (triangles) in;\n"
+ << "layout (triangle_strip, max_vertices=3) out;\n"
+ << (m_params.explicitDeclarations ?
+ "in gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_in[3];\n"
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "};\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << " for (int i = 0; i < 3; i++)\n"
+ << " {\n"
+ << ((m_params.writeStages & STAGE_GEOMETRY) ? " gl_Position = gl_in[i].gl_Position;\n" : "")
+ << " EmitVertex();\n"
+ << " }\n"
+ << geomSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("geom") << glu::GeometrySource(geom.str());
+ }
+
+ {
+ const auto backgroundColor = getBackGroundColor();
+
+ std::ostringstream colorStr;
+ colorStr << "vec4(" << backgroundColor.x() << ", " << backgroundColor.y() << ", " << backgroundColor.z() << ", " << backgroundColor.w() << ")";
+
+ std::ostringstream frag;
+ frag
+ << "#version 450\n"
+ << "layout (location=0) out vec4 out_color;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " out_color = " << colorStr.str() << ";\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("frag") << glu::FragmentSource(frag.str());
+ }
+}
+
+TestInstance* NoPositionCase::createInstance (Context& context) const
+{
+ return new NoPositionInstance (context, m_params);
+}
+
+void NoPositionCase::checkSupport (Context& context) const
+{
+ const auto features = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice());
+ const bool hasTess = m_params.tessellation();
+ const bool hasGeom = m_params.geometry();
+
+ if (hasTess && !features.tessellationShader)
+ TCU_THROW(NotSupportedError, "Tessellation shaders not supported");
+
+ if (hasGeom && !features.geometryShader)
+ TCU_THROW(NotSupportedError, "Geometry shaders not supported");
+
+ if (m_params.numViews > 1u)
+ {
+ context.requireDeviceFunctionality("VK_KHR_multiview");
+ const auto& multiviewFeatures = context.getMultiviewFeatures();
+
+ if (!multiviewFeatures.multiview)
+ TCU_THROW(NotSupportedError, "Multiview not supported");
+
+ if (hasTess && !multiviewFeatures.multiviewTessellationShader)
+ TCU_THROW(NotSupportedError, "Multiview not supported with tessellation shaders");
+
+ if (hasGeom && !multiviewFeatures.multiviewGeometryShader)
+ TCU_THROW(NotSupportedError, "Multiview not supported with geometry shaders");
+ }
+
+ if (m_params.useSSBO)
+ {
+ if (!features.vertexPipelineStoresAndAtomics)
+ TCU_THROW(NotSupportedError, "Vertex pipeline stores and atomics not supported");
+ }
+}
+
+NoPositionInstance::NoPositionInstance (Context& context, const TestParams& params)
+ : vkt::TestInstance (context)
+ , m_params (params)
+{}
+
+tcu::TestStatus NoPositionInstance::iterate (void)
+{
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ const auto queue = m_context.getUniversalQueue();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto format = NoPositionCase::getImageFormat();
+ const auto extent = NoPositionCase::getImageExtent();
+ const auto color = NoPositionCase::getBackGroundColor();
+ const VkImageUsageFlags usage = (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+ const bool tess = m_params.tessellation();
+ VkShaderStageFlags stageFlags = 0u;
+
+ // Shader modules.
+ Move<VkShaderModule> vert;
+ Move<VkShaderModule> tesc;
+ Move<VkShaderModule> tese;
+ Move<VkShaderModule> geom;
+ Move<VkShaderModule> frag;
+
+ if (m_params.selectedStages & STAGE_VERTEX)
+ {
+ vert = createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0u);
+ stageFlags |= VK_SHADER_STAGE_VERTEX_BIT;
+ }
+ if (m_params.selectedStages & STAGE_TESS_CONTROL)
+ {
+ tesc = createShaderModule(vkd, device, m_context.getBinaryCollection().get("tesc"), 0u);
+ stageFlags |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
+ }
+ if (m_params.selectedStages & STAGE_TESS_EVALUATION)
+ {
+ tese = createShaderModule(vkd, device, m_context.getBinaryCollection().get("tese"), 0u);
+ stageFlags |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
+ }
+ if (m_params.selectedStages & STAGE_GEOMETRY)
+ {
+ geom = createShaderModule(vkd, device, m_context.getBinaryCollection().get("geom"), 0u);
+ stageFlags |= VK_SHADER_STAGE_GEOMETRY_BIT;
+ }
+
+ frag = createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0u);
+ stageFlags |= VK_SHADER_STAGE_FRAGMENT_BIT;
+
+ // Color attachment.
+ const VkImageCreateInfo colorImageInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ extent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ m_params.numViews, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ usage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0u, // deUint32 queueFamilyIndexCount;
+ nullptr, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+ ImageWithMemory colorImage (vkd, device, alloc, colorImageInfo, MemoryRequirement::Any);
+
+ const auto subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, m_params.numViews);
+ const auto colorImageView = makeImageView(vkd, device, colorImage.get(), VK_IMAGE_VIEW_TYPE_2D, format, subresourceRange);
+
+ // Vertices and vertex buffer.
+ std::vector<tcu::Vec4> vertices =
+ {
+ tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f),
+ tcu::Vec4( 0.5f, 0.5f, 0.0f, 1.0f),
+ tcu::Vec4(-0.5f, 0.5f, 0.0f, 1.0f),
+ };
+
+ const auto vertexBufferSize = static_cast<VkDeviceSize>(vertices.size() * sizeof(decltype(vertices)::value_type));
+ const auto vertexBufferInfo = makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ const auto vertexBufferOffset = static_cast<VkDeviceSize>(0);
+ BufferWithMemory vertexBuffer (vkd, device, alloc, vertexBufferInfo, MemoryRequirement::HostVisible);
+
+ auto& vertexBufferAlloc = vertexBuffer.getAllocation();
+ void* vertexBufferPtr = vertexBufferAlloc.getHostPtr();
+ deMemcpy(vertexBufferPtr, vertices.data(), static_cast<size_t>(vertexBufferSize));
+ flushAlloc(vkd, device, vertexBufferAlloc);
+
+ // Render pass.
+ const VkAttachmentDescription colorAttachment =
+ {
+ 0u, // VkAttachmentDescriptionFlags flags;
+ format, // VkFormat format;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
+ VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
+ VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
+ };
+
+ const VkAttachmentReference colorAttachmentReference =
+ {
+ 0u, // deUint32 attachment;
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
+ };
+
+ const VkSubpassDescription subpassDescription =
+ {
+ 0u, // VkSubpassDescriptionFlags flags;
+ VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
+ 0u, // deUint32 inputAttachmentCount;
+ nullptr, // const VkAttachmentReference* pInputAttachments;
+ 1u, // deUint32 colorAttachmentCount;
+ &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments;
+ 0u, // const VkAttachmentReference* pResolveAttachments;
+ nullptr, // const VkAttachmentReference* pDepthStencilAttachment;
+ 0u, // deUint32 preserveAttachmentCount;
+ nullptr, // const deUint32* pPreserveAttachments;
+ };
+
+ de::MovePtr<VkRenderPassMultiviewCreateInfo> multiviewInfo;
+ deUint32 viewMask = 0u;
+ deUint32 correlationMask = 0u;
+
+ if (m_params.numViews > 1u)
+ {
+ for (deUint32 viewIdx = 0u; viewIdx < m_params.numViews; ++viewIdx)
+ {
+ viewMask |= (1 << viewIdx);
+ correlationMask |= (1 << viewIdx);
+ }
+
+ multiviewInfo = de::MovePtr<VkRenderPassMultiviewCreateInfo>(new VkRenderPassMultiviewCreateInfo
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 1u, // deUint32 subpassCount;
+ &viewMask, // const deUint32* pViewMasks;
+ 0u, // deUint32 dependencyCount;
+ nullptr, // const deInt32* pViewOffsets;
+ 1u, // deUint32 correlationMaskCount;
+ &correlationMask, // const deUint32* pCorrelationMasks;
+ });
+ }
+
+ const VkRenderPassCreateInfo renderPassInfo =
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
+ multiviewInfo.get(), // const void* pNext;
+ 0u, // VkRenderPassCreateFlags flags;
+ 1u, // deUint32 attachmentCount;
+ &colorAttachment, // const VkAttachmentDescription* pAttachments;
+ 1u, // deUint32 subpassCount;
+ &subpassDescription, // const VkSubpassDescription* pSubpasses;
+ 0u, // deUint32 dependencyCount;
+ nullptr, // const VkSubpassDependency* pDependencies;
+ };
+
+ const auto renderPass = createRenderPass(vkd, device, &renderPassInfo);
+
+ // Framebuffer.
+ const auto framebuffer = makeFramebuffer(vkd, device, renderPass.get(), colorImageView.get(), extent.width, extent.height);
+
+ // Descriptor set layout and pipeline layout.
+ DescriptorSetLayoutBuilder layoutBuilder;
+ if (m_params.useSSBO)
+ {
+ layoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageFlags);
+ }
+ const auto descriptorSetLayout = layoutBuilder.build(vkd, device);
+ const auto pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+
+ // Pipeline.
+ const std::vector<VkViewport> viewports (1u, makeViewport(extent));
+ const std::vector<VkRect2D> scissors (1u, makeRect2D(extent));
+
+ const deUint32 patchControlPoints = (tess ? 3u : 0u);
+ const auto primitiveTopology = (tess ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
+
+ const auto pipeline = makeGraphicsPipeline(
+ vkd, device, pipelineLayout.get(),
+ vert.get(), tesc.get(), tese.get(), geom.get(), frag.get(),
+ renderPass.get(), viewports, scissors, primitiveTopology,
+ 0u /* Subpass */, patchControlPoints);
+
+ // Descriptor set and output SSBO if needed.
+ Move<VkDescriptorPool> descriptorPool;
+ Move<VkDescriptorSet> descriptorSet;
+ de::MovePtr<BufferWithMemory> ssboBuffer;
+ const auto ssboElementCount = kStageCount * m_params.numViews;
+ const auto ssboBufferSize = static_cast<VkDeviceSize>(ssboElementCount * sizeof(deUint32));
+
+ if (m_params.useSSBO)
+ {
+ // Output SSBO.
+ const auto ssboBufferInfo = makeBufferCreateInfo(ssboBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ ssboBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, alloc, ssboBufferInfo, MemoryRequirement::HostVisible));
+ auto& ssboBufferAlloc = ssboBuffer->getAllocation();
+
+ deMemset(ssboBufferAlloc.getHostPtr(), 0, static_cast<size_t>(ssboBufferSize));
+ flushAlloc(vkd, device, ssboBufferAlloc);
+
+ // Descriptor pool.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+
+ // Descriptor set.
+ descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayout.get());
+ const auto ssboWriteInfo = makeDescriptorBufferInfo(ssboBuffer->get(), 0ull, ssboBufferSize);
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &ssboWriteInfo);
+ updateBuilder.update(vkd, device);
+ }
+
+ // Output verification buffer.
+ const auto tcuFormat = mapVkFormat(format);
+ const auto pixelSize = static_cast<deUint32>(tcu::getPixelSize(tcuFormat));
+ const auto layerPixels = extent.width * extent.height;
+ const auto layerBytes = layerPixels * pixelSize;
+ const auto totalPixels = layerPixels * m_params.numViews;
+ const auto totalBytes = totalPixels * pixelSize;
+
+ const auto verificationBufferInfo = makeBufferCreateInfo(totalBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ BufferWithMemory verificationBuffer(vkd, device, alloc, verificationBufferInfo, MemoryRequirement::HostVisible);
+
+ // Command pool and buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ // Render triangle.
+ beginCommandBuffer(vkd, cmdBuffer);
+ beginRenderPass(vkd, cmdBuffer, renderPass.get(), framebuffer.get(), scissors.front(), color);
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.get());
+ vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, &vertexBuffer.get(), &vertexBufferOffset);
+ if (m_params.useSSBO)
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdDraw(cmdBuffer, static_cast<deUint32>(vertices.size()), 1u, 0u, 0u);
+ endRenderPass(vkd, cmdBuffer);
+
+ // Copy output image to verification buffer.
+ const auto preTransferBarrier = makeImageMemoryBarrier(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, colorImage.get(), subresourceRange);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &preTransferBarrier);
+
+ const auto subresourceLayers = makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, m_params.numViews);
+ const VkBufferImageCopy copyRegion =
+ {
+ 0ull, // VkDeviceSize bufferOffset;
+ 0u, // deUint32 bufferRowLength;
+ 0u, // deUint32 bufferImageHeight;
+ subresourceLayers, // VkImageSubresourceLayers imageSubresource;
+ makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
+ extent, // VkExtent3D imageExtent;
+ };
+ vkd.cmdCopyImageToBuffer(cmdBuffer, colorImage.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, verificationBuffer.get(), 1u, ©Region);
+
+ const auto postTransferBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &postTransferBarrier, 0u, nullptr, 0u, nullptr);
+
+ // Output SSBO to host barrier.
+ if (m_params.useSSBO)
+ {
+ const auto ssboBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &ssboBarrier, 0u, nullptr, 0u, nullptr);
+ }
+
+ // Submit commands.
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify the image has the background color.
+ auto& verificationBufferAlloc = verificationBuffer.getAllocation();
+ auto verificationBufferPtr = reinterpret_cast<const char*>(verificationBufferAlloc.getHostPtr());
+ invalidateAlloc(vkd, device, verificationBufferAlloc);
+
+ const auto iWidth = static_cast<int>(extent.width);
+ const auto iHeight = static_cast<int>(extent.height);
+ const auto iDepth = static_cast<int>(extent.depth);
+
+ for (deUint32 layer = 0u; layer < m_params.numViews; ++layer)
+ {
+ const auto pixels = tcu::ConstPixelBufferAccess(tcuFormat, iWidth, iHeight, iDepth, reinterpret_cast<const void*>(verificationBufferPtr + layer * layerBytes));
+
+ for (int y = 0; y < iHeight; ++y)
+ for (int x = 0; x < iWidth; ++x)
+ {
+ const auto pixel = pixels.getPixel(x, y);
+ if (pixel != color)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected color found at pixel (" << x << ", " << y << ") in layer " << layer;
+
+ auto& log = m_context.getTestContext().getLog();
+ log << tcu::TestLog::Message << msg.str() << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::Image("Result", "Result Image", pixels);
+ TCU_FAIL(msg.str());
+ }
+ }
+ }
+
+ // Verify SSBO if used.
+ if (m_params.useSSBO)
+ {
+ // Get stored counters.
+ const auto ssboBufferSizeSz = static_cast<size_t>(ssboBufferSize);
+ auto& ssboAlloc = ssboBuffer->getAllocation();
+ invalidateAlloc(vkd, device, ssboAlloc);
+
+ std::vector<deUint32> ssboCounters;
+ ssboCounters.resize(ssboElementCount);
+ DE_ASSERT(ssboBufferSizeSz == ssboCounters.size() * sizeof(decltype(ssboCounters)::value_type));
+ deMemcpy(ssboCounters.data(), ssboAlloc.getHostPtr(), ssboBufferSizeSz);
+
+ // Minimum accepted counter values.
+ // Vertex, Tesellation Evaluation, Tessellation Control, Geometry.
+ deUint32 expectedCounters[kStageCount] = { 3u, 3u, 3u, 1u };
+
+ // Verify.
+ for (deUint32 viewIdx = 0u; viewIdx < m_params.numViews; ++viewIdx)
+ for (deUint32 stageIdx = 0u; stageIdx < kStageCount; ++stageIdx)
+ {
+ // If the stage is not selected, the expected value is exactly zero. Otherwise, it must be at least as expectedCounters.
+ const deUint32 minVal = ((m_params.selectedStages & (1u << stageIdx)) ? expectedCounters[stageIdx] : 0u);
+ const deUint32 storedVal = ssboCounters[stageIdx + viewIdx * kStageCount];
+ const bool ok = ((minVal == 0u) ? (storedVal == minVal) : (storedVal >= minVal));
+
+ if (!ok)
+ {
+ const char* stageNames[kStageCount] =
+ {
+ "vertex",
+ "tessellation evaluation",
+ "tessellation control",
+ "geometry",
+ };
+
+ std::ostringstream msg;
+ msg << "Unexpected SSBO counter value in view " << viewIdx
+ << " for the " << stageNames[stageIdx] << " shader:"
+ << " got " << storedVal << " but expected " << minVal;
+ TCU_FAIL(msg.str());
+ }
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createNoPositionTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "no_position", "Tests with shaders that do not write to the Position built-in"));
+
+ for (int aux = 0; aux < 2; ++aux)
+ {
+ const bool explicitDeclarations = (aux == 1);
+ const std::string declGroupName (explicitDeclarations ? "explicit_declarations" : "implicit_declarations");
+ de::MovePtr<tcu::TestCaseGroup> declGroup (new tcu::TestCaseGroup(testCtx, declGroupName.c_str(), ""));
+
+ for (int aux2 = 0; aux2 < 2; ++aux2)
+ {
+ const bool useSSBO = (aux2 == 1);
+ const std::string ssboGroupName (useSSBO ? "ssbo_writes" : "basic");
+ de::MovePtr<tcu::TestCaseGroup> ssboGroup (new tcu::TestCaseGroup(testCtx, ssboGroupName.c_str(), ""));
+
+ for (deUint32 viewCount = 1u; viewCount <= 2u; ++viewCount)
+ {
+ const std::string viewGroupName ((viewCount == 1u) ? "single_view" : "multiview");
+ de::MovePtr<tcu::TestCaseGroup> viewGroup (new tcu::TestCaseGroup(testCtx, viewGroupName.c_str(), ""));
+
+ for (ShaderStageFlags stages = 0u; stages < STAGE_MASK_COUNT; ++stages)
+ {
+ // Vertex must always be present.
+ if (! (stages & STAGE_VERTEX))
+ continue;
+
+ // Tessellation stages must both be present or none must be.
+ if (static_cast<bool>(stages & STAGE_TESS_CONTROL) != static_cast<bool>(stages & STAGE_TESS_EVALUATION))
+ continue;
+
+ const auto writeMaskCases = getWriteSubCases(stages);
+ for (const auto writeMask : writeMaskCases)
+ {
+ std::string testName;
+ if (stages & STAGE_VERTEX) testName += (testName.empty() ? "" : "_") + std::string("v") + ((writeMask & STAGE_VERTEX) ? "1" : "0");
+ if (stages & STAGE_TESS_CONTROL) testName += (testName.empty() ? "" : "_") + std::string("c") + ((writeMask & STAGE_TESS_CONTROL) ? "1" : "0");
+ if (stages & STAGE_TESS_EVALUATION) testName += (testName.empty() ? "" : "_") + std::string("e") + ((writeMask & STAGE_TESS_EVALUATION) ? "1" : "0");
+ if (stages & STAGE_GEOMETRY) testName += (testName.empty() ? "" : "_") + std::string("g") + ((writeMask & STAGE_GEOMETRY) ? "1" : "0");
+
+ TestParams params = { stages, writeMask, viewCount, explicitDeclarations, true };
+ viewGroup->addChild(new NoPositionCase(testCtx, testName, "", params));
+ }
+ }
+
+ ssboGroup->addChild(viewGroup.release());
+ }
+
+ declGroup->addChild(ssboGroup.release());
+ }
+
+ group->addChild(declGroup.release());
+ }
+
+ return group.release();
+}
+
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.hpp
new file mode 100644
index 0000000..b5a2ca6
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.hpp
@@ -0,0 +1,40 @@
+#ifndef _VKTPIPELINENOPOSITIONTESTS_HPP
+#define _VKTPIPELINENOPOSITIONTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests with shaders that do not write to the Position built-in.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+
+tcu::TestCaseGroup* createNoPositionTests (tcu::TestContext& testCtx);
+
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINENOPOSITIONTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
index 24c7394..f2cfa19 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
@@ -55,6 +55,7 @@
#include "vktPipelineBlendOperationAdvancedTests.hpp"
#include "vktPipelineExtendedDynamicStateTests.hpp"
#include "vktPipelineCreationCacheControlTests.hpp"
+#include "vktPipelineNoPositionTests.hpp"
#include "vktTestGroupUtil.hpp"
namespace vkt
@@ -101,6 +102,7 @@
pipelineTests->addChild(createBlendOperationAdvancedTests (testCtx));
pipelineTests->addChild(createExtendedDynamicStateTests (testCtx));
pipelineTests->addChild(createCacheControlTests (testCtx));
+ pipelineTests->addChild(createNoPositionTests (testCtx));
}
} // anonymous
diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt
index 00dafcb..1af3223 100644
--- a/external/vulkancts/mustpass/master/vk-default.txt
+++ b/external/vulkancts/mustpass/master/vk-default.txt
Binary files differ