Add Vulkan 1.1 Subgroup Tests
authorNeil Henning <neil@codeplay.com>
Tue, 17 Jan 2017 10:54:03 +0000 (10:54 +0000)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 7 Sep 2017 11:20:09 +0000 (07:20 -0400)
Vulkan 1.1 has subgroup functionality that these tests verify.

Affects:

deQP-VK.subgroups.*

Components: Vulkan

VK-GL-CTS issue: 120
Vulkan issue: 423

Change-Id: I2ff925cc9647718d7e4c4218efbc3b08f773c250

42 files changed:
AndroidGen.mk
android/cts/master/vk-master.txt
external/fetch_sources.py
external/vulkancts/framework/vulkan/vkBasicTypes.inl
external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
external/vulkancts/framework/vulkan/vkSpirVAsm.cpp
external/vulkancts/framework/vulkan/vkStrUtil.inl
external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
external/vulkancts/framework/vulkan/vkStructTypes.inl
external/vulkancts/modules/vulkan/CMakeLists.txt
external/vulkancts/modules/vulkan/subgroups/CMakeLists.txt [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/vktTestPackage.cpp
external/vulkancts/mustpass/1.0.3/vk-default.txt
external/vulkancts/scripts/src/vulkan.h.in

index 2a85b45..da12c01 100644 (file)
@@ -224,6 +224,20 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp \
        external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutCase.cpp \
        external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp \
+       external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp \
        external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.cpp \
        external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicFenceTests.cpp \
        external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp \
@@ -990,6 +1004,7 @@ LOCAL_C_INCLUDES := \
        $(deqp_dir)/external/vulkancts/modules/vulkan/sparse_resources \
        $(deqp_dir)/external/vulkancts/modules/vulkan/spirv_assembly \
        $(deqp_dir)/external/vulkancts/modules/vulkan/ssbo \
+       $(deqp_dir)/external/vulkancts/modules/vulkan/subgroups \
        $(deqp_dir)/external/vulkancts/modules/vulkan/synchronization \
        $(deqp_dir)/external/vulkancts/modules/vulkan/tessellation \
        $(deqp_dir)/external/vulkancts/modules/vulkan/texture \
index d11d64c..d294fa2 100644 (file)
@@ -240159,6 +240159,4233 @@ dEQP-VK.multiview.index.tesellation_shader.15_15_15_15
 dEQP-VK.multiview.index.tesellation_shader.8_1_1_8
 dEQP-VK.multiview.index.tesellation_shader.1_2_4_8_16_32
 dEQP-VK.multiview.index.tesellation_shader.max_multi_view_view_count
+dEQP-VK.subgroups.builtin_var.subgroupsize_tess_eval
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_tess_eval
+dEQP-VK.subgroups.builtin_var.subgroupsize_tess_control
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_tess_control
+dEQP-VK.subgroups.builtin_var.subgroupsize_geometry
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_geometry
+dEQP-VK.subgroups.builtin_var.subgroupsize_vertex
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_vertex
+dEQP-VK.subgroups.builtin_var.subgroupsize_fragment
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_fragment
+dEQP-VK.subgroups.builtin_var.subgroupsize_compute
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_compute
+dEQP-VK.subgroups.builtin_var.numsubgroups_compute
+dEQP-VK.subgroups.builtin_var.subgroupid_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_compute
+dEQP-VK.subgroups.basic.subgroupelect_tess_eval
+dEQP-VK.subgroups.basic.subgroupbarrier_tess_eval
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_tess_eval
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_tess_eval
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_tess_eval
+dEQP-VK.subgroups.basic.subgroupelect_tess_control
+dEQP-VK.subgroups.basic.subgroupbarrier_tess_control
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_tess_control
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_tess_control
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_tess_control
+dEQP-VK.subgroups.basic.subgroupelect_geometry
+dEQP-VK.subgroups.basic.subgroupbarrier_geometry
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_geometry
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_geometry
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_geometry
+dEQP-VK.subgroups.basic.subgroupelect_vertex
+dEQP-VK.subgroups.basic.subgroupbarrier_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_vertex
+dEQP-VK.subgroups.basic.subgroupelect_fragment
+dEQP-VK.subgroups.basic.subgroupbarrier_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_fragment
+dEQP-VK.subgroups.basic.subgroupelect_compute
+dEQP-VK.subgroups.basic.subgroupbarrier_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarriershared_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_compute
+dEQP-VK.subgroups.vote.subgroupallequal_int_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupall_uint_tess_eval
+dEQP-VK.subgroups.vote.subgroupany_uint_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_float_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_double_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_int_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_control
+dEQP-VK.subgroups.vote.subgroupall_uint_tess_control
+dEQP-VK.subgroups.vote.subgroupany_uint_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_float_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_double_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_int_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_geometry
+dEQP-VK.subgroups.vote.subgroupall_uint_geometry
+dEQP-VK.subgroups.vote.subgroupany_uint_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uint_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_float_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_double_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bool_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_int_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex
+dEQP-VK.subgroups.vote.subgroupall_uint_vertex
+dEQP-VK.subgroups.vote.subgroupany_uint_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_float_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_double_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_int_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_fragment
+dEQP-VK.subgroups.vote.subgroupall_uint_fragment
+dEQP-VK.subgroups.vote.subgroupany_uint_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uint_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_float_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_double_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bool_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_int_compute
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_compute
+dEQP-VK.subgroups.vote.subgroupall_uint_compute
+dEQP-VK.subgroups.vote.subgroupany_uint_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uint_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_compute
+dEQP-VK.subgroups.vote.subgroupallequal_float_compute
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_compute
+dEQP-VK.subgroups.vote.subgroupallequal_double_compute
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bool_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_compute
+dEQP-VK.subgroups.ballot.tess_eval
+dEQP-VK.subgroups.ballot.tess_control
+dEQP-VK.subgroups.ballot.geometry
+dEQP-VK.subgroups.ballot.vertex
+dEQP-VK.subgroups.ballot.fragment
+dEQP-VK.subgroups.ballot.compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_compute
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_geometry
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_fragment
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_compute
+dEQP-VK.subgroups.shape.clustered_tess_eval
+dEQP-VK.subgroups.shape.quad_tess_eval
+dEQP-VK.subgroups.shape.clustered_tess_control
+dEQP-VK.subgroups.shape.quad_tess_control
+dEQP-VK.subgroups.shape.clustered_geometry
+dEQP-VK.subgroups.shape.quad_geometry
+dEQP-VK.subgroups.shape.clustered_vertex
+dEQP-VK.subgroups.shape.quad_vertex
+dEQP-VK.subgroups.shape.clustered_fragment
+dEQP-VK.subgroups.shape.quad_fragment
+dEQP-VK.subgroups.shape.clustered_compute
+dEQP-VK.subgroups.shape.quad_compute
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_optimal
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear_mapped
index eba0492..a97d14c 100644 (file)
@@ -241,19 +241,19 @@ PACKAGES = [
                "libpng",
                postExtract = postExtractLibpng),
        GitRepo(
-               "https://github.com/KhronosGroup/SPIRV-Tools.git",
-               None,
-               "0b0454c42c6b6f6746434bd5c78c5c70f65d9c51",
+               "https://gitlab.khronos.org/spirv/spirv-tools.git",
+               "git@gitlab.khronos.org:spirv/spirv-tools.git",
+               "5ef1440f3ec5a5fc6e5cf368383c4b1ae323f0f8",
                "spirv-tools"),
        GitRepo(
-               "https://github.com/KhronosGroup/glslang.git",
-               None,
-               "a5c5fb61180e8703ca85f36d618f98e16dc317e2",
+               "https://gitlab.khronos.org/GLSL/glslang.git",
+               "git@gitlab.khronos.org:GLSL/glslang.git",
+               "bac5d60bdf5df38bc4d3d58379aa6efc45f1ea83",
                "glslang"),
        GitRepo(
-               "https://github.com/KhronosGroup/SPIRV-Headers.git",
-               None,
-               "2bf02308656f97898c5f7e433712f21737c61e4e",
+               "https://gitlab.khronos.org/spirv/SPIRV-Headers.git",
+               "git@gitlab.khronos.org:spirv/SPIRV-Headers.git",
+               "73a7a9e467b42ca696e9c1f1b4ea37776c79b9f8",
                "spirv-headers"),
 ]
 
index 5ca3df6..df5cd61 100644 (file)
@@ -211,6 +211,7 @@ enum VkStructureType
        VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR                                                                                   = 1000084000,
        VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR                                    = 1000085000,
        VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE                                                                             = 1000092000,
+       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES                                                   = 1000093000,
        VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR                                               = 1000111000,
        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR                                               = 1000112000,
        VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR                                                                 = 1000112001,
@@ -1358,6 +1359,19 @@ enum VkDisplayPlaneAlphaFlagBitsKHR
 };
 typedef deUint32 VkDisplayPlaneAlphaFlagsKHR;
 
+enum VkSubgroupFeatureFlagBits
+{
+       VK_SUBGROUP_FEATURE_BASIC_BIT                           = 0x00000001,
+       VK_SUBGROUP_FEATURE_VOTE_BIT                            = 0x00000002,
+       VK_SUBGROUP_FEATURE_ARITHMETIC_BIT                      = 0x00000004,
+       VK_SUBGROUP_FEATURE_BALLOT_BIT                          = 0x00000008,
+       VK_SUBGROUP_FEATURE_SHUFFLE_BIT                         = 0x00000010,
+       VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT        = 0x00000020,
+       VK_SUBGROUP_FEATURE_CLUSTERED_BIT                       = 0x00000040,
+       VK_SUBGROUP_FEATURE_QUAD_BIT                            = 0x00000080,
+};
+typedef deUint32 VkSubgroupFeatureFlags;
+
 enum VkExternalFenceHandleTypeFlagBitsKHR
 {
        VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR                 = 0x00000001,
index 3592255..55d7650 100644 (file)
@@ -336,6 +336,11 @@ template<> VkStructureType getStructureType<VkPhysicalDeviceSparseImageFormatInf
        return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR;
 }
 
+template<> VkStructureType getStructureType<VkPhysicalDeviceSubgroupProperties> (void)
+{
+       return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
+}
+
 template<> VkStructureType getStructureType<VkPhysicalDevicePushDescriptorPropertiesKHR> (void)
 {
        return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR;
index 876fedc..18cddfe 100644 (file)
@@ -39,7 +39,7 @@ using std::vector;
 
 #if defined(DEQP_HAVE_SPIRV_TOOLS)
 
-static const spv_target_env s_defaultEnvironment = SPV_ENV_VULKAN_1_0;
+static const spv_target_env s_defaultEnvironment = SPV_ENV_VULKAN_1_1;
 
 bool assembleSpirV (const SpirVAsmSource* program, std::vector<deUint32>* dst, SpirVProgramInfo* buildInfo)
 {
index 29f8044..be615e0 100644 (file)
@@ -178,6 +178,7 @@ tcu::Format::Bitfield<32>   getSurfaceTransformFlagsKHRStr                                  (VkSurfaceTransform
 tcu::Format::Bitfield<32>      getCompositeAlphaFlagsKHRStr                                    (VkCompositeAlphaFlagsKHR value);
 tcu::Format::Bitfield<32>      getSwapchainCreateFlagsKHRStr                                   (VkSwapchainCreateFlagsKHR value);
 tcu::Format::Bitfield<32>      getDisplayPlaneAlphaFlagsKHRStr                                 (VkDisplayPlaneAlphaFlagsKHR value);
+tcu::Format::Bitfield<32>      getSubgroupFeatureFlagsStr                                              (VkSubgroupFeatureFlags value);
 tcu::Format::Bitfield<32>      getExternalFenceHandleTypeFlagsKHRStr                   (VkExternalFenceHandleTypeFlagsKHR value);
 tcu::Format::Bitfield<32>      getExternalFenceFeatureFlagsKHRStr                              (VkExternalFenceFeatureFlagsKHR value);
 tcu::Format::Bitfield<32>      getFenceImportFlagsKHRStr                                               (VkFenceImportFlagsKHR value);
@@ -361,6 +362,7 @@ std::ostream&       operator<<      (std::ostream& s, const VkQueueFamilyProperties2KHR& va
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceMemoryProperties2KHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkSparseImageFormatProperties2KHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceSparseImageFormatInfo2KHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDeviceSubgroupProperties& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDevicePushDescriptorPropertiesKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkPhysicalDevice16BitStorageFeaturesKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkRectLayerKHR& value);
index 41e52fa..de3e622 100644 (file)
@@ -222,6 +222,7 @@ const char* getStructureTypeName (VkStructureType value)
                case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:                                                                                     return "VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR";
                case VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR:                                      return "VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR";
                case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:                                                                       return "VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE";
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:                                                     return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES";
                case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:                                         return "VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR";
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR:                                         return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR";
                case VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR:                                                           return "VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR";
@@ -1577,6 +1578,22 @@ tcu::Format::Bitfield<32> getDisplayPlaneAlphaFlagsKHRStr (VkDisplayPlaneAlphaFl
        return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
 }
 
+tcu::Format::Bitfield<32> getSubgroupFeatureFlagsStr (VkSubgroupFeatureFlags value)
+{
+       static const tcu::Format::BitDesc s_desc[] =
+       {
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_BASIC_BIT,                             "VK_SUBGROUP_FEATURE_BASIC_BIT"),
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_VOTE_BIT,                              "VK_SUBGROUP_FEATURE_VOTE_BIT"),
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_ARITHMETIC_BIT,                "VK_SUBGROUP_FEATURE_ARITHMETIC_BIT"),
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_BALLOT_BIT,                    "VK_SUBGROUP_FEATURE_BALLOT_BIT"),
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_SHUFFLE_BIT,                   "VK_SUBGROUP_FEATURE_SHUFFLE_BIT"),
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT,  "VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT"),
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_CLUSTERED_BIT,                 "VK_SUBGROUP_FEATURE_CLUSTERED_BIT"),
+               tcu::Format::BitDesc(VK_SUBGROUP_FEATURE_QUAD_BIT,                              "VK_SUBGROUP_FEATURE_QUAD_BIT"),
+       };
+       return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
 tcu::Format::Bitfield<32> getExternalFenceHandleTypeFlagsKHRStr (VkExternalFenceHandleTypeFlagsKHR value)
 {
        static const tcu::Format::BitDesc s_desc[] =
@@ -3728,6 +3745,19 @@ std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSparseImageForm
        return s;
 }
 
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSubgroupProperties& value)
+{
+       s << "VkPhysicalDeviceSubgroupProperties = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tsubgroupSize = " << value.subgroupSize << '\n';
+       s << "\tsupportedStages = " << getShaderStageFlagsStr(value.supportedStages) << '\n';
+       s << "\tsupportedOperations = " << getSubgroupFeatureFlagsStr(value.supportedOperations) << '\n';
+       s << "\tquadOperationsInAllStages = " << value.quadOperationsInAllStages << '\n';
+       s << '}';
+       return s;
+}
+
 std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePushDescriptorPropertiesKHR& value)
 {
        s << "VkPhysicalDevicePushDescriptorPropertiesKHR = {\n";
index 8f8278a..ab3b068 100644 (file)
@@ -1434,6 +1434,16 @@ struct VkPhysicalDeviceSparseImageFormatInfo2KHR
        VkImageTiling                   tiling;
 };
 
+struct VkPhysicalDeviceSubgroupProperties
+{
+       VkStructureType                 sType;
+       void*                                   pNext;
+       deUint32                                subgroupSize;
+       VkShaderStageFlags              supportedStages;
+       VkSubgroupFeatureFlags  supportedOperations;
+       VkBool32                                quadOperationsInAllStages;
+};
+
 struct VkPhysicalDevicePushDescriptorPropertiesKHR
 {
        VkStructureType sType;
index 39506d3..e2ce486 100644 (file)
@@ -26,6 +26,7 @@ add_subdirectory(texture)
 add_subdirectory(robustness)
 add_subdirectory(renderpass)
 add_subdirectory(multiview)
+add_subdirectory(subgroups)
 add_subdirectory(ycbcr)
 
 include_directories(
@@ -55,6 +56,7 @@ include_directories(
        robustness
        renderpass
        multiview
+       subgroups
        ycbcr
        )
 
@@ -109,6 +111,7 @@ set(DEQP_VK_LIBS
        deqp-vk-robustness
        deqp-vk-render-pass
        deqp-vk-multiview
+       deqp-vk-subgroups
        deqp-vk-ycbcr
        )
 
diff --git a/external/vulkancts/modules/vulkan/subgroups/CMakeLists.txt b/external/vulkancts/modules/vulkan/subgroups/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6bfb8fc
--- /dev/null
@@ -0,0 +1,40 @@
+include_directories(..)
+
+set(DEQP_VK_SUBGROUPS_SRCS
+  vktSubgroupsTests.cpp
+  vktSubgroupsTests.hpp
+  vktSubgroupsBuiltinVarTests.cpp
+  vktSubgroupsBuiltinVarTests.hpp
+  vktSubgroupsBuiltinMaskVarTests.cpp
+  vktSubgroupsBuiltinMaskVarTests.hpp
+  vktSubgroupsBasicTests.cpp
+  vktSubgroupsBasicTests.hpp
+  vktSubgroupsVoteTests.cpp
+  vktSubgroupsVoteTests.hpp
+  vktSubgroupsBallotTests.cpp
+  vktSubgroupsBallotTests.hpp
+  vktSubgroupsBallotBroadcastTests.cpp
+  vktSubgroupsBallotBroadcastTests.hpp
+  vktSubgroupsBallotOtherTests.cpp
+  vktSubgroupsBallotOtherTests.hpp
+  vktSubgroupsArithmeticTests.cpp
+  vktSubgroupsArithmeticTests.hpp
+  vktSubgroupsClusteredTests.cpp
+  vktSubgroupsClusteredTests.hpp
+  vktSubgroupsShuffleTests.cpp
+  vktSubgroupsShuffleTests.hpp
+  vktSubgroupsQuadTests.cpp
+  vktSubgroupsQuadTests.hpp
+  vktSubgroupsShapeTests.cpp
+  vktSubgroupsShapeTests.hpp
+  vktSubgroupsTestsUtils.cpp
+  vktSubgroupsTestsUtils.hpp
+  )
+
+set(DEQP_VK_SUBGROUPS_LIBS
+  tcutil
+  vkutil
+  )
+
+add_library(deqp-vk-subgroups STATIC ${DEQP_VK_SUBGROUPS_SRCS})
+target_link_libraries(deqp-vk-subgroups ${DEQP_VK_SUBGROUPS_LIBS})
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
new file mode 100644 (file)
index 0000000..d844f33
--- /dev/null
@@ -0,0 +1,934 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsArithmeticTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+enum OpType
+{
+       OPTYPE_ADD = 0,
+       OPTYPE_MUL,
+       OPTYPE_MIN,
+       OPTYPE_MAX,
+       OPTYPE_AND,
+       OPTYPE_OR,
+       OPTYPE_XOR,
+       OPTYPE_INCLUSIVE_ADD,
+       OPTYPE_INCLUSIVE_MUL,
+       OPTYPE_INCLUSIVE_MIN,
+       OPTYPE_INCLUSIVE_MAX,
+       OPTYPE_INCLUSIVE_AND,
+       OPTYPE_INCLUSIVE_OR,
+       OPTYPE_INCLUSIVE_XOR,
+       OPTYPE_EXCLUSIVE_ADD,
+       OPTYPE_EXCLUSIVE_MUL,
+       OPTYPE_EXCLUSIVE_MIN,
+       OPTYPE_EXCLUSIVE_MAX,
+       OPTYPE_EXCLUSIVE_AND,
+       OPTYPE_EXCLUSIVE_OR,
+       OPTYPE_EXCLUSIVE_XOR,
+       OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x3 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0x3 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x3 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_ADD:
+                       return "subgroupAdd";
+               case OPTYPE_MUL:
+                       return "subgroupMul";
+               case OPTYPE_MIN:
+                       return "subgroupMin";
+               case OPTYPE_MAX:
+                       return "subgroupMax";
+               case OPTYPE_AND:
+                       return "subgroupAnd";
+               case OPTYPE_OR:
+                       return "subgroupOr";
+               case OPTYPE_XOR:
+                       return "subgroupXor";
+               case OPTYPE_INCLUSIVE_ADD:
+                       return "subgroupInclusiveAdd";
+               case OPTYPE_INCLUSIVE_MUL:
+                       return "subgroupInclusiveMul";
+               case OPTYPE_INCLUSIVE_MIN:
+                       return "subgroupInclusiveMin";
+               case OPTYPE_INCLUSIVE_MAX:
+                       return "subgroupInclusiveMax";
+               case OPTYPE_INCLUSIVE_AND:
+                       return "subgroupInclusiveAnd";
+               case OPTYPE_INCLUSIVE_OR:
+                       return "subgroupInclusiveOr";
+               case OPTYPE_INCLUSIVE_XOR:
+                       return "subgroupInclusiveXor";
+               case OPTYPE_EXCLUSIVE_ADD:
+                       return "subgroupExclusiveAdd";
+               case OPTYPE_EXCLUSIVE_MUL:
+                       return "subgroupExclusiveMul";
+               case OPTYPE_EXCLUSIVE_MIN:
+                       return "subgroupExclusiveMin";
+               case OPTYPE_EXCLUSIVE_MAX:
+                       return "subgroupExclusiveMax";
+               case OPTYPE_EXCLUSIVE_AND:
+                       return "subgroupExclusiveAnd";
+               case OPTYPE_EXCLUSIVE_OR:
+                       return "subgroupExclusiveOr";
+               case OPTYPE_EXCLUSIVE_XOR:
+                       return "subgroupExclusiveXor";
+       }
+}
+
+std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_ADD:
+               case OPTYPE_INCLUSIVE_ADD:
+               case OPTYPE_EXCLUSIVE_ADD:
+                       return lhs + " + " + rhs;
+               case OPTYPE_MUL:
+               case OPTYPE_INCLUSIVE_MUL:
+               case OPTYPE_EXCLUSIVE_MUL:
+                       return lhs + " * " + rhs;
+               case OPTYPE_MIN:
+               case OPTYPE_INCLUSIVE_MIN:
+               case OPTYPE_EXCLUSIVE_MIN:
+                       switch (format)
+                       {
+                               default:
+                                       return "min(" + lhs + ", " + rhs + ")";
+                               case VK_FORMAT_R32_SFLOAT:
+                               case VK_FORMAT_R64_SFLOAT:
+                                       return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : min(" + lhs + ", " + rhs + ")))";
+                               case VK_FORMAT_R32G32_SFLOAT:
+                               case VK_FORMAT_R32G32B32_SFLOAT:
+                               case VK_FORMAT_R32G32B32A32_SFLOAT:
+                               case VK_FORMAT_R64G64_SFLOAT:
+                               case VK_FORMAT_R64G64B64_SFLOAT:
+                               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                                       return "mix(mix(min(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+                       }
+               case OPTYPE_MAX:
+               case OPTYPE_INCLUSIVE_MAX:
+               case OPTYPE_EXCLUSIVE_MAX:
+                       switch (format)
+                       {
+                               default:
+                                       return "max(" + lhs + ", " + rhs + ")";
+                               case VK_FORMAT_R32_SFLOAT:
+                               case VK_FORMAT_R64_SFLOAT:
+                                       return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : max(" + lhs + ", " + rhs + ")))";
+                               case VK_FORMAT_R32G32_SFLOAT:
+                               case VK_FORMAT_R32G32B32_SFLOAT:
+                               case VK_FORMAT_R32G32B32A32_SFLOAT:
+                               case VK_FORMAT_R64G64_SFLOAT:
+                               case VK_FORMAT_R64G64B64_SFLOAT:
+                               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                                       return "mix(mix(max(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+                       }
+               case OPTYPE_AND:
+               case OPTYPE_INCLUSIVE_AND:
+               case OPTYPE_EXCLUSIVE_AND:
+                       switch (format)
+                       {
+                               default:
+                                       return lhs + " & " + rhs;
+                               case VK_FORMAT_R8_USCALED:
+                                       return lhs + " && " + rhs;
+                               case VK_FORMAT_R8G8_USCALED:
+                                       return "bvec2(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y)";
+                               case VK_FORMAT_R8G8B8_USCALED:
+                                       return "bvec3(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z)";
+                               case VK_FORMAT_R8G8B8A8_USCALED:
+                                       return "bvec4(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z, " + lhs + ".w && " + rhs + ".w)";
+                       }
+               case OPTYPE_OR:
+               case OPTYPE_INCLUSIVE_OR:
+               case OPTYPE_EXCLUSIVE_OR:
+                       switch (format)
+                       {
+                               default:
+                                       return lhs + " | " + rhs;
+                               case VK_FORMAT_R8_USCALED:
+                                       return lhs + " || " + rhs;
+                               case VK_FORMAT_R8G8_USCALED:
+                                       return "bvec2(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y)";
+                               case VK_FORMAT_R8G8B8_USCALED:
+                                       return "bvec3(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z)";
+                               case VK_FORMAT_R8G8B8A8_USCALED:
+                                       return "bvec4(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z, " + lhs + ".w || " + rhs + ".w)";
+                       }
+               case OPTYPE_XOR:
+               case OPTYPE_INCLUSIVE_XOR:
+               case OPTYPE_EXCLUSIVE_XOR:
+                       switch (format)
+                       {
+                               default:
+                                       return lhs + " ^ " + rhs;
+                               case VK_FORMAT_R8_USCALED:
+                                       return lhs + " ^^ " + rhs;
+                               case VK_FORMAT_R8G8_USCALED:
+                                       return "bvec2(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y)";
+                               case VK_FORMAT_R8G8B8_USCALED:
+                                       return "bvec3(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z)";
+                               case VK_FORMAT_R8G8B8A8_USCALED:
+                                       return "bvec4(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z, " + lhs + ".w ^^ " + rhs + ".w)";
+                       }
+       }
+}
+
+std::string getIdentity(int opType, vk::VkFormat format)
+{
+       bool isFloat = false;
+       bool isInt = false;
+       bool isUnsigned = false;
+
+       switch (format)
+       {
+               default:
+                       DE_FATAL("Unhandled format!");
+               case VK_FORMAT_R32_SINT:
+               case VK_FORMAT_R32G32_SINT:
+               case VK_FORMAT_R32G32B32_SINT:
+               case VK_FORMAT_R32G32B32A32_SINT:
+                       isInt = true;
+                       break;
+               case VK_FORMAT_R32_UINT:
+               case VK_FORMAT_R32G32_UINT:
+               case VK_FORMAT_R32G32B32_UINT:
+               case VK_FORMAT_R32G32B32A32_UINT:
+                       isUnsigned = true;
+                       break;
+               case VK_FORMAT_R32_SFLOAT:
+               case VK_FORMAT_R32G32_SFLOAT:
+               case VK_FORMAT_R32G32B32_SFLOAT:
+               case VK_FORMAT_R32G32B32A32_SFLOAT:
+               case VK_FORMAT_R64_SFLOAT:
+               case VK_FORMAT_R64G64_SFLOAT:
+               case VK_FORMAT_R64G64B64_SFLOAT:
+               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       isFloat = true;
+                       break;
+               case VK_FORMAT_R8_USCALED:
+               case VK_FORMAT_R8G8_USCALED:
+               case VK_FORMAT_R8G8B8_USCALED:
+               case VK_FORMAT_R8G8B8A8_USCALED:
+                       break; // bool types are not anything
+       }
+
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_ADD:
+               case OPTYPE_INCLUSIVE_ADD:
+               case OPTYPE_EXCLUSIVE_ADD:
+                       return subgroups::getFormatNameForGLSL(format) + "(0)";
+               case OPTYPE_MUL:
+               case OPTYPE_INCLUSIVE_MUL:
+               case OPTYPE_EXCLUSIVE_MUL:
+                       return subgroups::getFormatNameForGLSL(format) + "(1)";
+               case OPTYPE_MIN:
+               case OPTYPE_INCLUSIVE_MIN:
+               case OPTYPE_EXCLUSIVE_MIN:
+                       if (isFloat)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0x7f800000))";
+                       }
+                       else if (isInt)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+                       }
+                       else if (isUnsigned)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+                       }
+                       else
+                       {
+                               DE_FATAL("Unhandled case");
+                       }
+               case OPTYPE_MAX:
+               case OPTYPE_INCLUSIVE_MAX:
+               case OPTYPE_EXCLUSIVE_MAX:
+                       if (isFloat)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0xff800000))";
+                       }
+                       else if (isInt)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+                       }
+                       else if (isUnsigned)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0)";
+                       }
+                       else
+                       {
+                               DE_FATAL("Unhandled case");
+                       }
+               case OPTYPE_AND:
+               case OPTYPE_INCLUSIVE_AND:
+               case OPTYPE_EXCLUSIVE_AND:
+                       return subgroups::getFormatNameForGLSL(format) + "(~0)";
+               case OPTYPE_OR:
+               case OPTYPE_INCLUSIVE_OR:
+               case OPTYPE_EXCLUSIVE_OR:
+                       return subgroups::getFormatNameForGLSL(format) + "(0)";
+               case OPTYPE_XOR:
+               case OPTYPE_INCLUSIVE_XOR:
+               case OPTYPE_EXCLUSIVE_XOR:
+                       return subgroups::getFormatNameForGLSL(format) + "(0)";
+       }
+}
+
+std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+{
+       std::string formatName = subgroups::getFormatNameForGLSL(format);
+       switch (format)
+       {
+               default:
+                       return "all(equal(" + lhs + ", " + rhs + "))";
+               case VK_FORMAT_R8_USCALED:
+               case VK_FORMAT_R32_UINT:
+               case VK_FORMAT_R32_SINT:
+                       return "(" + lhs + " == " + rhs + ")";
+               case VK_FORMAT_R32_SFLOAT:
+               case VK_FORMAT_R64_SFLOAT:
+                       switch (opType)
+                       {
+                               default:
+                                       return "(abs(" + lhs + " - " + rhs + ") < 0.00001)";
+                               case OPTYPE_MIN:
+                               case OPTYPE_INCLUSIVE_MIN:
+                               case OPTYPE_EXCLUSIVE_MIN:
+                               case OPTYPE_MAX:
+                               case OPTYPE_INCLUSIVE_MAX:
+                               case OPTYPE_EXCLUSIVE_MAX:
+                                       return "(" + lhs + " == " + rhs + ")";
+                       }
+               case VK_FORMAT_R32G32_SFLOAT:
+               case VK_FORMAT_R32G32B32_SFLOAT:
+               case VK_FORMAT_R32G32B32A32_SFLOAT:
+               case VK_FORMAT_R64G64_SFLOAT:
+               case VK_FORMAT_R64G64B64_SFLOAT:
+               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       switch (opType)
+                       {
+                               default:
+                                       return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.00001)))";
+                               case OPTYPE_MIN:
+                               case OPTYPE_INCLUSIVE_MIN:
+                               case OPTYPE_EXCLUSIVE_MIN:
+                               case OPTYPE_MAX:
+                               case OPTYPE_INCLUSIVE_MAX:
+                               case OPTYPE_EXCLUSIVE_MAX:
+                                       return "all(equal(" + lhs + ", " + rhs + "))";
+                       }
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+       VkFormat format;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string indexVars;
+       switch (caseDef.opType)
+       {
+               default:
+                       indexVars = "  uint start = 0, end = gl_SubgroupSize;\n";
+                       break;
+               case OPTYPE_INCLUSIVE_ADD:
+               case OPTYPE_INCLUSIVE_MUL:
+               case OPTYPE_INCLUSIVE_MIN:
+               case OPTYPE_INCLUSIVE_MAX:
+               case OPTYPE_INCLUSIVE_AND:
+               case OPTYPE_INCLUSIVE_OR:
+               case OPTYPE_INCLUSIVE_XOR:
+                       indexVars = "  uint start = 0, end = gl_SubgroupInvocationID + 1;\n";
+                       break;
+               case OPTYPE_EXCLUSIVE_ADD:
+               case OPTYPE_EXCLUSIVE_MUL:
+               case OPTYPE_EXCLUSIVE_MIN:
+               case OPTYPE_EXCLUSIVE_MAX:
+               case OPTYPE_EXCLUSIVE_AND:
+               case OPTYPE_EXCLUSIVE_OR:
+               case OPTYPE_EXCLUSIVE_XOR:
+                       indexVars = "  uint start = 0, end = gl_SubgroupInvocationID;\n";
+                       break;
+       }
+
+       std::ostringstream bdy;
+
+       bdy << indexVars
+               << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " ref = "
+               << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+               << "  uint tempResult = 0;\n"
+               << "  for (uint index = start; index < end; index++)\n"
+               << "  {\n"
+               << "    if (subgroupBallotBitExtract(mask, index))\n"
+               << "    {\n"
+               << "      ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+               << "    }\n"
+               << "  }\n"
+               << "  tempResult = " << getCompare(caseDef.opType, caseDef.format, "ref",
+                                                                                  getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") << " ? 0x1 : 0;\n"
+               << "  if (1 == (gl_SubgroupInvocationID % 2))\n"
+               << "  {\n"
+               << "    mask = subgroupBallot(true);\n"
+               << "    ref = " << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+               << "    for (uint index = start; index < end; index++)\n"
+               << "    {\n"
+               << "      if (subgroupBallotBitExtract(mask, index))\n"
+               << "      {\n"
+               << "        ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+               << "      }\n"
+               << "    }\n"
+               << "    tempResult |= " << getCompare(caseDef.opType, caseDef.format, "ref",
+                               getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") << " ? 0x2 : 0;\n"
+               << "  }\n"
+               << "  else\n"
+               << "  {\n"
+               << "    tempResult |= 0x2;\n"
+               << "  }\n";
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[offset] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+                        << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "layout(set = 0, binding = 0, std430) buffer Buffer2\n"
+                        << "{\n"
+                        << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                        << "};\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << "  uvec4 mask = subgroupBallot(true);\n"
+                        << bdy.str()
+                        << "  result = tempResult;\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_VertexIndex] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveIDIn] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_ARITHMETIC_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup arithmetic operations");
+       }
+
+       if (subgroups::isDoubleFormat(caseDef.format) &&
+                       !subgroups::isDoubleSupportedForDevice(context))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  &inputData, 1, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                 1, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                  1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "arithmetic", "Subgroup arithmetic category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       const VkFormat formats[] =
+       {
+               VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
+               VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
+               VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
+               VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
+               VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
+               VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
+               VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
+               VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
+               VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+               {
+                       const VkFormat format = formats[formatIndex];
+
+                       for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+                       {
+                               bool isBool = false;
+                               bool isFloat = false;
+
+                               switch (format)
+                               {
+                                       default:
+                                               break;
+                                       case VK_FORMAT_R32_SFLOAT:
+                                       case VK_FORMAT_R32G32_SFLOAT:
+                                       case VK_FORMAT_R32G32B32_SFLOAT:
+                                       case VK_FORMAT_R32G32B32A32_SFLOAT:
+                                       case VK_FORMAT_R64_SFLOAT:
+                                       case VK_FORMAT_R64G64_SFLOAT:
+                                       case VK_FORMAT_R64G64B64_SFLOAT:
+                                       case VK_FORMAT_R64G64B64A64_SFLOAT:
+                                               isFloat = true;
+                                               break;
+                                       case VK_FORMAT_R8_USCALED:
+                                       case VK_FORMAT_R8G8_USCALED:
+                                       case VK_FORMAT_R8G8B8_USCALED:
+                                       case VK_FORMAT_R8G8B8A8_USCALED:
+                                               isBool = true;
+                                               break;
+                               }
+
+                               bool isBitwiseOp = false;
+
+                               switch (opTypeIndex)
+                               {
+                                       default:
+                                               break;
+                                       case OPTYPE_AND:
+                                       case OPTYPE_INCLUSIVE_AND:
+                                       case OPTYPE_EXCLUSIVE_AND:
+                                       case OPTYPE_OR:
+                                       case OPTYPE_INCLUSIVE_OR:
+                                       case OPTYPE_EXCLUSIVE_OR:
+                                       case OPTYPE_XOR:
+                                       case OPTYPE_INCLUSIVE_XOR:
+                                       case OPTYPE_EXCLUSIVE_XOR:
+                                               isBitwiseOp = true;
+                                               break;
+                               }
+
+                               if (isFloat && isBitwiseOp)
+                               {
+                                       // Skip float with bitwise category.
+                                       continue;
+                               }
+
+                               if (isBool && !isBitwiseOp)
+                               {
+                                       // Skip bool when its not the bitwise category.
+                                       continue;
+                               }
+
+                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+
+                               std::string op = getOpTypeName(opTypeIndex);
+
+                               addFunctionCaseWithPrograms(group.get(),
+                                                                                       de::toLower(op) + "_" +
+                                                                                       subgroups::getFormatNameForGLSL(format) +
+                                                                                       "_" + getShaderStageName(stage),
+                                                                                       "", initPrograms, test, caseDef);
+                       }
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.hpp
new file mode 100644 (file)
index 0000000..6ae287e
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSARITHMETICTESTS_HPP
+#define _VKTSUBGROUPSARITHMETICTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSARITHMETICTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
new file mode 100644 (file)
index 0000000..e8cd86c
--- /dev/null
@@ -0,0 +1,564 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsBallotBroadcastTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+enum OpType
+{
+       OPTYPE_BROADCAST = 0,
+       OPTYPE_BROADCAST_FIRST,
+       OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x3 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0x3 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x3 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_BROADCAST:
+                       return "subgroupBroadcast";
+               case OPTYPE_BROADCAST_FIRST:
+                       return "subgroupBroadcastFirst";
+       }
+}
+
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+       VkFormat format;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+
+       bdy << "  uint tempResult = 0;\n";
+
+       if (OPTYPE_BROADCAST == caseDef.opType)
+       {
+               bdy << "  tempResult = 0x3;\n";
+
+               for (deUint32 i = 0; i < subgroups::maxSupportedSubgroupSize(); i++)
+               {
+                       bdy     << "  {\n"
+                               << "    const uint id = " << i << ";\n"
+                               << "    " << subgroups::getFormatNameForGLSL(caseDef.format)
+                               << " op = subgroupBroadcast(data1[gl_SubgroupInvocationID], id);\n"
+                               << "    if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                               << "    {\n"
+                               << "      if (op != data1[id])\n"
+                               << "      {\n"
+                               << "        tempResult = 0;\n"
+                               << "      }\n"
+                               << "    }\n"
+                               << "  }\n";
+               }
+       }
+       else
+       {
+               bdy     << "  uint firstActive = 0;\n"
+                       << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                       << "  {\n"
+                       << "    if (subgroupBallotBitExtract(mask, i))\n"
+                       << "    {\n"
+                       << "      firstActive = i;\n"
+                       << "      break;\n"
+                       << "    }\n"
+                       << "  }\n"
+                       << "  tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x1 : 0;\n"
+                       << "  // make the firstActive invocation inactive now\n"
+                       << "  if (firstActive == gl_SubgroupInvocationID)\n"
+                       << "  {\n"
+                       << "    for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                       << "    {\n"
+                       << "      if (subgroupBallotBitExtract(mask, i))\n"
+                       << "      {\n"
+                       << "        firstActive = i;\n"
+                       << "        break;\n"
+                       << "      }\n"
+                       << "    }\n"
+                       << "    tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x2 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    // the firstActive invocation didn't partake in the second result so set it to true\n"
+                       << "    tempResult |= 0x2;\n"
+                       << "  }\n";
+       }
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[offset] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                        << "{\n"
+                        << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                        << "};\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << "  uvec4 mask = subgroupBallot(true);\n"
+                        << bdy.str()
+                        << "  result = tempResult;\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_VertexIndex] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveIDIn] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+       }
+
+       if (subgroups::isDoubleFormat(caseDef.format) &&
+                       !subgroups::isDoubleSupportedForDevice(context))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  inputData, 1, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT,
+                                                                                 inputData, 1, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT,
+                                                                                inputData, 1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT,
+                                                                                  inputData, 1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT,
+                               inputData, 1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT,
+                               inputData, 1, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "ballot_broadcast", "Subgroup ballot broadcast category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       const VkFormat formats[] =
+       {
+               VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
+               VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
+               VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
+               VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
+               VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
+               VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
+               VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
+               VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
+               VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+               {
+                       const VkFormat format = formats[formatIndex];
+
+                       for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+                       {
+                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+
+                               std::ostringstream name;
+
+                               std::string op = getOpTypeName(opTypeIndex);
+
+                               name << de::toLower(op) << "_" << subgroups::getFormatNameForGLSL(format)
+                                         << "_" << getShaderStageName(stage);
+
+                               addFunctionCaseWithPrograms(group.get(), name.str(),
+                                                                                       "", initPrograms, test, caseDef);
+                       }
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.hpp
new file mode 100644 (file)
index 0000000..a2352f9
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSBALLOTBROADCASTTESTS_HPP
+#define _VKTSUBGROUPSBALLOTBROADCASTTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSBALLOTBROADCASTTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
new file mode 100644 (file)
index 0000000..9b89b0f
--- /dev/null
@@ -0,0 +1,571 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsBallotOtherTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+enum OpType
+{
+       OPTYPE_INVERSE_BALLOT = 0,
+       OPTYPE_BALLOT_BIT_EXTRACT,
+       OPTYPE_BALLOT_BIT_COUNT,
+       OPTYPE_BALLOT_INCLUSIVE_BIT_COUNT,
+       OPTYPE_BALLOT_EXCLUSIVE_BIT_COUNT,
+       OPTYPE_BALLOT_FIND_LSB,
+       OPTYPE_BALLOT_FIND_MSB,
+       OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0xf != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0xf != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0xf != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_INVERSE_BALLOT:
+                       return "subgroupInverseBallot";
+               case OPTYPE_BALLOT_BIT_EXTRACT:
+                       return "subgroupBallotBitExtract";
+               case OPTYPE_BALLOT_BIT_COUNT:
+                       return "subgroupBallotBitCount";
+               case OPTYPE_BALLOT_INCLUSIVE_BIT_COUNT:
+                       return "subgroupBallotInclusiveBitCount";
+               case OPTYPE_BALLOT_EXCLUSIVE_BIT_COUNT:
+                       return "subgroupBallotExclusiveBitCount";
+               case OPTYPE_BALLOT_FIND_LSB:
+                       return "subgroupBallotFindLSB";
+               case OPTYPE_BALLOT_FIND_MSB:
+                       return "subgroupBallotFindMSB";
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+
+       bdy << "  uvec4 allOnes = uvec4(0xFFFFFFFF);\n"
+               << "  uvec4 allZeros = uvec4(0);\n"
+               << "  uint tempResult = 0;\n"
+               << "#define MAKE_HIGH_BALLOT_RESULT(i) uvec4("
+               << "i >= 32 ? 0 : (0xFFFFFFFF << i), "
+               << "i >= 64 ? 0 : (0xFFFFFFFF << ((i < 32) ? 0 : (i - 32))), "
+               << "i >= 96 ? 0 : (0xFFFFFFFF << ((i < 64) ? 0 : (i - 64))), "
+               << " 0xFFFFFFFF << ((i < 96) ? 0 : (i - 96)))\n"
+               << "#define MAKE_SINGLE_BIT_BALLOT_RESULT(i) uvec4("
+               << "i >= 32 ? 0 : 0x1 << i, "
+               << "i < 32 || i >= 64 ? 0 : 0x1 << (i - 32), "
+               << "i < 64 || i >= 96 ? 0 : 0x1 << (i - 64), "
+               << "i < 96 ? 0 : 0x1 << (i - 96))\n";
+
+       switch (caseDef.opType)
+       {
+               default:
+                       DE_FATAL("Unknown op type!");
+               case OPTYPE_INVERSE_BALLOT:
+                       bdy << "  tempResult |= subgroupInverseBallot(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= subgroupInverseBallot(allZeros) ? 0 : 0x2;\n"
+                               << "  tempResult |= subgroupInverseBallot(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n";
+                       break;
+               case OPTYPE_BALLOT_BIT_EXTRACT:
+                       bdy << "  tempResult |= subgroupBallotBitExtract(allOnes, gl_SubgroupInvocationID) ? 0x1 : 0;\n"
+                               << "  tempResult |= subgroupBallotBitExtract(allZeros, gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  tempResult |= subgroupBallotBitExtract(subgroupBallot(true), gl_SubgroupInvocationID) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                               << "  {\n"
+                               << "    if (!subgroupBallotBitExtract(allOnes, gl_SubgroupInvocationID))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_BIT_COUNT:
+                       bdy << "  tempResult |= gl_SubgroupSize == subgroupBallotBitCount(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotBitCount(allZeros) ? 0x2 : 0;\n"
+                               << "  tempResult |= 0 < subgroupBallotBitCount(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotBitCount(MAKE_HIGH_BALLOT_RESULT(gl_SubgroupSize)) ? 0x8 : 0;\n";
+                       break;
+               case OPTYPE_BALLOT_INCLUSIVE_BIT_COUNT:
+                       bdy << "  uint inclusiveOffset = gl_SubgroupInvocationID + 1;\n"
+                               << "  tempResult |= inclusiveOffset == subgroupBallotInclusiveBitCount(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotInclusiveBitCount(allZeros) ? 0x2 : 0;\n"
+                               << "  tempResult |= 0 < subgroupBallotInclusiveBitCount(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  uvec4 inclusiveUndef = MAKE_HIGH_BALLOT_RESULT(inclusiveOffset);\n"
+                               << "  bool undefTerritory = false;\n"
+                               << "  for (uint i = 0; i <= 128; i++)\n"
+                               << "  {\n"
+                               << "    uvec4 iUndef = MAKE_HIGH_BALLOT_RESULT(i);\n"
+                               << "    if (iUndef == inclusiveUndef)"
+                               << "    {\n"
+                               << "      undefTerritory = true;\n"
+                               << "    }\n"
+                               << "    uint inclusiveBitCount = subgroupBallotInclusiveBitCount(iUndef);\n"
+                               << "    if (undefTerritory && (0 != inclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "    else if (!undefTerritory && (0 == inclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_EXCLUSIVE_BIT_COUNT:
+                       bdy << "  uint exclusiveOffset = gl_SubgroupInvocationID;\n"
+                               << "  tempResult |= exclusiveOffset == subgroupBallotExclusiveBitCount(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotExclusiveBitCount(allZeros) ? 0x2 : 0;\n"
+                               << "  tempResult |= 0x4;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  uvec4 exclusiveUndef = MAKE_HIGH_BALLOT_RESULT(exclusiveOffset);\n"
+                               << "  bool undefTerritory = false;\n"
+                               << "  for (uint i = 0; i <= 128; i++)\n"
+                               << "  {\n"
+                               << "    uvec4 iUndef = MAKE_HIGH_BALLOT_RESULT(i);\n"
+                               << "    if (iUndef == exclusiveUndef)"
+                               << "    {\n"
+                               << "      undefTerritory = true;\n"
+                               << "    }\n"
+                               << "    uint exclusiveBitCount = subgroupBallotExclusiveBitCount(iUndef);\n"
+                               << "    if (undefTerritory && (0 != exclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x4;\n"
+                               << "    }\n"
+                               << "    else if (!undefTerritory && (0 == exclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_FIND_LSB:
+                       bdy << "  tempResult |= 0 == subgroupBallotFindLSB(allOnes) ? 0x1 : 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    tempResult |= 0x2;\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    tempResult |= 0 < subgroupBallotFindLSB(subgroupBallot(true)) ? 0x2 : 0;\n"
+                               << "  }\n"
+                               << "  tempResult |= gl_SubgroupSize > subgroupBallotFindLSB(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                               << "  {\n"
+                               << "    if (i != subgroupBallotFindLSB(MAKE_HIGH_BALLOT_RESULT(i)))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_FIND_MSB:
+                       bdy << "  tempResult |= (gl_SubgroupSize - 1) == subgroupBallotFindMSB(allOnes) ? 0x1 : 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    tempResult |= 0x2;\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    tempResult |= 0 < subgroupBallotFindMSB(subgroupBallot(true)) ? 0x2 : 0;\n"
+                               << "  }\n"
+                               << "  tempResult |= gl_SubgroupSize > subgroupBallotFindMSB(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                               << "  {\n"
+                               << "    if (i != subgroupBallotFindMSB(MAKE_SINGLE_BIT_BALLOT_RESULT(i)))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+       }
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << bdy.str()
+                       << "  result[offset] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << bdy.str()
+                        << "  result = tempResult;\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_VertexIndex] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveIDIn] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                               subgroups::getShaderStageName(caseDef.shaderStage) +
+                               " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  DE_NULL, 0, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT,
+                                                                                 DE_NULL, 0, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT,
+                                                                                DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT,
+                                                                                  DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT,
+                               DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT,
+                               DE_NULL, 0, checkVertexPipelineStages);
+       }
+       return tcu::TestStatus::pass("OK");
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsBallotOtherTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "ballot_other", "Subgroup ballot other category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+               {
+                       CaseDefinition caseDef = {opTypeIndex, stage};
+
+                       std::ostringstream name;
+
+                       std::string op = getOpTypeName(opTypeIndex);
+
+                       name << de::toLower(op) << "_" << getShaderStageName(stage);
+
+                       addFunctionCaseWithPrograms(group.get(), name.str(),
+                                                                               "", initPrograms, test, caseDef);
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.hpp
new file mode 100644 (file)
index 0000000..628e82b
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSBALLOTOTHERTESTS_HPP
+#define _VKTSUBGROUPSBALLOTOTHERTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsBallotOtherTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSBALLOTOTHERTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
new file mode 100644 (file)
index 0000000..c8c9f54
--- /dev/null
@@ -0,0 +1,473 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsBallotTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x7 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0x7 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x7 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+struct CaseDefinition
+{
+       VkShaderStageFlags shaderStage;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  uint data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << subgroups::getSharedMemoryBallotHelper()
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << "  uint tempResult = 0;\n"
+                       << "  tempResult |= sharedMemoryBallot(true) == subgroupBallot(true) ? 0x1 : 0;\n"
+                       << "  bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+                       << "  tempResult |= sharedMemoryBallot(bData) == subgroupBallot(bData) ? 0x2 : 0;\n"
+                       << "  tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+                       << "  result[offset] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                        << "{\n"
+                        << "  uint data[];\n"
+                        << "};\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << "  uint tempResult = 0;\n"
+                        << "  tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
+                        << "  bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+                        << "  tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
+                        << "  tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+                        << "  result = tempResult;\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  uint data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uint tempResult = 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
+                       << "  bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
+                       << "  tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+                       << "  result[gl_VertexIndex] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  uint data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uint tempResult = 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
+                       << "  bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
+                       << "  tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+                       << "  result[gl_PrimitiveIDIn] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  uint data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uint tempResult = 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
+                       << "  bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
+                       << "  tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+                       << "  result[gl_PrimitiveID] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  uint data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uint tempResult = 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
+                       << "  bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
+                       << "  tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = VK_FORMAT_R32_UINT;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  inputData, 1, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = VK_FORMAT_R32_UINT;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT,
+                                                                                 inputData, 1, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = VK_FORMAT_R32_UINT;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT,
+                                                                                inputData, 1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = VK_FORMAT_R32_UINT;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT,
+                                                                                  inputData, 1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = VK_FORMAT_R32_UINT;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT,
+                               inputData, 1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = VK_FORMAT_R32_UINT;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT,
+                               inputData, 1, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsBallotTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "ballot", "Subgroup ballot category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               CaseDefinition caseDef = {stage};
+
+               std::ostringstream name;
+
+               name << getShaderStageName(stage);
+
+               addFunctionCaseWithPrograms(group.get(), name.str(),
+                                                                       "", initPrograms, test, caseDef);
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.hpp
new file mode 100644 (file)
index 0000000..9fa927d
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSBALLOTTESTS_HPP
+#define _VKTSUBGROUPSBALLOTTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsBallotTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSBALLOTTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
new file mode 100644 (file)
index 0000000..16c8e25
--- /dev/null
@@ -0,0 +1,1136 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsBasicTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+static const deUint32 ELECTED_VALUE = 42;
+static const deUint32 UNELECTED_VALUE = 13;
+
+static bool checkFragmentSubgroupElect(std::vector<const void*> datas,
+                                                                          deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* const resultData =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       deUint32 poisonValuesFound = 0;
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = resultData[y * width + x];
+
+                       switch (val)
+                       {
+                               default:
+                                       // some garbage value was found!
+                                       return false;
+                               case UNELECTED_VALUE:
+                                       break;
+                               case ELECTED_VALUE:
+                                       poisonValuesFound++;
+                                       break;
+                       }
+               }
+       }
+
+       // we used an atomicly incremented counter to note how many subgroups we used for the fragment shader
+       const deUint32 numSubgroupsUsed =
+               *reinterpret_cast<const deUint32*>(datas[1]);
+
+       return numSubgroupsUsed == poisonValuesFound;
+}
+
+static bool checkFragmentSubgroupBarriers(std::vector<const void*> datas,
+               deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* const resultData = reinterpret_cast<const deUint32*>(datas[0]);
+
+       // We used this SSBO to generate our unique value!
+       const deUint32 ref = *reinterpret_cast<const deUint32*>(datas[3]);
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = resultData[x * height + y];
+
+                       if (val != ref)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkVertexPipelineStagesSubgroupElect(std::vector<const void*> datas,
+               deUint32 width, deUint32)
+{
+       const deUint32* const resultData =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       deUint32 poisonValuesFound = 0;
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = resultData[x];
+
+               switch (val)
+               {
+                       default:
+                               // some garbage value was found!
+                               return false;
+                       case UNELECTED_VALUE:
+                               break;
+                       case ELECTED_VALUE:
+                               poisonValuesFound++;
+                               break;
+               }
+       }
+
+       // we used an atomicly incremented counter to note how many subgroups we used for the vertex shader
+       const deUint32 numSubgroupsUsed =
+               *reinterpret_cast<const deUint32*>(datas[1]);
+
+       return numSubgroupsUsed == poisonValuesFound;
+}
+
+static bool checkVertexPipelineStagesSubgroupBarriers(std::vector<const void*> datas,
+               deUint32 width, deUint32)
+{
+       const deUint32* const resultData = reinterpret_cast<const deUint32*>(datas[0]);
+
+       // We used this SSBO to generate our unique value!
+       const deUint32 ref = *reinterpret_cast<const deUint32*>(datas[3]);
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = resultData[x];
+
+               if (val != ref)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkComputeSubgroupElect(std::vector<const void*> datas,
+                                                                         const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                                         deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+                                                       if (1 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkComputeSubgroupBarriers(std::vector<const void*> datas,
+               const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+               deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       // We used this SSBO to generate our unique value!
+       const deUint32 ref = *reinterpret_cast<const deUint32*>(datas[2]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (ref != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+enum OpType
+{
+       OPTYPE_ELECT = 0,
+       OPTYPE_SUBGROUP_BARRIER,
+       OPTYPE_SUBGROUP_MEMORY_BARRIER,
+       OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER,
+       OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED,
+       OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE,
+       OPTYPE_LAST
+};
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_ELECT:
+                       return "subgroupElect";
+               case OPTYPE_SUBGROUP_BARRIER:
+                       return "subgroupBarrier";
+               case OPTYPE_SUBGROUP_MEMORY_BARRIER:
+                       return "subgroupMemoryBarrier";
+               case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
+                       return "subgroupMemoryBarrierBuffer";
+               case OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED:
+                       return "subgroupMemoryBarrierShared";
+               case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
+                       return "subgroupMemoryBarrierImage";
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       if (OPTYPE_ELECT == caseDef.opType)
+       {
+               if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+               {
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                               "local_size_z_id = 2) in;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "\n"
+                               << subgroups::getSharedMemoryBallotHelper()
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                               << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                               "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                               "gl_GlobalInvocationID.x;\n"
+                               << "  uint value = " << UNELECTED_VALUE << ";\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    value = " << ELECTED_VALUE << ";\n"
+                               << "  }\n"
+                               << "  uvec4 bits = bitCount(sharedMemoryBallot(value == " << ELECTED_VALUE << "));\n"
+                               << "  result[offset] = bits.x + bits.y + bits.z + bits.w;\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("comp")
+                                       << glu::ComputeSource(src.str());
+               }
+               else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       std::ostringstream frag;
+
+                       frag << "#version 450\n"
+                                << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                                << "layout(location = 0) out uint data;\n"
+                                << "layout(set = 0, binding = 0, std430) buffer Buffer\n"
+                                << "{\n"
+                                << "  uint numSubgroupsExecuted;\n"
+                                << "};\n"
+                                << "void main (void)\n"
+                                << "{\n"
+                                << "  if (gl_HelperInvocation) return;\n"
+                                << "  if (subgroupElect())\n"
+                                << "  {\n"
+                                << "    data = " << ELECTED_VALUE << ";\n"
+                                << "    atomicAdd(numSubgroupsExecuted, 1);\n"
+                                << "  }\n"
+                                << "  else\n"
+                                << "  {\n"
+                                << "    data = " << UNELECTED_VALUE << ";\n"
+                                << "  }\n"
+                                << "}\n";
+
+                       programCollection.glslSources.add("frag")
+                                       << glu::FragmentSource(frag.str());
+               }
+               else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+               {
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint numSubgroupsExecuted;\n"
+                               << "};\n"
+                               << "\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    result[gl_VertexIndex] = " << ELECTED_VALUE << ";\n"
+                               << "    atomicAdd(numSubgroupsExecuted, 1);\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    result[gl_VertexIndex] = " << UNELECTED_VALUE << ";\n"
+                               << "  }\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(src.str());
+               }
+               else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "layout(points) in;\n"
+                               << "layout(points, max_vertices = 1) out;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint numSubgroupsExecuted;\n"
+                               << "};\n"
+                               << "\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    result[gl_PrimitiveIDIn] = " << ELECTED_VALUE << ";\n"
+                               << "    atomicAdd(numSubgroupsExecuted, 1);\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    result[gl_PrimitiveIDIn] = " << UNELECTED_VALUE << ";\n"
+                               << "  }\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("geom")
+                                       << glu::GeometrySource(src.str());
+               }
+               else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       programCollection.glslSources.add("tese")
+                                       << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "layout(vertices=1) out;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint numSubgroupsExecuted;\n"
+                               << "};\n"
+                               << "\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    result[gl_PrimitiveID] = " << ELECTED_VALUE << ";\n"
+                               << "    atomicAdd(numSubgroupsExecuted, 1);\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    result[gl_PrimitiveID] = " << UNELECTED_VALUE << ";\n"
+                               << "  }\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("tesc")
+                                       << glu::TessellationControlSource(src.str());
+               }
+               else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       programCollection.glslSources.add("tesc")
+                                       << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "layout(isolines) in;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint numSubgroupsExecuted;\n"
+                               << "};\n"
+                               << "\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = " << ELECTED_VALUE << ";\n"
+                               << "    atomicAdd(numSubgroupsExecuted, 1);\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = " << UNELECTED_VALUE << ";\n"
+                               << "  }\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("tese")
+                                       << glu::TessellationEvaluationSource(src.str());
+               }
+               else
+               {
+                       DE_FATAL("Unsupported shader stage");
+               }
+       }
+       else
+       {
+               std::ostringstream bdy;
+
+               switch (caseDef.opType)
+               {
+                       default:
+                               DE_FATAL("Unhandled op type!");
+                       case OPTYPE_SUBGROUP_BARRIER:
+                       case OPTYPE_SUBGROUP_MEMORY_BARRIER:
+                       case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
+                               bdy << "  if (subgroupElect())\n"
+                                       << "  {\n"
+                                       << "    tempBuffer[id] = value;\n"
+                                       << "  }\n"
+                                       << "  " << getOpTypeName(caseDef.opType) << "();\n"
+                                       << "  tempResult = tempBuffer[id];\n";
+                               break;
+                       case OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED:
+                               bdy << "  if (subgroupElect())\n"
+                                       << "  {\n"
+                                       << "    tempShared[localId] = value;\n"
+                                       << "  }\n"
+                                       << "  subgroupMemoryBarrierShared();\n"
+                                       << "  tempResult = tempShared[localId];\n";
+                               break;
+                       case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
+                               bdy << "  if (subgroupElect())\n"
+                                       << "  {\n"
+                                       << "    imageStore(tempImage, ivec2(id, 0), ivec4(value));\n"
+                                       << "  }\n"
+                                       << "  subgroupMemoryBarrierImage();\n"
+                                       << "  tempResult = imageLoad(tempImage, ivec2(id, 0)).x;\n";
+                               break;
+               }
+
+               if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+               {
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                               "local_size_z_id = 2) in;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint tempBuffer[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                               << "{\n"
+                               << "  uint value;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 3, r32ui) uniform uimage2D tempImage;\n"
+                               << "shared uint tempShared[gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z];\n"
+                               << "\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                               << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                               "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                               "gl_GlobalInvocationID.x;\n"
+                               << "  uint localId = gl_SubgroupID;\n"
+                               << "  uint id = globalSize.x * ((globalSize.y * "
+                               "gl_WorkGroupID.z) + gl_WorkGroupID.y) + "
+                               "gl_WorkGroupID.x + localId;\n"
+                               << "  uint tempResult = 0;\n"
+                               << bdy.str()
+                               << "  result[offset] = tempResult;\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("comp")
+                                       << glu::ComputeSource(src.str());
+               }
+               else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       std::ostringstream frag;
+
+                       frag << "#version 450\n"
+                                << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                                << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                                << "layout(location = 0) out uint result;\n"
+                                << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                                << "{\n"
+                                << "  uint tempBuffer[];\n"
+                                << "};\n"
+                                << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                                << "{\n"
+                                << "  uint subgroupID;\n"
+                                << "};\n"
+                                << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                                << "{\n"
+                                << "  uint value;\n"
+                                << "};\n"
+                                << "layout(set = 0, binding = 3, r32ui) uniform uimage2D tempImage;\n"
+                                << "void main (void)\n"
+                                << "{\n"
+                                << "  if (gl_HelperInvocation) return;\n"
+                                << "  uint id = 0;\n"
+                                << "  if (subgroupElect())\n"
+                                << "  {\n"
+                                << "    id = atomicAdd(subgroupID, 1);\n"
+                                << "  }\n"
+                                << "  id = subgroupBroadcastFirst(id);\n"
+                                << "  uint localId = id;\n"
+                                << "  uint tempResult = 0;\n"
+                                << bdy.str()
+                                << "  result = tempResult;\n"
+                                << "}\n";
+
+                       programCollection.glslSources.add("frag")
+                                       << glu::FragmentSource(frag.str());
+               }
+               else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+               {
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint tempBuffer[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                               << "{\n"
+                               << "  uint subgroupID;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 3, std430) buffer Buffer4\n"
+                               << "{\n"
+                               << "  uint value;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 4, r32ui) uniform uimage2D tempImage;\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  uint id = 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    id = atomicAdd(subgroupID, 1);\n"
+                               << "  }\n"
+                               << "  id = subgroupBroadcastFirst(id);\n"
+                               << "  uint localId = id;\n"
+                               << "  uint tempResult = 0;\n"
+                               << bdy.str()
+                               << "  result[gl_VertexIndex] = tempResult;\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(src.str());
+               }
+               else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                               << "layout(points) in;\n"
+                               << "layout(points, max_vertices = 1) out;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint tempBuffer[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                               << "{\n"
+                               << "  uint subgroupID;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 3, std430) buffer Buffer4\n"
+                               << "{\n"
+                               << "  uint value;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 4, r32ui) uniform uimage2D tempImage;\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  uint id = 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    id = atomicAdd(subgroupID, 1);\n"
+                               << "  }\n"
+                               << "  id = subgroupBroadcastFirst(id);\n"
+                               << "  uint localId = id;\n"
+                               << "  uint tempResult = 0;\n"
+                               << bdy.str()
+                               << "  result[gl_PrimitiveIDIn] = tempResult;\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("geom")
+                                       << glu::GeometrySource(src.str());
+               }
+               else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       programCollection.glslSources.add("tese")
+                                       << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                               << "layout(vertices=1) out;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint tempBuffer[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                               << "{\n"
+                               << "  uint subgroupID;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 3, std430) buffer Buffer4\n"
+                               << "{\n"
+                               << "  uint value;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 4, r32ui) uniform uimage2D tempImage;\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  uint id = 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    id = atomicAdd(subgroupID, 1);\n"
+                               << "  }\n"
+                               << "  id = subgroupBroadcastFirst(id);\n"
+                               << "  uint localId = id;\n"
+                               << "  uint tempResult = 0;\n"
+                               << bdy.str()
+                               << "  result[gl_PrimitiveID] = tempResult;\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("tesc")
+                                       << glu::TessellationControlSource(src.str());
+               }
+               else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+               {
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+                       programCollection.glslSources.add("tesc")
+                                       << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+                       std::ostringstream src;
+
+                       src << "#version 450\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                               << "layout(isolines) in;\n"
+                               << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                               << "{\n"
+                               << "  uint result[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                               << "{\n"
+                               << "  uint tempBuffer[];\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                               << "{\n"
+                               << "  uint subgroupID;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 3, std430) buffer Buffer4\n"
+                               << "{\n"
+                               << "  uint value;\n"
+                               << "};\n"
+                               << "layout(set = 0, binding = 4, r32ui) uniform uimage2D tempImage;\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  uint id = 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    id = atomicAdd(subgroupID, 1);\n"
+                               << "  }\n"
+                               << "  id = subgroupBroadcastFirst(id);\n"
+                               << "  uint localId = id;\n"
+                               << "  uint tempResult = 0;\n"
+                               << bdy.str()
+                               << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("tese")
+                                       << glu::TessellationEvaluationSource(src.str());
+               }
+               else
+               {
+                       DE_FATAL("Unsupported shader stage");
+               }
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BASIC_BIT))
+       {
+               return tcu::TestStatus::fail(
+                                  "Subgroup feature " +
+                                  subgroups::getShaderStageName(VK_SUBGROUP_FEATURE_BASIC_BIT) +
+                                  " is a required capability!");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               if (!subgroups::isFragmentSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Subgroup basic operation require that the fragment stage be able to write to SSBOs!");
+               }
+
+               if (OPTYPE_ELECT != caseDef.opType)
+               {
+                       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+                       {
+                               TCU_THROW(NotSupportedError, "Subgroup basic operation fragment stage test required that ballot operations are supported!");
+                       }
+               }
+
+               if (OPTYPE_ELECT == caseDef.opType)
+               {
+                       subgroups::SSBOData inputData;
+                       inputData.format = VK_FORMAT_R32_UINT;
+                       inputData.numElements = 1;
+                       inputData.initializeType = subgroups::SSBOData::InitializeZero;
+
+                       return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                          &inputData, 1, checkFragmentSubgroupElect);
+               }
+               else
+               {
+                       const deUint32 inputDatasCount = 4;
+                       subgroups::SSBOData inputDatas[inputDatasCount];
+                       inputDatas[0].format = VK_FORMAT_R32_UINT;
+                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[1].format = VK_FORMAT_R32_UINT;
+                       inputDatas[1].numElements = 1;
+                       inputDatas[1].initializeType = subgroups::SSBOData::InitializeZero;
+
+                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                       inputDatas[2].numElements = 1;
+                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[3].format = VK_FORMAT_R32_UINT;
+                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
+                       inputDatas[3].isImage = true;
+
+                       return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                          inputDatas, inputDatasCount, checkFragmentSubgroupBarriers);
+
+               }
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               if (OPTYPE_ELECT == caseDef.opType)
+               {
+                       return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT,
+                                                                                         DE_NULL, 0, checkComputeSubgroupElect);
+               }
+               else
+               {
+                       const deUint32 inputDatasCount = 3;
+                       subgroups::SSBOData inputDatas[inputDatasCount];
+                       inputDatas[0].format = VK_FORMAT_R32_UINT;
+                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].initializeType = subgroups::SSBOData::InitializeNone;
+
+                       inputDatas[1].format = VK_FORMAT_R32_UINT;
+                       inputDatas[1].numElements = 1;
+                       inputDatas[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                       inputDatas[2].numElements = 128 * 128;
+                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNone;
+                       inputDatas[2].isImage = true;
+
+                       return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT,
+                                                                                         inputDatas, inputDatasCount, checkComputeSubgroupBarriers);
+               }
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               if (OPTYPE_ELECT == caseDef.opType)
+               {
+                       subgroups::SSBOData inputData;
+                       inputData.format = VK_FORMAT_R32_UINT;
+                       inputData.numElements = 1;
+                       inputData.initializeType = subgroups::SSBOData::InitializeZero;
+
+                       return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT,
+                                                                                        &inputData, 1, checkVertexPipelineStagesSubgroupElect);
+               }
+               else
+               {
+                       const deUint32 inputDatasCount = 4;
+                       subgroups::SSBOData inputDatas[inputDatasCount];
+                       inputDatas[0].format = VK_FORMAT_R32_UINT;
+                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[1].format = VK_FORMAT_R32_UINT;
+                       inputDatas[1].numElements = 1;
+                       inputDatas[1].initializeType = subgroups::SSBOData::InitializeZero;
+
+                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                       inputDatas[2].numElements = 1;
+                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[3].format = VK_FORMAT_R32_UINT;
+                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
+                       inputDatas[3].isImage = true;
+
+                       return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT,
+                                                                                        inputDatas, inputDatasCount, checkVertexPipelineStagesSubgroupBarriers);
+               }
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               if (OPTYPE_ELECT == caseDef.opType)
+               {
+                       subgroups::SSBOData inputData;
+                       inputData.format = VK_FORMAT_R32_UINT;
+                       inputData.numElements = 1;
+                       inputData.initializeType = subgroups::SSBOData::InitializeZero;
+
+                       return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT,
+                                                                                          &inputData, 1, checkVertexPipelineStagesSubgroupElect);
+               }
+               else
+               {
+                       const deUint32 inputDatasCount = 4;
+                       subgroups::SSBOData inputDatas[inputDatasCount];
+                       inputDatas[0].format = VK_FORMAT_R32_UINT;
+                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[1].format = VK_FORMAT_R32_UINT;
+                       inputDatas[1].numElements = 1;
+                       inputDatas[1].initializeType = subgroups::SSBOData::InitializeZero;
+
+                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                       inputDatas[2].numElements = 1;
+                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[3].format = VK_FORMAT_R32_UINT;
+                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
+                       inputDatas[3].isImage = true;
+
+                       return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT,
+                                                                                          inputDatas, inputDatasCount, checkVertexPipelineStagesSubgroupBarriers);
+               }
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               if (OPTYPE_ELECT == caseDef.opType)
+               {
+                       subgroups::SSBOData inputData;
+                       inputData.format = VK_FORMAT_R32_UINT;
+                       inputData.numElements = 1;
+                       inputData.initializeType = subgroups::SSBOData::InitializeZero;
+
+                       return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT,
+                                       &inputData, 1, checkVertexPipelineStagesSubgroupElect);
+               }
+               else
+               {
+                       const deUint32 inputDatasCount = 4;
+                       subgroups::SSBOData inputDatas[inputDatasCount];
+                       inputDatas[0].format = VK_FORMAT_R32_UINT;
+                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[1].format = VK_FORMAT_R32_UINT;
+                       inputDatas[1].numElements = 1;
+                       inputDatas[1].initializeType = subgroups::SSBOData::InitializeZero;
+
+                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                       inputDatas[2].numElements = 1;
+                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[3].format = VK_FORMAT_R32_UINT;
+                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
+                       inputDatas[3].isImage = true;
+
+                       return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT,
+                                       inputDatas, inputDatasCount, checkVertexPipelineStagesSubgroupBarriers);
+               }
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               if (OPTYPE_ELECT == caseDef.opType)
+               {
+                       subgroups::SSBOData inputData;
+                       inputData.format = VK_FORMAT_R32_UINT;
+                       inputData.numElements = 1;
+                       inputData.initializeType = subgroups::SSBOData::InitializeZero;
+
+                       return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT,
+                                       &inputData, 1, checkVertexPipelineStagesSubgroupElect);
+               }
+               else
+               {
+                       const deUint32 inputDatasCount = 4;
+                       subgroups::SSBOData inputDatas[inputDatasCount];
+                       inputDatas[0].format = VK_FORMAT_R32_UINT;
+                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[1].format = VK_FORMAT_R32_UINT;
+                       inputDatas[1].numElements = 1;
+                       inputDatas[1].initializeType = subgroups::SSBOData::InitializeZero;
+
+                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                       inputDatas[2].numElements = 1;
+                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       inputDatas[3].format = VK_FORMAT_R32_UINT;
+                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
+                       inputDatas[3].isImage = true;
+
+                       return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT,
+                                       inputDatas, inputDatasCount, checkVertexPipelineStagesSubgroupBarriers);
+               }
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "basic", "Subgroup basic category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+               {
+                       if ((OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED == opTypeIndex) &&
+                                       (VK_SHADER_STAGE_COMPUTE_BIT != stage))
+                       {
+                               // Shared isn't available in non compute shaders.
+                               continue;
+                       }
+
+                       CaseDefinition caseDef = {opTypeIndex, stage};
+
+                       std::string op = getOpTypeName(opTypeIndex);
+
+                       addFunctionCaseWithPrograms(group.get(),
+                                                                               de::toLower(op) +
+                                                                               "_" + getShaderStageName(stage), "",
+                                                                               initPrograms, test, caseDef);
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.hpp
new file mode 100644 (file)
index 0000000..5e3639a
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSBASICTESTS_HPP
+#define _VKTSUBGROUPSBASICTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSBASICTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp
new file mode 100644 (file)
index 0000000..58aef72
--- /dev/null
@@ -0,0 +1,449 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsBuiltinMaskVarTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+
+namespace vkt
+{
+namespace subgroups
+{
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x1 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[(x * height + y)];
+
+                       if (0x1 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x1 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+namespace
+{
+struct CaseDefinition
+{
+       std::string varName;
+       VkShaderStageFlags shaderStage;
+};
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+
+       bdy << "  uint tempResult = 0x1;\n"
+               << "  uvec4 mask = subgroupBallot(true);\n"
+               << "  const uvec4 var = " << caseDef.varName << ";\n"
+               << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+               << "  {\n";
+
+       if ("gl_SubgroupEqMask" == caseDef.varName)
+       {
+               bdy << "    if ((i == gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+                       << "    {\n"
+                       << "      tempResult = 0;\n"
+                       << "    }\n";
+       }
+       else if ("gl_SubgroupGeMask" == caseDef.varName)
+       {
+               bdy << "    if ((i >= gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+                       << "    {\n"
+                       << "      tempResult = 0;\n"
+                       << "    }\n";
+       }
+       else if ("gl_SubgroupGtMask" == caseDef.varName)
+       {
+               bdy << "    if ((i > gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+                       << "    {\n"
+                       << "      tempResult = 0;\n"
+                       << "    }\n";
+       }
+       else if ("gl_SubgroupLeMask" == caseDef.varName)
+       {
+               bdy << "    if ((i <= gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+                       << "    {\n"
+                       << "      tempResult = 0;\n"
+                       << "    }\n";
+       }
+       else if ("gl_SubgroupLtMask" == caseDef.varName)
+       {
+               bdy << "    if ((i < gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
+                       << "    {\n"
+                       << "      tempResult = 0;\n"
+                       << "    }\n";
+       }
+
+       bdy << "  }\n";
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << bdy.str()
+                       << "  result[offset] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << bdy.str()
+                        << "  result = tempResult;\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_VertexIndex] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveIDIn] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " + getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               return makeComputeTest(
+                                  context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               return makeFragmentTest(
+                                  context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               return makeVertexTest(
+                                  context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               return makeGeometryTest(
+                                  context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               return makeTessellationControlTest(
+                                  context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               return makeTessellationEvaluationTest(
+                                  context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+
+tcu::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "builtin_mask_var", "Subgroup builtin mask variable tests"));
+
+       const char* const all_stages_vars[] =
+       {
+               "SubgroupEqMask",
+               "SubgroupGeMask",
+               "SubgroupGtMask",
+               "SubgroupLeMask",
+               "SubgroupLtMask",
+       };
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT,
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int a = 0; a < DE_LENGTH_OF_ARRAY(all_stages_vars); ++a)
+               {
+                       const std::string var = all_stages_vars[a];
+
+                       CaseDefinition caseDef = {"gl_" + var, stage};
+
+                       addFunctionCaseWithPrograms(group.get(),
+                                                                               de::toLower(var) + "_" +
+                                                                               getShaderStageName(stage), "",
+                                                                               initPrograms, test, caseDef);
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.hpp
new file mode 100644 (file)
index 0000000..98585ba
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSBUILTINMASKVARTESTS_HPP
+#define _VKTSUBGROUPSBUILTINMASKVARTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSBUILTINMASKVARTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp
new file mode 100644 (file)
index 0000000..7046047
--- /dev/null
@@ -0,0 +1,758 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsBuiltinVarTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+
+namespace vkt
+{
+namespace subgroups
+{
+static bool checkVertexPipelineStagesSubgroupSize(std::vector<const void*> datas,
+               deUint32 width, deUint32 subgroupSize)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x * 4];
+
+               if (subgroupSize != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkVertexPipelineStagesSubgroupInvocationID(
+       std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       vector<deUint32> subgroupInvocationHits(subgroupSize, 0);
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 subgroupInvocationID = data[(x * 4) + 1];
+
+               if (subgroupInvocationID >= subgroupSize)
+               {
+                       return false;
+               }
+
+               subgroupInvocationHits[subgroupInvocationID]++;
+       }
+
+       const deUint32 totalSize = width;
+
+       deUint32 totalInvocationsRun = 0;
+       for (deUint32 i = 0; i < subgroupSize; ++i)
+       {
+               totalInvocationsRun += subgroupInvocationHits[i];
+       }
+
+       if (totalInvocationsRun != totalSize)
+       {
+               return false;
+       }
+
+       return true;
+}
+
+static bool checkFragmentSubgroupSize(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32 height, deUint32 subgroupSize)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[(x * height + y) * 4];
+
+                       if (subgroupSize != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragmentSubgroupInvocationID(
+       std::vector<const void*> datas, deUint32 width, deUint32 height,
+       deUint32 subgroupSize)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       vector<deUint32> subgroupInvocationHits(subgroupSize, 0);
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 subgroupInvocationID = data[((x * height + y) * 4) + 1];
+
+                       if (subgroupInvocationID >= subgroupSize)
+                       {
+                               return false;
+                       }
+
+                       subgroupInvocationHits[subgroupInvocationID]++;
+               }
+       }
+
+       const deUint32 totalSize = width * height;
+
+       deUint32 totalInvocationsRun = 0;
+       for (deUint32 i = 0; i < subgroupSize; ++i)
+       {
+               totalInvocationsRun += subgroupInvocationHits[i];
+       }
+
+       if (totalInvocationsRun != totalSize)
+       {
+               return false;
+       }
+
+       return true;
+}
+
+static bool checkComputeSubgroupSize(std::vector<const void*> datas,
+                                                                        const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                                        deUint32 subgroupSize)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (subgroupSize != data[offset * 4])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkComputeSubgroupInvocationID(std::vector<const void*> datas,
+               const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+               deUint32 subgroupSize)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               const deUint32 totalLocalSize =
+                                       localSize[0] * localSize[1] * localSize[2];
+                               vector<deUint32> subgroupInvocationHits(subgroupSize, 0);
+
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       deUint32 subgroupInvocationID = data[(offset * 4) + 1];
+
+                                                       if (subgroupInvocationID >= subgroupSize)
+                                                       {
+                                                               return false;
+                                                       }
+
+                                                       subgroupInvocationHits[subgroupInvocationID]++;
+                                               }
+                                       }
+                               }
+
+                               deUint32 totalInvocationsRun = 0;
+                               for (deUint32 i = 0; i < subgroupSize; ++i)
+                               {
+                                       totalInvocationsRun += subgroupInvocationHits[i];
+                               }
+
+                               if (totalInvocationsRun != totalLocalSize)
+                               {
+                                       return false;
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkComputeNumSubgroups(std::vector<const void*> datas,
+                                                                        const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                                        deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               const deUint32 totalLocalSize =
+                                       localSize[0] * localSize[1] * localSize[2];
+
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       deUint32 numSubgroups = data[(offset * 4) + 2];
+
+                                                       if (numSubgroups > totalLocalSize)
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkComputeSubgroupID(std::vector<const void*> datas,
+                                                                  const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                                  deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       deUint32 numSubgroups = data[(offset * 4) + 2];
+                                                       deUint32 subgroupID = data[(offset * 4) + 3];
+
+                                                       if (subgroupID >= numSubgroups)
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+namespace
+{
+struct CaseDefinition
+{
+       std::string varName;
+       VkShaderStageFlags shaderStage;
+};
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uvec4 result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << "  result[offset] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, gl_NumSubgroups, gl_SubgroupID);\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                        << "layout(location = 0) out uvec4 data;\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << "  data = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uvec4 result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  result[gl_VertexIndex] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uvec4 result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uvec4 result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Output\n"
+                       << "{\n"
+                       << "  uvec4 result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (areSubgroupOperationsRequiredForStage(caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " + getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               if ("gl_SubgroupSize" == caseDef.varName)
+               {
+                       return makeComputeTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupSize);
+               }
+               else if ("gl_SubgroupInvocationID" == caseDef.varName)
+               {
+                       return makeComputeTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupInvocationID);
+               }
+               else if ("gl_NumSubgroups" == caseDef.varName)
+               {
+                       return makeComputeTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeNumSubgroups);
+               }
+               else if ("gl_SubgroupID" == caseDef.varName)
+               {
+                       return makeComputeTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupID);
+               }
+               else
+               {
+                       return tcu::TestStatus::fail(
+                                          caseDef.varName + " failed (unhandled error checking case " +
+                                          caseDef.varName + ")!");
+               }
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               if ("gl_SubgroupSize" == caseDef.varName)
+               {
+                       return makeFragmentTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkFragmentSubgroupSize);
+               }
+               else if ("gl_SubgroupInvocationID" == caseDef.varName)
+               {
+                       return makeFragmentTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkFragmentSubgroupInvocationID);
+               }
+               else
+               {
+                       return tcu::TestStatus::fail(
+                                          caseDef.varName + " failed (unhandled error checking case " +
+                                          caseDef.varName + ")!");
+               }
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               if ("gl_SubgroupSize" == caseDef.varName)
+               {
+                       return makeVertexTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+               }
+               else if ("gl_SubgroupInvocationID" == caseDef.varName)
+               {
+                       return makeVertexTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+               }
+               else
+               {
+                       return tcu::TestStatus::fail(
+                                          caseDef.varName + " failed (unhandled error checking case " +
+                                          caseDef.varName + ")!");
+               }
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               if ("gl_SubgroupSize" == caseDef.varName)
+               {
+                       return makeGeometryTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+               }
+               else if ("gl_SubgroupInvocationID" == caseDef.varName)
+               {
+                       return makeGeometryTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+               }
+               else
+               {
+                       return tcu::TestStatus::fail(
+                                          caseDef.varName + " failed (unhandled error checking case " +
+                                          caseDef.varName + ")!");
+               }
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               if ("gl_SubgroupSize" == caseDef.varName)
+               {
+                       return makeTessellationControlTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+               }
+               else if ("gl_SubgroupInvocationID" == caseDef.varName)
+               {
+                       return makeTessellationControlTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+               }
+               else
+               {
+                       return tcu::TestStatus::fail(
+                                          caseDef.varName + " failed (unhandled error checking case " +
+                                          caseDef.varName + ")!");
+               }
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               if ("gl_SubgroupSize" == caseDef.varName)
+               {
+                       return makeTessellationEvaluationTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+               }
+               else if ("gl_SubgroupInvocationID" == caseDef.varName)
+               {
+                       return makeTessellationEvaluationTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+               }
+               else
+               {
+                       return tcu::TestStatus::fail(
+                                          caseDef.varName + " failed (unhandled error checking case " +
+                                          caseDef.varName + ")!");
+               }
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+
+tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "builtin_var", "Subgroup builtin variable tests"));
+
+       const char* const all_stages_vars[] =
+       {
+               "SubgroupSize",
+               "SubgroupInvocationID"
+       };
+
+       const char* const compute_only_vars[] =
+       {
+               "NumSubgroups",
+               "SubgroupID"
+       };
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT,
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int a = 0; a < DE_LENGTH_OF_ARRAY(all_stages_vars); ++a)
+               {
+                       const std::string var = all_stages_vars[a];
+
+                       CaseDefinition caseDef = {"gl_" + var, stage};
+
+                       addFunctionCaseWithPrograms(group.get(),
+                                                                               de::toLower(var) + "_" +
+                                                                               getShaderStageName(stage), "",
+                                                                               initPrograms, test, caseDef);
+               }
+       }
+
+       for (int a = 0; a < DE_LENGTH_OF_ARRAY(compute_only_vars); ++a)
+       {
+               const VkShaderStageFlags stage = VK_SHADER_STAGE_COMPUTE_BIT;
+               const std::string var = compute_only_vars[a];
+
+               CaseDefinition caseDef = {"gl_" + var, stage};
+
+               addFunctionCaseWithPrograms(group.get(), de::toLower(var) +
+                                                                       "_" + getShaderStageName(stage), "",
+                                                                       initPrograms, test, caseDef);
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.hpp
new file mode 100644 (file)
index 0000000..f7a1dc8
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSBUILTINVARTESTS_HPP
+#define _VKTSUBGROUPSBUILTINVARTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSBUILTINVARTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
new file mode 100644 (file)
index 0000000..74b3f69
--- /dev/null
@@ -0,0 +1,829 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsClusteredTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+enum OpType
+{
+       OPTYPE_CLUSTERED_ADD = 0,
+       OPTYPE_CLUSTERED_MUL,
+       OPTYPE_CLUSTERED_MIN,
+       OPTYPE_CLUSTERED_MAX,
+       OPTYPE_CLUSTERED_AND,
+       OPTYPE_CLUSTERED_OR,
+       OPTYPE_CLUSTERED_XOR,
+       OPTYPE_CLUSTERED_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x1 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0x1 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x1 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_CLUSTERED_ADD:
+                       return "subgroupClusteredAdd";
+               case OPTYPE_CLUSTERED_MUL:
+                       return "subgroupClusteredMul";
+               case OPTYPE_CLUSTERED_MIN:
+                       return "subgroupClusteredMin";
+               case OPTYPE_CLUSTERED_MAX:
+                       return "subgroupClusteredMax";
+               case OPTYPE_CLUSTERED_AND:
+                       return "subgroupClusteredAnd";
+               case OPTYPE_CLUSTERED_OR:
+                       return "subgroupClusteredOr";
+               case OPTYPE_CLUSTERED_XOR:
+                       return "subgroupClusteredXor";
+       }
+}
+
+std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_CLUSTERED_ADD:
+                       return lhs + " + " + rhs;
+               case OPTYPE_CLUSTERED_MUL:
+                       return lhs + " * " + rhs;
+               case OPTYPE_CLUSTERED_MIN:
+                       switch (format)
+                       {
+                               default:
+                                       return "min(" + lhs + ", " + rhs + ")";
+                               case VK_FORMAT_R32_SFLOAT:
+                               case VK_FORMAT_R64_SFLOAT:
+                                       return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : min(" + lhs + ", " + rhs + ")))";
+                               case VK_FORMAT_R32G32_SFLOAT:
+                               case VK_FORMAT_R32G32B32_SFLOAT:
+                               case VK_FORMAT_R32G32B32A32_SFLOAT:
+                               case VK_FORMAT_R64G64_SFLOAT:
+                               case VK_FORMAT_R64G64B64_SFLOAT:
+                               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                                       return "mix(mix(min(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+                       }
+               case OPTYPE_CLUSTERED_MAX:
+                       switch (format)
+                       {
+                               default:
+                                       return "max(" + lhs + ", " + rhs + ")";
+                               case VK_FORMAT_R32_SFLOAT:
+                               case VK_FORMAT_R64_SFLOAT:
+                                       return "(isnan(" + lhs + ") ? " + rhs + " : (isnan(" + rhs + ") ? " + lhs + " : max(" + lhs + ", " + rhs + ")))";
+                               case VK_FORMAT_R32G32_SFLOAT:
+                               case VK_FORMAT_R32G32B32_SFLOAT:
+                               case VK_FORMAT_R32G32B32A32_SFLOAT:
+                               case VK_FORMAT_R64G64_SFLOAT:
+                               case VK_FORMAT_R64G64B64_SFLOAT:
+                               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                                       return "mix(mix(max(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
+                       }
+               case OPTYPE_CLUSTERED_AND:
+                       switch (format)
+                       {
+                               default:
+                                       return lhs + " & " + rhs;
+                               case VK_FORMAT_R8_USCALED:
+                                       return lhs + " && " + rhs;
+                               case VK_FORMAT_R8G8_USCALED:
+                                       return "bvec2(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y)";
+                               case VK_FORMAT_R8G8B8_USCALED:
+                                       return "bvec3(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z)";
+                               case VK_FORMAT_R8G8B8A8_USCALED:
+                                       return "bvec4(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z, " + lhs + ".w && " + rhs + ".w)";
+                       }
+               case OPTYPE_CLUSTERED_OR:
+                       switch (format)
+                       {
+                               default:
+                                       return lhs + " | " + rhs;
+                               case VK_FORMAT_R8_USCALED:
+                                       return lhs + " || " + rhs;
+                               case VK_FORMAT_R8G8_USCALED:
+                                       return "bvec2(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y)";
+                               case VK_FORMAT_R8G8B8_USCALED:
+                                       return "bvec3(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z)";
+                               case VK_FORMAT_R8G8B8A8_USCALED:
+                                       return "bvec4(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z, " + lhs + ".w || " + rhs + ".w)";
+                       }
+               case OPTYPE_CLUSTERED_XOR:
+                       switch (format)
+                       {
+                               default:
+                                       return lhs + " ^ " + rhs;
+                               case VK_FORMAT_R8_USCALED:
+                                       return lhs + " ^^ " + rhs;
+                               case VK_FORMAT_R8G8_USCALED:
+                                       return "bvec2(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y)";
+                               case VK_FORMAT_R8G8B8_USCALED:
+                                       return "bvec3(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z)";
+                               case VK_FORMAT_R8G8B8A8_USCALED:
+                                       return "bvec4(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z, " + lhs + ".w ^^ " + rhs + ".w)";
+                       }
+       }
+}
+
+
+std::string getIdentity(int opType, vk::VkFormat format)
+{
+       bool isFloat = false;
+       bool isInt = false;
+       bool isUnsigned = false;
+
+       switch (format)
+       {
+               default:
+                       DE_FATAL("Unhandled format!");
+               case VK_FORMAT_R32_SINT:
+               case VK_FORMAT_R32G32_SINT:
+               case VK_FORMAT_R32G32B32_SINT:
+               case VK_FORMAT_R32G32B32A32_SINT:
+                       isInt = true;
+                       break;
+               case VK_FORMAT_R32_UINT:
+               case VK_FORMAT_R32G32_UINT:
+               case VK_FORMAT_R32G32B32_UINT:
+               case VK_FORMAT_R32G32B32A32_UINT:
+                       isUnsigned = true;
+                       break;
+               case VK_FORMAT_R32_SFLOAT:
+               case VK_FORMAT_R32G32_SFLOAT:
+               case VK_FORMAT_R32G32B32_SFLOAT:
+               case VK_FORMAT_R32G32B32A32_SFLOAT:
+               case VK_FORMAT_R64_SFLOAT:
+               case VK_FORMAT_R64G64_SFLOAT:
+               case VK_FORMAT_R64G64B64_SFLOAT:
+               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       isFloat = true;
+                       break;
+               case VK_FORMAT_R8_USCALED:
+               case VK_FORMAT_R8G8_USCALED:
+               case VK_FORMAT_R8G8B8_USCALED:
+               case VK_FORMAT_R8G8B8A8_USCALED:
+                       break; // bool types are not anything
+       }
+
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_CLUSTERED_ADD:
+                       return subgroups::getFormatNameForGLSL(format) + "(0)";
+               case OPTYPE_CLUSTERED_MUL:
+                       return subgroups::getFormatNameForGLSL(format) + "(1)";
+               case OPTYPE_CLUSTERED_MIN:
+                       if (isFloat)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0x7f800000))";
+                       }
+                       else if (isInt)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0x7fffffff)";
+                       }
+                       else if (isUnsigned)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0xffffffffu)";
+                       }
+                       else
+                       {
+                               DE_FATAL("Unhandled case");
+                       }
+               case OPTYPE_CLUSTERED_MAX:
+                       if (isFloat)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(intBitsToFloat(0xff800000))";
+                       }
+                       else if (isInt)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0x80000000)";
+                       }
+                       else if (isUnsigned)
+                       {
+                               return subgroups::getFormatNameForGLSL(format) + "(0)";
+                       }
+                       else
+                       {
+                               DE_FATAL("Unhandled case");
+                       }
+               case OPTYPE_CLUSTERED_AND:
+                       return subgroups::getFormatNameForGLSL(format) + "(~0)";
+               case OPTYPE_CLUSTERED_OR:
+                       return subgroups::getFormatNameForGLSL(format) + "(0)";
+               case OPTYPE_CLUSTERED_XOR:
+                       return subgroups::getFormatNameForGLSL(format) + "(0)";
+       }
+}
+
+std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+{
+       std::string formatName = subgroups::getFormatNameForGLSL(format);
+       switch (format)
+       {
+               default:
+                       return "all(equal(" + lhs + ", " + rhs + "))";
+               case VK_FORMAT_R8_USCALED:
+               case VK_FORMAT_R32_UINT:
+               case VK_FORMAT_R32_SINT:
+                       return "(" + lhs + " == " + rhs + ")";
+               case VK_FORMAT_R32_SFLOAT:
+               case VK_FORMAT_R64_SFLOAT:
+                       switch (opType)
+                       {
+                               default:
+                                       return "(abs(" + lhs + " - " + rhs + ") < 0.00001)";
+                               case OPTYPE_CLUSTERED_MIN:
+                               case OPTYPE_CLUSTERED_MAX:
+                                       return "(" + lhs + " == " + rhs + ")";
+                       }
+               case VK_FORMAT_R32G32_SFLOAT:
+               case VK_FORMAT_R32G32B32_SFLOAT:
+               case VK_FORMAT_R32G32B32A32_SFLOAT:
+               case VK_FORMAT_R64G64_SFLOAT:
+               case VK_FORMAT_R64G64B64_SFLOAT:
+               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       switch (opType)
+                       {
+                               default:
+                                       return "all(lessThan(abs(" + lhs + " - " + rhs + "), " + formatName + "(0.00001)))";
+                               case OPTYPE_CLUSTERED_MIN:
+                               case OPTYPE_CLUSTERED_MAX:
+                                       return "all(equal(" + lhs + ", " + rhs + "))";
+                       }
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+       VkFormat format;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+
+       bdy << "  bool tempResult = true;\n";
+
+       for (deUint32 i = 1; i <= subgroups::maxSupportedSubgroupSize(); i *= 2)
+       {
+               bdy     << "  {\n"
+                       << "    const uint clusterSize = " << i << ";\n"
+                       << "    if (clusterSize <= gl_SubgroupSize)\n"
+                       << "    {\n"
+                       << "      " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID], clusterSize);\n"
+                       << "      for (uint clusterOffset = 0; clusterOffset < gl_SubgroupSize; clusterOffset += clusterSize)\n"
+                       << "      {\n"
+                       << "        " << subgroups::getFormatNameForGLSL(caseDef.format) << " ref = "
+                       << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+                       << "        for (uint index = clusterOffset; index < (clusterOffset + clusterSize); index++)\n"
+                       << "        {\n"
+                       << "          if (subgroupBallotBitExtract(mask, index))\n"
+                       << "          {\n"
+                       << "            ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+                       << "          }\n"
+                       << "        }\n"
+                       << "        if ((clusterOffset <= gl_SubgroupInvocationID) && (gl_SubgroupInvocationID < (clusterOffset + clusterSize)))\n"
+                       << "        {\n"
+                       << "          if (!" << getCompare(caseDef.opType, caseDef.format, "ref", "op") << ")\n"
+                       << "          {\n"
+                       << "            tempResult = false;\n"
+                       << "          }\n"
+                       << "        }\n"
+                       << "      }\n"
+                       << "    }\n"
+                       << "  }\n";
+       }
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[offset] = tempResult ? 1 : 0;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+                        << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "layout(set = 0, binding = 0, std430) buffer Buffer2\n"
+                        << "{\n"
+                        << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                        << "};\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << "  uvec4 mask = subgroupBallot(true);\n"
+                        << bdy.str()
+                        << "  result = tempResult ? 1 : 0;\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_VertexIndex] = tempResult ? 1 : 0;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveIDIn] = tempResult ? 1 : 0;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID] = tempResult ? 1 : 0;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult ? 1 : 0;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_CLUSTERED_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup clustered operations");
+       }
+
+       if (subgroups::isDoubleFormat(caseDef.format) &&
+                       !subgroups::isDoubleSupportedForDevice(context))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  &inputData, 1, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                 1, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                  1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else
+       {
+               return tcu::TestStatus::pass("Unhandled shader stage!");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "clustered", "Subgroup clustered category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       const VkFormat formats[] =
+       {
+               VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
+               VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
+               VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
+               VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
+               VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
+               VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
+               VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
+               VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
+               VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+               {
+                       const VkFormat format = formats[formatIndex];
+
+                       for (int opTypeIndex = 0; opTypeIndex < OPTYPE_CLUSTERED_LAST; ++opTypeIndex)
+                       {
+                               bool isBool = false;
+                               bool isFloat = false;
+
+                               switch (format)
+                               {
+                                       default:
+                                               break;
+                                       case VK_FORMAT_R32_SFLOAT:
+                                       case VK_FORMAT_R32G32_SFLOAT:
+                                       case VK_FORMAT_R32G32B32_SFLOAT:
+                                       case VK_FORMAT_R32G32B32A32_SFLOAT:
+                                       case VK_FORMAT_R64_SFLOAT:
+                                       case VK_FORMAT_R64G64_SFLOAT:
+                                       case VK_FORMAT_R64G64B64_SFLOAT:
+                                       case VK_FORMAT_R64G64B64A64_SFLOAT:
+                                               isFloat = true;
+                                               break;
+                                       case VK_FORMAT_R8_USCALED:
+                                       case VK_FORMAT_R8G8_USCALED:
+                                       case VK_FORMAT_R8G8B8_USCALED:
+                                       case VK_FORMAT_R8G8B8A8_USCALED:
+                                               isBool = true;
+                                               break;
+                               }
+
+                               bool isBitwiseOp = false;
+
+                               switch (opTypeIndex)
+                               {
+                                       default:
+                                               break;
+                                       case OPTYPE_CLUSTERED_AND:
+                                       case OPTYPE_CLUSTERED_OR:
+                                       case OPTYPE_CLUSTERED_XOR:
+                                               isBitwiseOp = true;
+                                               break;
+                               }
+
+                               if (isFloat && isBitwiseOp)
+                               {
+                                       // Skip float with bitwise category.
+                                       continue;
+                               }
+
+                               if (isBool && !isBitwiseOp)
+                               {
+                                       // Skip bool when its not the bitwise category.
+                                       continue;
+                               }
+
+                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+
+                               std::ostringstream name;
+
+                               std::string op = getOpTypeName(opTypeIndex);
+
+                               name << de::toLower(op)
+                                        << "_" << subgroups::getFormatNameForGLSL(format)
+                                        << "_" << getShaderStageName(stage);
+
+                               addFunctionCaseWithPrograms(group.get(), name.str(),
+                                                                                       "", initPrograms, test, caseDef);
+                       }
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.hpp
new file mode 100644 (file)
index 0000000..d1f518c
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSCLUSTEREDTESTS_HPP
+#define _VKTSUBGROUPSCLUSTEREDTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSCLUSTEREDTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
new file mode 100644 (file)
index 0000000..138f6be
--- /dev/null
@@ -0,0 +1,671 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsQuadTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+enum OpType
+{
+       OPTYPE_QUAD_BROADCAST = 0,
+       OPTYPE_QUAD_SWAP_HORIZONTAL,
+       OPTYPE_QUAD_SWAP_VERTICAL,
+       OPTYPE_QUAD_SWAP_DIAGONAL,
+       OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x1 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0x1 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x1 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_QUAD_BROADCAST:
+                       return "subgroupQuadBroadcast";
+               case OPTYPE_QUAD_SWAP_HORIZONTAL:
+                       return "subgroupQuadSwapHorizontal";
+               case OPTYPE_QUAD_SWAP_VERTICAL:
+                       return "subgroupQuadSwapVertical";
+               case OPTYPE_QUAD_SWAP_DIAGONAL:
+                       return "subgroupQuadSwapDiagonal";
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+       VkFormat format;
+       int direction;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string swapTable[OPTYPE_LAST];
+       swapTable[OPTYPE_QUAD_BROADCAST] = "";
+       swapTable[OPTYPE_QUAD_SWAP_HORIZONTAL] = "  const uint swapTable[4] = {1, 0, 3, 2};\n";
+       swapTable[OPTYPE_QUAD_SWAP_VERTICAL] = "  const uint swapTable[4] = {2, 3, 0, 1};\n";
+       swapTable[OPTYPE_QUAD_SWAP_DIAGONAL] = "  const uint swapTable[4] = {3, 2, 1, 0};\n";
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << swapTable[caseDef.opType];
+
+
+               if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+               }
+               else
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+               }
+
+               src << "  if (subgroupBallotBitExtract(mask, otherID))\n"
+                       << "  {\n"
+                       << "    result[offset] = (op == data[otherID]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[offset] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+                        << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "layout(set = 0, binding = 0, std430) buffer Buffer2\n"
+                        << "{\n"
+                        << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                        << "};\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << "  uvec4 mask = subgroupBallot(true);\n"
+                        << swapTable[caseDef.opType];
+
+               if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+               {
+                       frag << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                                << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+                                << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+
+               }
+               else
+               {
+                       frag << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                                << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+                                << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+               }
+
+               frag << "  if (subgroupBallotBitExtract(mask, otherID))\n"
+                        << "  {\n"
+                        << "    result = (op == data[otherID]) ? 1 : 0;\n"
+                        << "  }\n"
+                        << "  else\n"
+                        << "  {\n"
+                        << "    result = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                        << "  }\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << swapTable[caseDef.opType];
+
+               if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+               }
+               else
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+               }
+
+               src << "  if (subgroupBallotBitExtract(mask, otherID))\n"
+                       << "  {\n"
+                       << "    result[gl_VertexIndex] = (op == data[otherID]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_VertexIndex] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << swapTable[caseDef.opType];
+
+               if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+               }
+               else
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+               }
+
+               src << "  if (subgroupBallotBitExtract(mask, otherID))\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveIDIn] = (op == data[otherID]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveIDIn] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << swapTable[caseDef.opType];
+
+               if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+               }
+               else
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+               }
+
+               src << "  if (subgroupBallotBitExtract(mask, otherID))\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID] = (op == data[otherID]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << swapTable[caseDef.opType];
+
+               if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+               }
+               else
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+               }
+
+               src << "  if (subgroupBallotBitExtract(mask, otherID))\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = (op == data[otherID]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_QUAD_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup quad operations");
+       }
+
+       if (subgroups::isDoubleFormat(caseDef.format) &&
+                       !subgroups::isDoubleSupportedForDevice(context))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  &inputData, 1, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                 1, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                  1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "quad", "Subgroup quad category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       const VkFormat formats[] =
+       {
+               VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
+               VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
+               VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
+               VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
+               VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
+               VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
+               VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
+               VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
+               VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
+       };
+
+       for (int direction = 0; direction < 4; ++direction)
+       {
+               for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+               {
+                       const VkShaderStageFlags stage = stages[stageIndex];
+
+                       for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+                       {
+                               const VkFormat format = formats[formatIndex];
+
+                               for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+                               {
+                                       CaseDefinition caseDef = {opTypeIndex, stage, format, direction};
+
+                                       std::ostringstream name;
+
+                                       std::string op = getOpTypeName(opTypeIndex);
+
+                                       name << de::toLower(op);
+
+                                       if (OPTYPE_QUAD_BROADCAST == opTypeIndex)
+                                       {
+                                               name << "_" << direction;
+                                       }
+                                       else
+                                       {
+                                               if (0 != direction)
+                                               {
+                                                       // We don't need direction for swap operations.
+                                                       continue;
+                                               }
+                                       }
+
+                                       name << "_" << subgroups::getFormatNameForGLSL(format)
+                                                << "_" << getShaderStageName(stage);
+
+                                       addFunctionCaseWithPrograms(group.get(), name.str(),
+                                                                                               "", initPrograms, test, caseDef);
+                               }
+                       }
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.hpp
new file mode 100644 (file)
index 0000000..6bc23a6
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSQUADTESTS_HPP
+#define _VKTSUBGROUPSQUADTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSQUADTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
new file mode 100644 (file)
index 0000000..46aed4f
--- /dev/null
@@ -0,0 +1,499 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsShapeTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* const resultData = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = resultData[(x * height + y)];
+
+                       if (0x1 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* const resultData = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = resultData[x];
+
+               if (0x1 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x1 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+enum OpType
+{
+       OPTYPE_CLUSTERED = 0,
+       OPTYPE_QUAD,
+       OPTYPE_LAST
+};
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_CLUSTERED:
+                       return "clustered";
+               case OPTYPE_QUAD:
+                       return "quad";
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string extension = (OPTYPE_CLUSTERED == caseDef.opType) ?
+                                                       "#extension GL_KHR_shader_subgroup_clustered: enable\n" :
+                                                       "#extension GL_KHR_shader_subgroup_quad: enable\n";
+
+       extension += "#extension GL_KHR_shader_subgroup_ballot: enable\n";
+
+       std::ostringstream bdy;
+
+       bdy << "  uint tempResult = 0x1;\n"
+               << "  uvec4 mask = subgroupBallot(true);\n";
+
+       if (OPTYPE_CLUSTERED == caseDef.opType)
+       {
+               for (deUint32 i = 1; i <= subgroups::maxSupportedSubgroupSize(); i *= 2)
+               {
+                       bdy << "  if (gl_SubgroupSize >= " << i << ")\n"
+                               << "  {\n"
+                               << "    uvec4 contribution = uvec4(0);\n"
+                               << "    const uint modID = gl_SubgroupInvocationID % 32;\n"
+                               << "    switch (gl_SubgroupInvocationID / 32)\n"
+                               << "    {\n"
+                               << "    case 0: contribution.x = 1 << modID; break;\n"
+                               << "    case 1: contribution.y = 1 << modID; break;\n"
+                               << "    case 2: contribution.z = 1 << modID; break;\n"
+                               << "    case 3: contribution.w = 1 << modID; break;\n"
+                               << "    }\n"
+                               << "    uvec4 result = subgroupClusteredOr(contribution, " << i << ");\n"
+                               << "    uint rootID = gl_SubgroupInvocationID & ~(" << i - 1 << ");\n"
+                               << "    for (uint i = 0; i < " << i << "; i++)\n"
+                               << "    {\n"
+                               << "      uint nextID = rootID + i;\n"
+                               << "      if (subgroupBallotBitExtract(mask, nextID) ^^ subgroupBallotBitExtract(result, nextID))\n"
+                               << "      {\n"
+                               << "        tempResult = 0;\n"
+                               << "      }\n"
+                               << "    }\n"
+                               << "  }\n";
+               }
+       }
+       else
+       {
+               bdy << "  uint cluster[4] =\n"
+                       << "  {\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 0),\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 1),\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 2),\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 3)\n"
+                       << "  };\n"
+                       << "  uint rootID = gl_SubgroupInvocationID & ~0x3;\n"
+                       << "  for (uint i = 0; i < 4; i++)\n"
+                       << "  {\n"
+                       << "    uint nextID = rootID + i;\n"
+                       << "    if (subgroupBallotBitExtract(mask, nextID) && (cluster[i] != nextID))\n"
+                       << "    {\n"
+                       << "      tempResult = mask.x;\n"
+                       << "    }\n"
+                       << "  }\n";
+       }
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << extension
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << bdy.str()
+                       << "  result[offset] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << extension
+                        << "layout(location = 0) out uint result;\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << bdy.str()
+                        << "  result = tempResult;\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << extension
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_VertexIndex] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << extension
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveIDIn] = tempResult;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << extension
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID] = 1;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << extension
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = 1;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BASIC_BIT))
+       {
+               return tcu::TestStatus::fail(
+                                  "Subgroup feature " +
+                                  subgroups::getShaderStageName(VK_SUBGROUP_FEATURE_BASIC_BIT) +
+                                  " is a required capability!");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
+       }
+
+       if (OPTYPE_CLUSTERED == caseDef.opType)
+       {
+               if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_CLUSTERED_BIT))
+               {
+                       TCU_THROW(NotSupportedError, "Subgroup shape tests require that clustered operations are supported!");
+               }
+       }
+
+       if (OPTYPE_QUAD == caseDef.opType)
+       {
+               if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_QUAD_BIT))
+               {
+                       TCU_THROW(NotSupportedError, "Subgroup shape tests require that quad operations are supported!");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  DE_NULL, 0, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT,
+                                                                                 DE_NULL, 0, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT,
+                                                                                DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT,
+                                                                                  DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT,
+                               DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT,
+                               DE_NULL, 0, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "shape", "Subgroup shape category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+               {
+                       CaseDefinition caseDef = {opTypeIndex, stage};
+
+                       std::string op = getOpTypeName(opTypeIndex);
+
+                       addFunctionCaseWithPrograms(group.get(),
+                                                                               de::toLower(op) + "_" + getShaderStageName(stage), "",
+                                                                               initPrograms, test, caseDef);
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.hpp
new file mode 100644 (file)
index 0000000..8626a66
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSSHAPETESTS_HPP
+#define _VKTSUBGROUPSSHAPETESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSSHAPETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
new file mode 100644 (file)
index 0000000..3d0f6a3
--- /dev/null
@@ -0,0 +1,660 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsShuffleTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+enum OpType
+{
+       OPTYPE_SHUFFLE = 0,
+       OPTYPE_SHUFFLE_XOR,
+       OPTYPE_SHUFFLE_UP,
+       OPTYPE_SHUFFLE_DOWN,
+       OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x1 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas,
+                                                 deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0x1 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       if (0x1 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_SHUFFLE:
+                       return "subgroupShuffle";
+               case OPTYPE_SHUFFLE_XOR:
+                       return "subgroupShuffleXor";
+               case OPTYPE_SHUFFLE_UP:
+                       return "subgroupShuffleUp";
+               case OPTYPE_SHUFFLE_DOWN:
+                       return "subgroupShuffleDown";
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+       VkFormat format;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string idTable[OPTYPE_LAST];
+       idTable[OPTYPE_SHUFFLE] = "data2[gl_SubgroupInvocationID]";
+       idTable[OPTYPE_SHUFFLE_XOR] = "gl_SubgroupInvocationID ^ data2[gl_SubgroupInvocationID]";
+       idTable[OPTYPE_SHUFFLE_UP] = "gl_SubgroupInvocationID - data2[gl_SubgroupInvocationID]";
+       idTable[OPTYPE_SHUFFLE_DOWN] = "gl_SubgroupInvocationID + data2[gl_SubgroupInvocationID]";
+
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n";
+
+               switch (caseDef.opType)
+               {
+                       case OPTYPE_SHUFFLE:
+                       case OPTYPE_SHUFFLE_XOR:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle: enable\n";
+                               break;
+                       default:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+                               break;
+               }
+
+               src     << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                       << "{\n"
+                       << "  uint data2[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) << "(data1[gl_SubgroupInvocationID], data2[gl_SubgroupInvocationID]);\n"
+                       << "  uint id = " << idTable[caseDef.opType] << ";\n"
+                       << "  if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                       << "  {\n"
+                       << "    result[offset] = (op == data1[id]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[offset] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n";
+
+               switch (caseDef.opType)
+               {
+                       case OPTYPE_SHUFFLE:
+                       case OPTYPE_SHUFFLE_XOR:
+                               frag << "#extension GL_KHR_shader_subgroup_shuffle: enable\n";
+                               break;
+                       default:
+                               frag << "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+                               break;
+               }
+
+               frag << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                        << "{\n"
+                        << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                        << "};\n"
+                        << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                        << "{\n"
+                        << "  uint data2[];\n"
+                        << "};\n"
+                        << "void main (void)\n"
+                        << "{\n"
+                        << "  uvec4 mask = subgroupBallot(true);\n"
+                        << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                        << getOpTypeName(caseDef.opType) << "(data1[gl_SubgroupInvocationID], data2[gl_SubgroupInvocationID]);\n"
+                        << "  uint id = " << idTable[caseDef.opType] << ";\n"
+                        << "  if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                        << "  {\n"
+                        << "    result = (op == data1[id]) ? 1 : 0;\n"
+                        << "  }\n"
+                        << "  else\n"
+                        << "  {\n"
+                        << "    result = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                        << "  }\n"
+                        << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n";
+
+               switch (caseDef.opType)
+               {
+                       case OPTYPE_SHUFFLE:
+                       case OPTYPE_SHUFFLE_XOR:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle: enable\n";
+                               break;
+                       default:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+                               break;
+               }
+
+               src     << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                       << "{\n"
+                       << "  uint data2[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) << "(data1[gl_SubgroupInvocationID], data2[gl_SubgroupInvocationID]);\n"
+                       << "  uint id = " << idTable[caseDef.opType] << ";\n"
+                       << "  if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                       << "  {\n"
+                       << "    result[gl_VertexIndex] = (op == data1[id]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_VertexIndex] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n";
+
+               switch (caseDef.opType)
+               {
+                       case OPTYPE_SHUFFLE:
+                       case OPTYPE_SHUFFLE_XOR:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle: enable\n";
+                               break;
+                       default:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+                               break;
+               }
+
+               src     << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                       << "{\n"
+                       << "  uint data2[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) << "(data1[gl_SubgroupInvocationID], data2[gl_SubgroupInvocationID]);\n"
+                       << "  uint id = " << idTable[caseDef.opType] << ";\n"
+                       << "  if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveIDIn] = (op == data1[id]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveIDIn] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n";
+
+               switch (caseDef.opType)
+               {
+                       case OPTYPE_SHUFFLE:
+                       case OPTYPE_SHUFFLE_XOR:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle: enable\n";
+                               break;
+                       default:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+                               break;
+               }
+
+               src     << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                       << "{\n"
+                       << "  uint data2[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) << "(data1[gl_SubgroupInvocationID], data2[gl_SubgroupInvocationID]);\n"
+                       << "  uint id = " << idTable[caseDef.opType] << ";\n"
+                       << "  if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID] = (op == data1[id]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n";
+
+               switch (caseDef.opType)
+               {
+                       case OPTYPE_SHUFFLE:
+                       case OPTYPE_SHUFFLE_XOR:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle: enable\n";
+                               break;
+                       default:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+                               break;
+               }
+
+               src     << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+                       << "{\n"
+                       << "  uint data2[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) << "(data1[gl_SubgroupInvocationID], data2[gl_SubgroupInvocationID]);\n"
+                       << "  uint id = " << idTable[caseDef.opType] << ";\n"
+                       << "  if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = (op == data1[id]) ? 1 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       switch (caseDef.opType)
+       {
+               case OPTYPE_SHUFFLE:
+               case OPTYPE_SHUFFLE_XOR:
+                       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_SHUFFLE_BIT))
+                       {
+                               TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle operations");
+                       }
+                       break;
+               default:
+                       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))
+                       {
+                               TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations");
+                       }
+                       break;
+       }
+
+       if (subgroups::isDoubleFormat(caseDef.format) &&
+                       !subgroups::isDoubleSupportedForDevice(context))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       subgroups::SSBOData inputData[2];
+       inputData[0].format = caseDef.format;
+       inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+       inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+       inputData[1].format = VK_FORMAT_R32_UINT;
+       inputData[1].numElements = inputData[0].numElements;
+       inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  inputData, 2, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT,
+                                                                                 inputData, 2, checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT,
+                                                                                inputData, 2, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT,
+                                                                                  inputData, 2, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT,
+                               inputData, 2, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT,
+                               inputData, 2, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "shuffle", "Subgroup shuffle category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       const VkFormat formats[] =
+       {
+               VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
+               VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
+               VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
+               VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
+               VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
+               VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
+               VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
+               VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
+               VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+               {
+                       const VkFormat format = formats[formatIndex];
+
+                       for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+                       {
+                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+
+                               std::ostringstream name;
+
+                               std::string op = getOpTypeName(opTypeIndex);
+
+                               name << de::toLower(op)
+                                        << "_" << subgroups::getFormatNameForGLSL(format)
+                                        << "_" << getShaderStageName(stage);
+
+                               addFunctionCaseWithPrograms(group.get(), name.str(),
+                                                                                       "", initPrograms, test, caseDef);
+                       }
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.hpp
new file mode 100644 (file)
index 0000000..9b8831b
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSSHUFFLETESTS_HPP
+#define _VKTSUBGROUPSSHUFFLETESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSSHUFFLETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.cpp
new file mode 100644 (file)
index 0000000..142811e
--- /dev/null
@@ -0,0 +1,75 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsTests.hpp"
+#include "vktSubgroupsBuiltinVarTests.hpp"
+#include "vktSubgroupsBuiltinMaskVarTests.hpp"
+#include "vktSubgroupsBasicTests.hpp"
+#include "vktSubgroupsVoteTests.hpp"
+#include "vktSubgroupsBallotTests.hpp"
+#include "vktSubgroupsBallotBroadcastTests.hpp"
+#include "vktSubgroupsBallotOtherTests.hpp"
+#include "vktSubgroupsArithmeticTests.hpp"
+#include "vktSubgroupsClusteredTests.hpp"
+#include "vktSubgroupsShuffleTests.hpp"
+#include "vktSubgroupsQuadTests.hpp"
+#include "vktSubgroupsShapeTests.hpp"
+#include "vktTestGroupUtil.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+namespace
+{
+
+void createChildren(tcu::TestCaseGroup* subgroupsTests)
+{
+       tcu::TestContext& testCtx = subgroupsTests->getTestContext();
+
+       subgroupsTests->addChild(createSubgroupsBuiltinVarTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsBuiltinMaskVarTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsBasicTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsVoteTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsBallotTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsBallotBroadcastTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsBallotOtherTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsArithmeticTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsClusteredTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsShuffleTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsQuadTests(testCtx));
+       subgroupsTests->addChild(createSubgroupsShapeTests(testCtx));
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createTests(tcu::TestContext& testCtx)
+{
+       return createTestGroup(
+                          testCtx, "subgroups", "Subgroups tests", createChildren);
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTests.hpp
new file mode 100644 (file)
index 0000000..37afda0
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSTESTS_HPP
+#define _VKTSUBGROUPSTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
new file mode 100644 (file)
index 0000000..977052c
--- /dev/null
@@ -0,0 +1,2303 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests Utils
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsTestsUtils.hpp"
+#include "deRandom.hpp"
+#include "tcuCommandLine.hpp"
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+deUint32 getFormatSizeInBytes(const VkFormat format)
+{
+       switch (format)
+       {
+               default:
+                       DE_FATAL("Unhandled format!");
+               case VK_FORMAT_R32_SINT:
+               case VK_FORMAT_R32_UINT:
+                       return sizeof(deInt32);
+               case VK_FORMAT_R32G32_SINT:
+               case VK_FORMAT_R32G32_UINT:
+                       return static_cast<deUint32>(sizeof(deInt32) * 2);
+               case VK_FORMAT_R32G32B32_SINT:
+               case VK_FORMAT_R32G32B32_UINT:
+               case VK_FORMAT_R32G32B32A32_SINT:
+               case VK_FORMAT_R32G32B32A32_UINT:
+                       return static_cast<deUint32>(sizeof(deInt32) * 4);
+               case VK_FORMAT_R32_SFLOAT:
+                       return 4;
+               case VK_FORMAT_R32G32_SFLOAT:
+                       return 8;
+               case VK_FORMAT_R32G32B32_SFLOAT:
+                       return 16;
+               case VK_FORMAT_R32G32B32A32_SFLOAT:
+                       return 16;
+               case VK_FORMAT_R64_SFLOAT:
+                       return 8;
+               case VK_FORMAT_R64G64_SFLOAT:
+                       return 16;
+               case VK_FORMAT_R64G64B64_SFLOAT:
+                       return 32;
+               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       return 32;
+               // The below formats are used to represent bool and bvec* types. These
+               // types are passed to the shader as int and ivec* types, before the
+               // calculations are done as booleans. We need a distinct type here so
+               // that the shader generators can switch on it and generate the correct
+               // shader source for testing.
+               case VK_FORMAT_R8_USCALED:
+                       return sizeof(deInt32);
+               case VK_FORMAT_R8G8_USCALED:
+                       return static_cast<deUint32>(sizeof(deInt32) * 2);
+               case VK_FORMAT_R8G8B8_USCALED:
+               case VK_FORMAT_R8G8B8A8_USCALED:
+                       return static_cast<deUint32>(sizeof(deInt32) * 4);
+       }
+}
+
+Move<VkPipelineLayout> makePipelineLayout(
+       Context& context, const VkDescriptorSetLayout descriptorSetLayout)
+{
+       const vk::VkPipelineLayoutCreateInfo pipelineLayoutParams = {
+               VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
+               DE_NULL,                          // const void*            pNext;
+               0u,                                       // VkPipelineLayoutCreateFlags    flags;
+               1u,                                       // deUint32             setLayoutCount;
+               &descriptorSetLayout, // const VkDescriptorSetLayout*   pSetLayouts;
+               0u,                                       // deUint32             pushConstantRangeCount;
+               DE_NULL, // const VkPushConstantRange*   pPushConstantRanges;
+       };
+       return createPipelineLayout(context.getDeviceInterface(),
+                                                               context.getDevice(), &pipelineLayoutParams);
+}
+
+Move<VkRenderPass> makeRenderPass(Context& context, VkFormat format)
+{
+       VkAttachmentReference colorReference = {
+               0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+       };
+
+       const VkSubpassDescription subpassDescription = {0u,
+                                                                                                        VK_PIPELINE_BIND_POINT_GRAPHICS, 0, DE_NULL, 1, &colorReference,
+                                                                                                        DE_NULL, DE_NULL, 0, DE_NULL
+                                                                                                       };
+
+       const VkSubpassDependency subpassDependencies[2] = {
+               {   VK_SUBPASS_EXTERNAL, 0u, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+                       VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+                       VK_ACCESS_MEMORY_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+                       VK_DEPENDENCY_BY_REGION_BIT
+               },
+               {   0u, VK_SUBPASS_EXTERNAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+                       VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+                       VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+                       VK_ACCESS_MEMORY_READ_BIT, VK_DEPENDENCY_BY_REGION_BIT
+               },
+       };
+
+       VkAttachmentDescription attachmentDescription = {0u, format,
+                                                                                                        VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR,
+                                                                                                        VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+                                                                                                        VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
+                                                                                                        VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
+                                                                                                       };
+
+       const VkRenderPassCreateInfo renderPassCreateInfo = {
+               VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, DE_NULL, 0u, 1,
+               &attachmentDescription, 1, &subpassDescription, 2, subpassDependencies
+       };
+
+       return createRenderPass(context.getDeviceInterface(), context.getDevice(),
+                                                       &renderPassCreateInfo);
+}
+
+Move<VkFramebuffer> makeFramebuffer(Context& context,
+                                                                       const VkRenderPass renderPass, const VkImageView imageView, deUint32 width,
+                                                                       deUint32 height)
+{
+       const VkFramebufferCreateInfo framebufferCreateInfo = {
+               VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, DE_NULL, 0u, renderPass, 1,
+               &imageView, width, height, 1
+       };
+
+       return createFramebuffer(context.getDeviceInterface(), context.getDevice(),
+                                                        &framebufferCreateInfo);
+}
+
+Move<VkPipeline> makeGraphicsPipeline(Context& context,
+                                                                         const VkPipelineLayout pipelineLayout,
+                                                                         const VkShaderStageFlags stages,
+                                                                         const VkShaderModule vertexShaderModule,
+                                                                         const VkShaderModule fragmentShaderModule,
+                                                                         const VkShaderModule geometryShaderModule,
+                                                                         const VkShaderModule tessellationControlModule,
+                                                                         const VkShaderModule tessellationEvaluationModule,
+                                                                         const VkRenderPass renderPass,
+                                                                         const VkPrimitiveTopology topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
+{
+       const VkBool32 disableRasterization = !(VK_SHADER_STAGE_FRAGMENT_BIT & stages);
+       std::vector<vk::VkPipelineShaderStageCreateInfo> pipelineShaderStageParams;
+       {
+               const vk::VkPipelineShaderStageCreateInfo       stageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                      sType
+                               DE_NULL,                                                                                        // const void*                                          pNext
+                               0u,                                                                                                     // VkPipelineShaderStageCreateFlags     flags
+                               VK_SHADER_STAGE_VERTEX_BIT,                                                     // VkShaderStageFlagBits                        stage
+                               vertexShaderModule,                                                                     // VkShaderModule                                       module
+                               "main",                                                                                         // const char*                                          pName
+                               DE_NULL                                                                                         // const VkSpecializationInfo*      pSpecializationInfo
+               };
+               pipelineShaderStageParams.push_back(stageCreateInfo);
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT & stages)
+       {
+               const vk::VkPipelineShaderStageCreateInfo       stageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType
+                       DE_NULL,                                                                                                // const void*                                                  pNext
+                       0u,                                                                                                             // VkPipelineShaderStageCreateFlags             flags
+                       VK_SHADER_STAGE_FRAGMENT_BIT,                                                   // VkShaderStageFlagBits                                stage
+                       fragmentShaderModule,                                                                   // VkShaderModule                                               module
+                       "main",                                                                                                 // const char*                                                  pName
+                       DE_NULL                                                                                                 // const VkSpecializationInfo*                  pSpecializationInfo
+               };
+               pipelineShaderStageParams.push_back(stageCreateInfo);
+       }
+
+       if (VK_SHADER_STAGE_GEOMETRY_BIT & stages)
+       {
+               const vk::VkPipelineShaderStageCreateInfo       stageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType
+                       DE_NULL,                                                                                                // const void*                                                  pNext
+                       0u,                                                                                                             // VkPipelineShaderStageCreateFlags             flags
+                       VK_SHADER_STAGE_GEOMETRY_BIT,                                                   // VkShaderStageFlagBits                                stage
+                       geometryShaderModule,                                                                   // VkShaderModule                                               module
+                       "main",                                                                                                 // const char*                                                  pName
+                       DE_NULL,                                                                                                // const VkSpecializationInfo*                  pSpecializationInfo
+               };
+               pipelineShaderStageParams.push_back(stageCreateInfo);
+       }
+
+       if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT & stages)
+       {
+               const vk::VkPipelineShaderStageCreateInfo       stageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType
+                       DE_NULL,                                                                                                // const void*                                                  pNext
+                       0u,                                                                                                             // VkPipelineShaderStageCreateFlags             flags
+                       VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,                               // VkShaderStageFlagBits                                stage
+                       tessellationControlModule,                                                              // VkShaderModule                                               module
+                       "main",                                                                                                 // const char*                                                  pName
+                       DE_NULL                                                                                                 // const VkSpecializationInfo*                  pSpecializationInfo
+               };
+               pipelineShaderStageParams.push_back(stageCreateInfo);
+       }
+
+       if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT & stages)
+       {
+               const vk::VkPipelineShaderStageCreateInfo       stageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType
+                       DE_NULL,                                                                                                // const void*                                                  pNext
+                       0u,                                                                                                             // VkPipelineShaderStageCreateFlags             flags
+                       VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,                    // VkShaderStageFlagBits                                stage
+                       tessellationEvaluationModule,                                                   // VkShaderModule                                               module
+                       "main",                                                                                                 // const char*                                                  pName
+                       DE_NULL                                                                                                 // const VkSpecializationInfo*                  pSpecializationInfo
+               };
+               pipelineShaderStageParams.push_back(stageCreateInfo);
+       }
+
+       const VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, DE_NULL, 0u,
+               0u, DE_NULL, 0u, DE_NULL,
+       };
+
+       const VkPipelineTessellationStateCreateInfo tessellationStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
+               DE_NULL,
+               0,
+               1
+       };
+
+       const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, DE_NULL,
+               0u, topology, VK_FALSE
+       };
+
+       const VkPipelineViewportStateCreateInfo viewportStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, DE_NULL, 0u, 1u,
+               DE_NULL, 1u, DE_NULL,
+       };
+
+       const VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, DE_NULL,
+               0u, VK_FALSE, disableRasterization, VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE,
+               VK_FRONT_FACE_COUNTER_CLOCKWISE, VK_FALSE, 0.0f, 0.0f, 0.0f, 1.0f
+       };
+
+       const VkPipelineMultisampleStateCreateInfo multisampleStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, DE_NULL, 0u,
+               VK_SAMPLE_COUNT_1_BIT, VK_FALSE, 0.0f, DE_NULL, VK_FALSE, VK_FALSE
+       };
+
+       const VkStencilOpState stencilOpState =
+       {
+               VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_NEVER,
+               0, 0, 0
+       };
+
+       const VkPipelineDepthStencilStateCreateInfo depthStencilStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, DE_NULL, 0u,
+               VK_FALSE, VK_FALSE, VK_COMPARE_OP_NEVER, VK_FALSE, VK_FALSE, stencilOpState,
+               stencilOpState, 0.0f, 0.0f
+       };
+
+       const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
+       {
+               VK_FALSE, VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD,
+               VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD,
+               VK_COLOR_COMPONENT_R_BIT
+       };
+
+       const VkPipelineColorBlendStateCreateInfo colorBlendStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, DE_NULL, 0u,
+               VK_FALSE, VK_LOGIC_OP_CLEAR, 1, &colorBlendAttachmentState,
+               { 0.0f, 0.0f, 0.0f, 0.0f }
+       };
+
+       const VkDynamicState dynamicState[2] =
+       {
+               VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR
+       };
+
+       const VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, DE_NULL, 0u, 2,
+               dynamicState,
+       };
+
+       const bool usingTessellation = (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT & stages)
+                                                                  || (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT & stages);
+
+       const VkGraphicsPipelineCreateInfo pipelineCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, DE_NULL, 0u,
+               static_cast<deUint32>(pipelineShaderStageParams.size()),
+               &pipelineShaderStageParams[0], &vertexInputStateCreateInfo,
+               &inputAssemblyStateCreateInfo, usingTessellation ? &tessellationStateCreateInfo : DE_NULL, &viewportStateCreateInfo,
+               &rasterizationStateCreateInfo, &multisampleStateCreateInfo,
+               &depthStencilStateCreateInfo, &colorBlendStateCreateInfo,
+               &dynamicStateCreateInfo, pipelineLayout, renderPass, 0, DE_NULL, 0
+       };
+
+       return createGraphicsPipeline(context.getDeviceInterface(),
+                                                                 context.getDevice(), DE_NULL, &pipelineCreateInfo);
+}
+
+Move<VkPipeline> makeComputePipeline(Context& context,
+                                                                        const VkPipelineLayout pipelineLayout, const VkShaderModule shaderModule,
+                                                                        deUint32 localSizeX, deUint32 localSizeY, deUint32 localSizeZ)
+{
+       const deUint32 localSize[3] = {localSizeX, localSizeY, localSizeZ};
+
+       const vk::VkSpecializationMapEntry entries[3] =
+       {
+               {0, sizeof(deUint32) * 0, sizeof(deUint32)},
+               {1, sizeof(deUint32) * 1, sizeof(deUint32)},
+               {2, static_cast<deUint32>(sizeof(deUint32) * 2), sizeof(deUint32)},
+       };
+
+       const vk::VkSpecializationInfo info =
+       {
+               /* mapEntryCount = */ 3,
+               /* pMapEntries   = */ entries,
+               /* dataSize      = */ sizeof(localSize),
+               /* pData         = */ localSize
+       };
+
+       const vk::VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType
+               // sType;
+               DE_NULL, // const void*              pNext;
+               0u,              // VkPipelineShaderStageCreateFlags   flags;
+               VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits        stage;
+               shaderModule,                            // VkShaderModule           module;
+               "main",                                          // const char*              pName;
+               &info, // const VkSpecializationInfo*      pSpecializationInfo;
+       };
+
+       const vk::VkComputePipelineCreateInfo pipelineCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType
+               // sType;
+               DE_NULL,                                   // const void*            pNext;
+               0u,                                                // VkPipelineCreateFlags      flags;
+               pipelineShaderStageParams, // VkPipelineShaderStageCreateInfo  stage;
+               pipelineLayout,                    // VkPipelineLayout         layout;
+               DE_NULL,                                   // VkPipeline           basePipelineHandle;
+               0,                                                 // deInt32              basePipelineIndex;
+       };
+
+       return createComputePipeline(context.getDeviceInterface(),
+                                                                context.getDevice(), DE_NULL, &pipelineCreateInfo);
+}
+
+Move<VkDescriptorSet> makeDescriptorSet(Context& context,
+                                                                               const VkDescriptorPool descriptorPool,
+                                                                               const VkDescriptorSetLayout setLayout)
+{
+       const VkDescriptorSetAllocateInfo allocateParams =
+       {
+               VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType
+               // sType;
+               DE_NULL,                // const void*          pNext;
+               descriptorPool, // VkDescriptorPool       descriptorPool;
+               1u,                             // deUint32           setLayoutCount;
+               &setLayout,             // const VkDescriptorSetLayout* pSetLayouts;
+       };
+       return allocateDescriptorSet(
+                          context.getDeviceInterface(), context.getDevice(), &allocateParams);
+}
+
+Move<VkCommandPool> makeCommandPool(Context& context)
+{
+       const VkCommandPoolCreateInfo commandPoolParams =
+       {
+               VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
+               DE_NULL,                                                                        // const void*        pNext;
+               VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags
+               // flags;
+               context.getUniversalQueueFamilyIndex(), // deUint32 queueFamilyIndex;
+       };
+
+       return createCommandPool(
+                          context.getDeviceInterface(), context.getDevice(), &commandPoolParams);
+}
+
+Move<VkCommandBuffer> makeCommandBuffer(
+       Context& context, const VkCommandPool commandPool)
+{
+       const VkCommandBufferAllocateInfo bufferAllocateParams =
+       {
+               VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType
+               // sType;
+               DE_NULL,                                                 // const void*        pNext;
+               commandPool,                                     // VkCommandPool      commandPool;
+               VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel   level;
+               1u,                                                              // deUint32         bufferCount;
+       };
+       return allocateCommandBuffer(context.getDeviceInterface(),
+                                                                context.getDevice(), &bufferAllocateParams);
+}
+
+void beginCommandBuffer(Context& context, const VkCommandBuffer commandBuffer)
+{
+       const VkCommandBufferBeginInfo commandBufBeginParams =
+       {
+               VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
+               DE_NULL, // const void*            pNext;
+               0u,              // VkCommandBufferUsageFlags    flags;
+               (const VkCommandBufferInheritanceInfo*)DE_NULL,
+       };
+       VK_CHECK(context.getDeviceInterface().beginCommandBuffer(
+                                commandBuffer, &commandBufBeginParams));
+}
+
+void endCommandBuffer(Context& context, const VkCommandBuffer commandBuffer)
+{
+       VK_CHECK(context.getDeviceInterface().endCommandBuffer(commandBuffer));
+}
+
+Move<VkFence> submitCommandBuffer(
+       Context& context, const VkCommandBuffer commandBuffer)
+{
+       const VkFenceCreateInfo fenceParams =
+       {
+               VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType    sType;
+               DE_NULL,                                                         // const void*      pNext;
+               0u,                                                                      // VkFenceCreateFlags flags;
+       };
+
+       Move<VkFence> fence(createFence(
+                                                       context.getDeviceInterface(), context.getDevice(), &fenceParams));
+
+       const VkSubmitInfo submitInfo =
+       {
+               VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType      sType;
+               DE_NULL,                                           // const void*        pNext;
+               0u,                                                        // deUint32         waitSemaphoreCount;
+               DE_NULL,                                           // const VkSemaphore*   pWaitSemaphores;
+               (const VkPipelineStageFlags*)DE_NULL,
+               1u,                             // deUint32         commandBufferCount;
+               &commandBuffer, // const VkCommandBuffer* pCommandBuffers;
+               0u,                             // deUint32         signalSemaphoreCount;
+               DE_NULL,                // const VkSemaphore*   pSignalSemaphores;
+       };
+
+       vk::VkResult result = (context.getDeviceInterface().queueSubmit(
+                                                          context.getUniversalQueue(), 1u, &submitInfo, *fence));
+       VK_CHECK(result);
+
+       return Move<VkFence>(fence);
+}
+
+void waitFence(Context& context, Move<VkFence> fence)
+{
+       VK_CHECK(context.getDeviceInterface().waitForFences(
+                                context.getDevice(), 1u, &fence.get(), DE_TRUE, ~0ull));
+}
+
+struct Buffer;
+struct Image;
+
+struct BufferOrImage
+{
+       bool isImage() const
+       {
+               return m_isImage;
+       }
+
+       Buffer* getAsBuffer()
+       {
+               if (m_isImage) DE_FATAL("Trying to get a buffer as an image!");
+               return reinterpret_cast<Buffer* >(this);
+       }
+
+       Image* getAsImage()
+       {
+               if (!m_isImage) DE_FATAL("Trying to get an image as a buffer!");
+               return reinterpret_cast<Image*>(this);
+       }
+
+       VkDescriptorType getType() const
+       {
+               if (m_isImage)
+               {
+                       return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
+               }
+               else
+               {
+                       return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+               }
+       }
+
+       Allocation& getAllocation() const
+       {
+               return *m_allocation;
+       }
+
+       virtual ~BufferOrImage() {}
+
+protected:
+       explicit BufferOrImage(bool image) : m_isImage(image) {}
+
+       bool m_isImage;
+       de::details::MovePtr<Allocation> m_allocation;
+};
+
+struct Buffer : public BufferOrImage
+{
+       explicit Buffer(
+               Context& context, VkDeviceSize sizeInBytes, VkBufferUsageFlags usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
+               : BufferOrImage(false), m_sizeInBytes(sizeInBytes)
+       {
+               const vk::VkBufferCreateInfo bufferCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
+                       DE_NULL,
+                       0u,
+                       sizeInBytes,
+                       usage,
+                       VK_SHARING_MODE_EXCLUSIVE,
+                       0u,
+                       DE_NULL,
+               };
+               m_buffer = createBuffer(context.getDeviceInterface(),
+                                                               context.getDevice(), &bufferCreateInfo);
+               vk::VkMemoryRequirements req = getBufferMemoryRequirements(
+                                                                                  context.getDeviceInterface(), context.getDevice(), *m_buffer);
+               req.size *= 2;
+               m_allocation = context.getDefaultAllocator().allocate(
+                                                  req, MemoryRequirement::HostVisible);
+               VK_CHECK(context.getDeviceInterface().bindBufferMemory(
+                                        context.getDevice(), *m_buffer, m_allocation->getMemory(),
+                                        m_allocation->getOffset()));
+       }
+
+       VkBuffer getBuffer() const {
+               return *m_buffer;
+       }
+
+
+       VkDeviceSize getSize() const {
+               return m_sizeInBytes;
+       }
+
+private:
+       Move<VkBuffer> m_buffer;
+       VkDeviceSize m_sizeInBytes;
+};
+
+struct Image : public BufferOrImage
+{
+       explicit Image(Context& context, deUint32 width, deUint32 height,
+                                  VkFormat format, VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT)
+               : BufferOrImage(true)
+       {
+               const VkImageCreateInfo imageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, DE_NULL, 0, VK_IMAGE_TYPE_2D,
+                       format, {width, height, 1}, 1, 1, VK_SAMPLE_COUNT_1_BIT,
+                       VK_IMAGE_TILING_OPTIMAL, usage,
+                       VK_SHARING_MODE_EXCLUSIVE, 0u, DE_NULL,
+                       VK_IMAGE_LAYOUT_UNDEFINED
+               };
+               m_image = createImage(context.getDeviceInterface(), context.getDevice(),
+                                                         &imageCreateInfo);
+               vk::VkMemoryRequirements req = getImageMemoryRequirements(
+                                                                                  context.getDeviceInterface(), context.getDevice(), *m_image);
+               req.size *= 2;
+               m_allocation =
+                       context.getDefaultAllocator().allocate(req, MemoryRequirement::Any);
+               VK_CHECK(context.getDeviceInterface().bindImageMemory(
+                                        context.getDevice(), *m_image, m_allocation->getMemory(),
+                                        m_allocation->getOffset()));
+
+               const VkComponentMapping componentMapping =
+               {
+                       VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
+                       VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY
+               };
+
+               const VkImageViewCreateInfo imageViewCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, DE_NULL, 0, *m_image,
+                       VK_IMAGE_VIEW_TYPE_2D, imageCreateInfo.format, componentMapping,
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1,
+                       }
+               };
+
+               m_imageView = createImageView(context.getDeviceInterface(),
+                                                                         context.getDevice(), &imageViewCreateInfo);
+
+               const struct VkSamplerCreateInfo samplerCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
+                       DE_NULL,
+                       0u,
+                       VK_FILTER_NEAREST,
+                       VK_FILTER_NEAREST,
+                       VK_SAMPLER_MIPMAP_MODE_NEAREST,
+                       VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
+                       VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
+                       VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
+                       0.0f,
+                       VK_FALSE,
+                       1.0f,
+                       DE_FALSE,
+                       VK_COMPARE_OP_ALWAYS,
+                       0.0f,
+                       0.0f,
+                       VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
+                       VK_FALSE,
+               };
+
+               m_sampler = createSampler(context.getDeviceInterface(), context.getDevice(), &samplerCreateInfo);
+       }
+
+       VkImage getImage() const {
+               return *m_image;
+       }
+
+       VkImageView getImageView() const {
+               return *m_imageView;
+       }
+
+       VkSampler getSampler() const {
+               return *m_sampler;
+       }
+
+private:
+       Move<VkImage> m_image;
+       Move<VkImageView> m_imageView;
+       Move<VkSampler> m_sampler;
+};
+}
+
+std::string vkt::subgroups::getSharedMemoryBallotHelper()
+{
+       return  "shared uvec4 superSecretComputeShaderHelper[gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z];\n"
+                       "uvec4 sharedMemoryBallot(bool vote)\n"
+                       "{\n"
+                       "  uint groupOffset = gl_SubgroupID;\n"
+                       "  // One invocation in the group 0's the whole group's data\n"
+                       "  if (subgroupElect())\n"
+                       "  {\n"
+                       "    superSecretComputeShaderHelper[groupOffset] = uvec4(0);\n"
+                       "  }\n"
+                       "  subgroupMemoryBarrierShared();\n"
+                       "  if (vote)\n"
+                       "  {\n"
+                       "    const highp uint bitToSet = 1u << (gl_SubgroupInvocationID % 32);\n"
+                       "    switch (gl_SubgroupInvocationID / 32)\n"
+                       "    {\n"
+                       "    case 0: atomicOr(superSecretComputeShaderHelper[groupOffset].x, bitToSet); break;\n"
+                       "    case 1: atomicOr(superSecretComputeShaderHelper[groupOffset].y, bitToSet); break;\n"
+                       "    case 2: atomicOr(superSecretComputeShaderHelper[groupOffset].z, bitToSet); break;\n"
+                       "    case 3: atomicOr(superSecretComputeShaderHelper[groupOffset].w, bitToSet); break;\n"
+                       "    }\n"
+                       "  }\n"
+                       "  subgroupMemoryBarrierShared();\n"
+                       "  return superSecretComputeShaderHelper[groupOffset];\n"
+                       "}\n";
+}
+
+deUint32 vkt::subgroups::getSubgroupSize(Context& context)
+{
+       VkPhysicalDeviceSubgroupProperties subgroupProperties;
+       subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
+       subgroupProperties.pNext = DE_NULL;
+
+       VkPhysicalDeviceProperties2KHR properties;
+       properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
+       properties.pNext = &subgroupProperties;
+
+       context.getInstanceInterface().getPhysicalDeviceProperties2KHR(context.getPhysicalDevice(), &properties);
+
+       return subgroupProperties.subgroupSize;
+}
+
+VkDeviceSize vkt::subgroups::maxSupportedSubgroupSize() {
+       return 128u;
+}
+
+std::string vkt::subgroups::getShaderStageName(VkShaderStageFlags stage)
+{
+       switch (stage)
+       {
+               default:
+                       DE_FATAL("Unhandled stage!");
+               case VK_SHADER_STAGE_COMPUTE_BIT:
+                       return "compute";
+               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                       return "fragment";
+               case VK_SHADER_STAGE_VERTEX_BIT:
+                       return "vertex";
+               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                       return "geometry";
+               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+                       return "tess_control";
+               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                       return "tess_eval";
+       }
+}
+
+std::string vkt::subgroups::getSubgroupFeatureName(vk::VkSubgroupFeatureFlagBits bit)
+{
+       switch (bit)
+       {
+               default:
+                       DE_FATAL("Unknown subgroup feature category!");
+               case VK_SUBGROUP_FEATURE_BASIC_BIT:
+                       return "VK_SUBGROUP_FEATURE_BASIC_BIT";
+               case VK_SUBGROUP_FEATURE_VOTE_BIT:
+                       return "VK_SUBGROUP_FEATURE_VOTE_BIT";
+               case VK_SUBGROUP_FEATURE_ARITHMETIC_BIT:
+                       return "VK_SUBGROUP_FEATURE_ARITHMETIC_BIT";
+               case VK_SUBGROUP_FEATURE_BALLOT_BIT:
+                       return "VK_SUBGROUP_FEATURE_BALLOT_BIT";
+               case VK_SUBGROUP_FEATURE_SHUFFLE_BIT:
+                       return "VK_SUBGROUP_FEATURE_SHUFFLE_BIT";
+               case VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT:
+                       return "VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT";
+               case VK_SUBGROUP_FEATURE_CLUSTERED_BIT:
+                       return "VK_SUBGROUP_FEATURE_CLUSTERED_BIT";
+               case VK_SUBGROUP_FEATURE_QUAD_BIT:
+                       return "VK_SUBGROUP_FEATURE_QUAD_BIT";
+       }
+}
+
+std::string vkt::subgroups::getVertShaderForStage(vk::VkShaderStageFlags stage)
+{
+       switch (stage)
+       {
+               default:
+                       DE_FATAL("Unhandled stage!");
+               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                       return
+                               "#version 450\n"
+                               "void main (void)\n"
+                               "{\n"
+                               "  vec2 uv = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);\n"
+                               "  gl_Position = vec4(uv * 2.0f + -1.0f, 0.0f, 1.0f);\n"
+                               "}\n";
+               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                       return
+                               "#version 450\n"
+                               "void main (void)\n"
+                               "{\n"
+                               "}\n";
+               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                       return
+                               "#version 450\n"
+                               "void main (void)\n"
+                               "{\n"
+                               "}\n";
+       }
+}
+
+bool vkt::subgroups::areSubgroupOperationsSupportedForStage(
+       Context& context, const VkShaderStageFlags stage)
+{
+       VkPhysicalDeviceSubgroupProperties subgroupProperties;
+       subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
+       subgroupProperties.pNext = DE_NULL;
+
+       VkPhysicalDeviceProperties2KHR properties;
+       properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
+       properties.pNext = &subgroupProperties;
+
+       context.getInstanceInterface().getPhysicalDeviceProperties2KHR(context.getPhysicalDevice(), &properties);
+
+       return (stage & subgroupProperties.supportedStages) ? true : false;
+}
+
+bool vkt::subgroups::areSubgroupOperationsRequiredForStage(
+       VkShaderStageFlags stage)
+{
+       switch (stage)
+       {
+               default:
+                       return false;
+               case VK_SHADER_STAGE_FRAGMENT_BIT:
+               case VK_SHADER_STAGE_COMPUTE_BIT:
+                       return true;
+       }
+}
+
+bool vkt::subgroups::isSubgroupFeatureSupportedForDevice(
+       Context& context,
+       VkSubgroupFeatureFlagBits bit) {
+       VkPhysicalDeviceSubgroupProperties subgroupProperties;
+       subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
+       subgroupProperties.pNext = DE_NULL;
+
+       VkPhysicalDeviceProperties2KHR properties;
+       properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
+       properties.pNext = &subgroupProperties;
+
+       context.getInstanceInterface().getPhysicalDeviceProperties2KHR(context.getPhysicalDevice(), &properties);
+
+       return (bit & subgroupProperties.supportedOperations) ? true : false;
+}
+
+bool vkt::subgroups::isFragmentSSBOSupportedForDevice(Context& context)
+{
+       const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(
+                               context.getInstanceInterface(), context.getPhysicalDevice());
+       return features.fragmentStoresAndAtomics ? true : false;
+}
+
+bool vkt::subgroups::isVertexSSBOSupportedForDevice(Context& context)
+{
+       const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(
+                               context.getInstanceInterface(), context.getPhysicalDevice());
+       return features.vertexPipelineStoresAndAtomics ? true : false;
+}
+
+bool vkt::subgroups::isDoubleSupportedForDevice(Context& context)
+{
+       const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(
+                               context.getInstanceInterface(), context.getPhysicalDevice());
+       return features.shaderFloat64 ? true : false;
+}
+
+bool vkt::subgroups::isDoubleFormat(VkFormat format)
+{
+       switch (format)
+       {
+               default:
+                       return false;
+               case VK_FORMAT_R64_SFLOAT:
+               case VK_FORMAT_R64G64_SFLOAT:
+               case VK_FORMAT_R64G64B64_SFLOAT:
+               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       return true;
+       }
+}
+
+std::string vkt::subgroups::getFormatNameForGLSL(VkFormat format)
+{
+       switch (format)
+       {
+               default:
+                       DE_FATAL("Unhandled format!");
+               case VK_FORMAT_R32_SINT:
+                       return "int";
+               case VK_FORMAT_R32G32_SINT:
+                       return "ivec2";
+               case VK_FORMAT_R32G32B32_SINT:
+                       return "ivec3";
+               case VK_FORMAT_R32G32B32A32_SINT:
+                       return "ivec4";
+               case VK_FORMAT_R32_UINT:
+                       return "uint";
+               case VK_FORMAT_R32G32_UINT:
+                       return "uvec2";
+               case VK_FORMAT_R32G32B32_UINT:
+                       return "uvec3";
+               case VK_FORMAT_R32G32B32A32_UINT:
+                       return "uvec4";
+               case VK_FORMAT_R32_SFLOAT:
+                       return "float";
+               case VK_FORMAT_R32G32_SFLOAT:
+                       return "vec2";
+               case VK_FORMAT_R32G32B32_SFLOAT:
+                       return "vec3";
+               case VK_FORMAT_R32G32B32A32_SFLOAT:
+                       return "vec4";
+               case VK_FORMAT_R64_SFLOAT:
+                       return "double";
+               case VK_FORMAT_R64G64_SFLOAT:
+                       return "dvec2";
+               case VK_FORMAT_R64G64B64_SFLOAT:
+                       return "dvec3";
+               case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       return "dvec4";
+               case VK_FORMAT_R8_USCALED:
+                       return "bool";
+               case VK_FORMAT_R8G8_USCALED:
+                       return "bvec2";
+               case VK_FORMAT_R8G8B8_USCALED:
+                       return "bvec3";
+               case VK_FORMAT_R8G8B8A8_USCALED:
+                       return "bvec4";
+       }
+}
+
+void initializeMemory(Context& context, const Allocation& alloc, subgroups::SSBOData& data)
+{
+       const vk::VkFormat format = data.format;
+       const vk::VkDeviceSize size = getFormatSizeInBytes(format) * data.numElements;
+       if (subgroups::SSBOData::InitializeNonZero == data.initializeType)
+       {
+               de::Random rnd(context.getTestContext().getCommandLine().getBaseSeed());
+
+               switch (format)
+               {
+                       default:
+                               DE_FATAL("Illegal buffer format");
+                       case VK_FORMAT_R8_USCALED:
+                       case VK_FORMAT_R8G8_USCALED:
+                       case VK_FORMAT_R8G8B8_USCALED:
+                       case VK_FORMAT_R8G8B8A8_USCALED:
+                       case VK_FORMAT_R32_SINT:
+                       case VK_FORMAT_R32G32_SINT:
+                       case VK_FORMAT_R32G32B32_SINT:
+                       case VK_FORMAT_R32G32B32A32_SINT:
+                       case VK_FORMAT_R32_UINT:
+                       case VK_FORMAT_R32G32_UINT:
+                       case VK_FORMAT_R32G32B32_UINT:
+                       case VK_FORMAT_R32G32B32A32_UINT:
+                       {
+                               deUint32* ptr = reinterpret_cast<deUint32*>(alloc.getHostPtr());
+
+                               for (vk::VkDeviceSize k = 0; k < (size / 4); k++)
+                               {
+                                       ptr[k] = rnd.getUint32();
+                               }
+                       }
+                       break;
+                       case VK_FORMAT_R32_SFLOAT:
+                       case VK_FORMAT_R32G32_SFLOAT:
+                       case VK_FORMAT_R32G32B32_SFLOAT:
+                       case VK_FORMAT_R32G32B32A32_SFLOAT:
+                       {
+                               float* ptr = reinterpret_cast<float*>(alloc.getHostPtr());
+
+                               for (vk::VkDeviceSize k = 0; k < (size / 4); k++)
+                               {
+                                       ptr[k] = rnd.getFloat();
+                               }
+                       }
+                       break;
+                       case VK_FORMAT_R64_SFLOAT:
+                       case VK_FORMAT_R64G64_SFLOAT:
+                       case VK_FORMAT_R64G64B64_SFLOAT:
+                       case VK_FORMAT_R64G64B64A64_SFLOAT:
+                       {
+                               double* ptr = reinterpret_cast<double*>(alloc.getHostPtr());
+
+                               for (vk::VkDeviceSize k = 0; k < (size / 4); k++)
+                               {
+                                       ptr[k] = rnd.getDouble();
+                               }
+                       }
+                       break;
+               }
+       }
+       else if (subgroups::SSBOData::InitializeZero == data.initializeType)
+       {
+               deUint32* ptr = reinterpret_cast<deUint32*>(alloc.getHostPtr());
+
+               for (vk::VkDeviceSize k = 0; k < size / 4; k++)
+               {
+                       ptr[k] = 0;
+               }
+       }
+
+       if (subgroups::SSBOData::InitializeNone != data.initializeType)
+       {
+               flushMappedMemoryRange(context.getDeviceInterface(),
+                                                          context.getDevice(), alloc.getMemory(), alloc.getOffset(), size);
+       }
+}
+
+tcu::TestStatus vkt::subgroups::makeTessellationEvaluationTest(
+       Context& context, VkFormat format, SSBOData* extraDatas,
+       deUint32 extraDatasCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
+{
+       const deUint32 maxWidth = 1024;
+
+       const Unique<VkShaderModule> vertexShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule> tessellationControlShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("tesc"), 0u));
+       const Unique<VkShaderModule> tessellationEvaluationShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("tese"), 0u));
+
+       std::vector<BufferOrImage*> inputBuffers(extraDatasCount + 1);
+
+       // The implicit result SSBO we use to store our outputs from the shader
+       {
+               vk::VkDeviceSize size = getFormatSizeInBytes(format) * maxWidth * 2;
+               inputBuffers[0] = new Buffer(context, size);
+       }
+
+       for (deUint32 i = 0; i < (inputBuffers.size() - 1); i++)
+       {
+               if (extraDatas[i].isImage)
+               {
+                       inputBuffers[i + 1] = new Image(context,
+                                                                                       static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format);
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(extraDatas[i].format) * extraDatas[i].numElements;
+                       inputBuffers[i + 1] = new Buffer(context, size);
+               }
+
+               const Allocation& alloc = inputBuffers[i + 1]->getAllocation();
+               initializeMemory(context, alloc, extraDatas[i]);
+       }
+
+       DescriptorSetLayoutBuilder layoutBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               layoutBuilder.addBinding(inputBuffers[i]->getType(), 1,
+                                                                VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, DE_NULL);
+       }
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkPipelineLayout> pipelineLayout(
+               makePipelineLayout(context, *descriptorSetLayout));
+
+       const Unique<VkRenderPass> renderPass(makeRenderPass(context, VK_FORMAT_R32_SFLOAT));
+       const Unique<VkPipeline> pipeline(makeGraphicsPipeline(context, *pipelineLayout,
+                                                                         VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+                                                                         *vertexShaderModule, DE_NULL, DE_NULL, *tessellationControlShaderModule, *tessellationEvaluationShaderModule,
+                                                                         *renderPass, VK_PRIMITIVE_TOPOLOGY_PATCH_LIST));
+
+       DescriptorPoolBuilder poolBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               poolBuilder.addType(inputBuffers[i]->getType());
+       }
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                 VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       // Create descriptor set
+       const Unique<VkDescriptorSet> descriptorSet(
+               makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout));
+
+       DescriptorSetUpdateBuilder updateBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               if (inputBuffers[i]->isImage())
+               {
+                       VkDescriptorImageInfo info =
+                               makeDescriptorImageInfo(inputBuffers[i]->getAsImage()->getSampler(),
+                                                                               inputBuffers[i]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+               else
+               {
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(),
+                                                                                0ull, inputBuffers[i]->getAsBuffer()->getSize());
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+       }
+
+       updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+
+       const deUint32 subgroupSize = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer> cmdBuffer(
+               makeCommandBuffer(context, *cmdPool));
+
+       unsigned totalIterations = 0;
+       unsigned failedIterations = 0;
+
+       Image discardableImage(context, 1, 1, VK_FORMAT_R32_SFLOAT,
+                                                  VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                  VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+       for (deUint32 width = 1; width < maxWidth; width++)
+       {
+               for (deUint32 i = 1; i < inputBuffers.size(); i++)
+               {
+                       // re-init the data
+                       const Allocation& alloc = inputBuffers[i]->getAllocation();
+                       initializeMemory(context, alloc, extraDatas[i - 1]);
+               }
+
+               totalIterations++;
+
+               const Unique<VkFramebuffer> framebuffer(makeFramebuffer(context,
+                                                                                               *renderPass, discardableImage.getImageView(), 1, 1));
+
+               const VkClearValue clearValue = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+
+               const VkRenderPassBeginInfo renderPassBeginInfo = {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, DE_NULL, *renderPass,
+                       *framebuffer, {{0, 0}, {1, 1}}, 1, &clearValue,
+               };
+
+               beginCommandBuffer(context, *cmdBuffer);
+
+               VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
+
+               context.getDeviceInterface().cmdSetViewport(
+                       *cmdBuffer, 0, 1, &viewport);
+
+               VkRect2D scissor = {{0, 0}, {1, 1}};
+
+               context.getDeviceInterface().cmdSetScissor(
+                       *cmdBuffer, 0, 1, &scissor);
+
+               context.getDeviceInterface().cmdBeginRenderPass(
+                       *cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+               context.getDeviceInterface().cmdBindPipeline(
+                       *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+               context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
+                               VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
+                               &descriptorSet.get(), 0u, DE_NULL);
+
+               context.getDeviceInterface().cmdDraw(*cmdBuffer, width, 1, 0, 0);
+
+               context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
+
+               endCommandBuffer(context, *cmdBuffer);
+
+               Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+
+               waitFence(context, fence);
+
+               std::vector<const void*> datas;
+
+               for (deUint32 i = 0; i < inputBuffers.size(); i++)
+               {
+                       if (!inputBuffers[i]->isImage())
+                       {
+                               const Allocation& resultAlloc = inputBuffers[i]->getAllocation();
+                               invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                       context.getDevice(), resultAlloc.getMemory(),
+                                                                                       resultAlloc.getOffset(), inputBuffers[i]->getAsBuffer()->getSize());
+
+                               // we always have our result data first
+                               datas.push_back(resultAlloc.getHostPtr());
+                       }
+               }
+
+               if (!checkResult(datas, width * 2, subgroupSize))
+               {
+                       failedIterations++;
+               }
+
+               context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
+       }
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               delete inputBuffers[i];
+       }
+
+       if (0 < failedIterations)
+       {
+               context.getTestContext().getLog()
+                               << TestLog::Message << (totalIterations - failedIterations) << " / "
+                               << totalIterations << " values passed" << TestLog::EndMessage;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus vkt::subgroups::makeTessellationControlTest(
+       Context& context, VkFormat format, SSBOData* extraDatas,
+       deUint32 extraDatasCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
+{
+       const deUint32 maxWidth = 1024;
+
+       const Unique<VkShaderModule> vertexShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule> tessellationControlShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("tesc"), 0u));
+       const Unique<VkShaderModule> tessellationEvaluationShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("tese"), 0u));
+
+       std::vector<BufferOrImage*> inputBuffers(extraDatasCount + 1);
+
+       // The implicit result SSBO we use to store our outputs from the vertex shader
+       {
+               vk::VkDeviceSize size = getFormatSizeInBytes(format) * maxWidth;
+               inputBuffers[0] = new Buffer(context, size);
+       }
+
+       for (deUint32 i = 0; i < (inputBuffers.size() - 1); i++)
+       {
+               if (extraDatas[i].isImage)
+               {
+                       inputBuffers[i + 1] = new Image(context,
+                                                                                       static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format);
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(extraDatas[i].format) * extraDatas[i].numElements;
+                       inputBuffers[i + 1] = new Buffer(context, size);
+               }
+
+               const Allocation& alloc = inputBuffers[i + 1]->getAllocation();
+               initializeMemory(context, alloc, extraDatas[i]);
+       }
+
+       DescriptorSetLayoutBuilder layoutBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               layoutBuilder.addBinding(inputBuffers[i]->getType(), 1,
+                                                                VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, DE_NULL);
+       }
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkPipelineLayout> pipelineLayout(
+               makePipelineLayout(context, *descriptorSetLayout));
+
+       const Unique<VkRenderPass> renderPass(makeRenderPass(context, VK_FORMAT_R32_SFLOAT));
+       const Unique<VkPipeline> pipeline(makeGraphicsPipeline(context, *pipelineLayout,
+                                                                         VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+                                                                         *vertexShaderModule, DE_NULL, DE_NULL, *tessellationControlShaderModule, *tessellationEvaluationShaderModule,
+                                                                         *renderPass, VK_PRIMITIVE_TOPOLOGY_PATCH_LIST));
+
+       DescriptorPoolBuilder poolBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               poolBuilder.addType(inputBuffers[i]->getType());
+       }
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                 VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       // Create descriptor set
+       const Unique<VkDescriptorSet> descriptorSet(
+               makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout));
+
+       DescriptorSetUpdateBuilder updateBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               if (inputBuffers[i]->isImage())
+               {
+                       VkDescriptorImageInfo info =
+                               makeDescriptorImageInfo(inputBuffers[i]->getAsImage()->getSampler(),
+                                                                               inputBuffers[i]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+               else
+               {
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(),
+                                                                                0ull, inputBuffers[i]->getAsBuffer()->getSize());
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+       }
+
+       updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+
+       const deUint32 subgroupSize = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer> cmdBuffer(
+               makeCommandBuffer(context, *cmdPool));
+
+       unsigned totalIterations = 0;
+       unsigned failedIterations = 0;
+
+       Image discardableImage(context, 1, 1, VK_FORMAT_R32_SFLOAT,
+                                                  VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                  VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+       for (deUint32 width = 1; width < maxWidth; width++)
+       {
+               for (deUint32 i = 1; i < inputBuffers.size(); i++)
+               {
+                       // re-init the data
+                       const Allocation& alloc = inputBuffers[i]->getAllocation();
+                       initializeMemory(context, alloc, extraDatas[i - 1]);
+               }
+
+               totalIterations++;
+
+               const Unique<VkFramebuffer> framebuffer(makeFramebuffer(context,
+                                                                                               *renderPass, discardableImage.getImageView(), 1, 1));
+
+               const VkClearValue clearValue = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+
+               const VkRenderPassBeginInfo renderPassBeginInfo = {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, DE_NULL, *renderPass,
+                       *framebuffer, {{0, 0}, {1, 1}}, 1, &clearValue,
+               };
+
+               beginCommandBuffer(context, *cmdBuffer);
+
+               VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
+
+               context.getDeviceInterface().cmdSetViewport(
+                       *cmdBuffer, 0, 1, &viewport);
+
+               VkRect2D scissor = {{0, 0}, {1, 1}};
+
+               context.getDeviceInterface().cmdSetScissor(
+                       *cmdBuffer, 0, 1, &scissor);
+
+               context.getDeviceInterface().cmdBeginRenderPass(
+                       *cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+               context.getDeviceInterface().cmdBindPipeline(
+                       *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+               context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
+                               VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
+                               &descriptorSet.get(), 0u, DE_NULL);
+
+               context.getDeviceInterface().cmdDraw(*cmdBuffer, width, 1, 0, 0);
+
+               context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
+
+               endCommandBuffer(context, *cmdBuffer);
+
+               Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+
+               waitFence(context, fence);
+
+               std::vector<const void*> datas;
+
+               for (deUint32 i = 0; i < inputBuffers.size(); i++)
+               {
+                       if (!inputBuffers[i]->isImage())
+                       {
+                               const Allocation& resultAlloc = inputBuffers[i]->getAllocation();
+                               invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                       context.getDevice(), resultAlloc.getMemory(),
+                                                                                       resultAlloc.getOffset(), inputBuffers[i]->getAsBuffer()->getSize());
+
+                               // we always have our result data first
+                               datas.push_back(resultAlloc.getHostPtr());
+                       }
+               }
+
+               if (!checkResult(datas, width, subgroupSize))
+               {
+                       failedIterations++;
+               }
+
+               context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
+       }
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               delete inputBuffers[i];
+       }
+
+       if (0 < failedIterations)
+       {
+               context.getTestContext().getLog()
+                               << TestLog::Message << (totalIterations - failedIterations) << " / "
+                               << totalIterations << " values passed" << TestLog::EndMessage;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus vkt::subgroups::makeGeometryTest(
+       Context& context, VkFormat format, SSBOData* extraDatas,
+       deUint32 extraDatasCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
+{
+       const deUint32 maxWidth = 1024;
+
+       const Unique<VkShaderModule> vertexShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule> geometryShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("geom"), 0u));
+
+       std::vector<BufferOrImage*> inputBuffers(extraDatasCount + 1);
+
+       // The implicit result SSBO we use to store our outputs from the vertex shader
+       {
+               vk::VkDeviceSize size = getFormatSizeInBytes(format) * maxWidth;
+               inputBuffers[0] = new Buffer(context, size);
+       }
+
+       for (deUint32 i = 0; i < (inputBuffers.size() - 1); i++)
+       {
+               if (extraDatas[i].isImage)
+               {
+                       inputBuffers[i + 1] = new Image(context,
+                                                                                       static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format);
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(extraDatas[i].format) * extraDatas[i].numElements;
+                       inputBuffers[i + 1] = new Buffer(context, size);
+               }
+
+               const Allocation& alloc = inputBuffers[i + 1]->getAllocation();
+               initializeMemory(context, alloc, extraDatas[i]);
+       }
+
+       DescriptorSetLayoutBuilder layoutBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               layoutBuilder.addBinding(inputBuffers[i]->getType(), 1,
+                                                                VK_SHADER_STAGE_GEOMETRY_BIT, DE_NULL);
+       }
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkPipelineLayout> pipelineLayout(
+               makePipelineLayout(context, *descriptorSetLayout));
+
+       const Unique<VkRenderPass> renderPass(makeRenderPass(context, VK_FORMAT_R32_SFLOAT));
+       const Unique<VkPipeline> pipeline(makeGraphicsPipeline(context, *pipelineLayout,
+                                                                         VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT,
+                                                                         *vertexShaderModule, DE_NULL, *geometryShaderModule, DE_NULL, DE_NULL,
+                                                                         *renderPass, VK_PRIMITIVE_TOPOLOGY_POINT_LIST));
+
+       DescriptorPoolBuilder poolBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               poolBuilder.addType(inputBuffers[i]->getType());
+       }
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                 VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       // Create descriptor set
+       const Unique<VkDescriptorSet> descriptorSet(
+               makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout));
+
+       DescriptorSetUpdateBuilder updateBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               if (inputBuffers[i]->isImage())
+               {
+                       VkDescriptorImageInfo info =
+                               makeDescriptorImageInfo(inputBuffers[i]->getAsImage()->getSampler(),
+                                                                               inputBuffers[i]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+               else
+               {
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(),
+                                                                                0ull, inputBuffers[i]->getAsBuffer()->getSize());
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+       }
+
+       updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+
+       const deUint32 subgroupSize = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer> cmdBuffer(
+               makeCommandBuffer(context, *cmdPool));
+
+       unsigned totalIterations = 0;
+       unsigned failedIterations = 0;
+
+       Image discardableImage(context, 1, 1, VK_FORMAT_R32_SFLOAT,
+                                                  VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                  VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+       for (deUint32 width = 1; width < maxWidth; width++)
+       {
+               for (deUint32 i = 1; i < inputBuffers.size(); i++)
+               {
+                       // re-init the data
+                       const Allocation& alloc = inputBuffers[i]->getAllocation();
+                       initializeMemory(context, alloc, extraDatas[i - 1]);
+               }
+
+               totalIterations++;
+
+               const Unique<VkFramebuffer> framebuffer(makeFramebuffer(context,
+                                                                                               *renderPass, discardableImage.getImageView(), 1, 1));
+
+               const VkClearValue clearValue = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+
+               const VkRenderPassBeginInfo renderPassBeginInfo = {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, DE_NULL, *renderPass,
+                       *framebuffer, {{0, 0}, {1, 1}}, 1, &clearValue,
+               };
+
+               beginCommandBuffer(context, *cmdBuffer);
+
+               VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
+
+               context.getDeviceInterface().cmdSetViewport(
+                       *cmdBuffer, 0, 1, &viewport);
+
+               VkRect2D scissor = {{0, 0}, {1, 1}};
+
+               context.getDeviceInterface().cmdSetScissor(
+                       *cmdBuffer, 0, 1, &scissor);
+
+               context.getDeviceInterface().cmdBeginRenderPass(
+                       *cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+               context.getDeviceInterface().cmdBindPipeline(
+                       *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+               context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
+                               VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
+                               &descriptorSet.get(), 0u, DE_NULL);
+
+               context.getDeviceInterface().cmdDraw(*cmdBuffer, width, 1, 0, 0);
+
+               context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
+
+               endCommandBuffer(context, *cmdBuffer);
+
+               Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+
+               waitFence(context, fence);
+
+               std::vector<const void*> datas;
+
+               for (deUint32 i = 0; i < inputBuffers.size(); i++)
+               {
+                       if (!inputBuffers[i]->isImage())
+                       {
+                               const Allocation& resultAlloc = inputBuffers[i]->getAllocation();
+                               invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                       context.getDevice(), resultAlloc.getMemory(),
+                                                                                       resultAlloc.getOffset(), inputBuffers[i]->getAsBuffer()->getSize());
+
+                               // we always have our result data first
+                               datas.push_back(resultAlloc.getHostPtr());
+                       }
+               }
+
+               if (!checkResult(datas, width, subgroupSize))
+               {
+                       failedIterations++;
+               }
+
+               context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
+       }
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               delete inputBuffers[i];
+       }
+
+       if (0 < failedIterations)
+       {
+               context.getTestContext().getLog()
+                               << TestLog::Message << (totalIterations - failedIterations) << " / "
+                               << totalIterations << " values passed" << TestLog::EndMessage;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus vkt::subgroups::makeVertexTest(
+       Context& context, VkFormat format, SSBOData* extraDatas,
+       deUint32 extraDatasCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
+{
+       const deUint32 maxWidth = 1024;
+
+       const Unique<VkShaderModule> vertexShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("vert"), 0u));
+
+       std::vector<BufferOrImage*> inputBuffers(extraDatasCount + 1);
+
+       // The implicit result SSBO we use to store our outputs from the vertex shader
+       {
+               vk::VkDeviceSize size = getFormatSizeInBytes(format) * maxWidth;
+               inputBuffers[0] = new Buffer(context, size);
+       }
+
+       for (deUint32 i = 0; i < (inputBuffers.size() - 1); i++)
+       {
+               if (extraDatas[i].isImage)
+               {
+                       inputBuffers[i + 1] = new Image(context,
+                                                                                       static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format);
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(extraDatas[i].format) * extraDatas[i].numElements;
+                       inputBuffers[i + 1] = new Buffer(context, size);
+               }
+
+               const Allocation& alloc = inputBuffers[i + 1]->getAllocation();
+               initializeMemory(context, alloc, extraDatas[i]);
+       }
+
+       DescriptorSetLayoutBuilder layoutBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               layoutBuilder.addBinding(inputBuffers[i]->getType(), 1,
+                                                                VK_SHADER_STAGE_VERTEX_BIT, DE_NULL);
+       }
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkPipelineLayout> pipelineLayout(
+               makePipelineLayout(context, *descriptorSetLayout));
+
+       const Unique<VkRenderPass> renderPass(makeRenderPass(context, VK_FORMAT_R32_SFLOAT));
+       const Unique<VkPipeline> pipeline(makeGraphicsPipeline(context, *pipelineLayout,
+                                                                         VK_SHADER_STAGE_VERTEX_BIT, *vertexShaderModule, DE_NULL, DE_NULL, DE_NULL, DE_NULL,
+                                                                         *renderPass, VK_PRIMITIVE_TOPOLOGY_POINT_LIST));
+
+       DescriptorPoolBuilder poolBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               poolBuilder.addType(inputBuffers[i]->getType());
+       }
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                 VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       // Create descriptor set
+       const Unique<VkDescriptorSet> descriptorSet(
+               makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout));
+
+       DescriptorSetUpdateBuilder updateBuilder;
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               if (inputBuffers[i]->isImage())
+               {
+                       VkDescriptorImageInfo info =
+                               makeDescriptorImageInfo(inputBuffers[i]->getAsImage()->getSampler(),
+                                                                               inputBuffers[i]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+               else
+               {
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(),
+                                                                                0ull, inputBuffers[i]->getAsBuffer()->getSize());
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+       }
+
+       updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+
+       const deUint32 subgroupSize = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer> cmdBuffer(
+               makeCommandBuffer(context, *cmdPool));
+
+       unsigned totalIterations = 0;
+       unsigned failedIterations = 0;
+
+       Image discardableImage(context, 1, 1, VK_FORMAT_R32_SFLOAT,
+                                                  VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                  VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+       for (deUint32 width = 1; width < maxWidth; width++)
+       {
+               for (deUint32 i = 1; i < inputBuffers.size(); i++)
+               {
+                       // re-init the data
+                       const Allocation& alloc = inputBuffers[i]->getAllocation();
+                       initializeMemory(context, alloc, extraDatas[i - 1]);
+               }
+
+               totalIterations++;
+
+               const Unique<VkFramebuffer> framebuffer(makeFramebuffer(context,
+                                                                                               *renderPass, discardableImage.getImageView(), 1, 1));
+
+               const VkClearValue clearValue = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+
+               const VkRenderPassBeginInfo renderPassBeginInfo = {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, DE_NULL, *renderPass,
+                       *framebuffer, {{0, 0}, {1, 1}}, 1, &clearValue,
+               };
+
+               beginCommandBuffer(context, *cmdBuffer);
+
+               VkViewport viewport = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
+
+               context.getDeviceInterface().cmdSetViewport(
+                       *cmdBuffer, 0, 1, &viewport);
+
+               VkRect2D scissor = {{0, 0}, {1, 1}};
+
+               context.getDeviceInterface().cmdSetScissor(
+                       *cmdBuffer, 0, 1, &scissor);
+
+               context.getDeviceInterface().cmdBeginRenderPass(
+                       *cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+               context.getDeviceInterface().cmdBindPipeline(
+                       *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+               context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
+                               VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
+                               &descriptorSet.get(), 0u, DE_NULL);
+
+               context.getDeviceInterface().cmdDraw(*cmdBuffer, width, 1, 0, 0);
+
+               context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
+
+               endCommandBuffer(context, *cmdBuffer);
+
+               Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+
+               waitFence(context, fence);
+
+               std::vector<const void*> datas;
+
+               for (deUint32 i = 0; i < inputBuffers.size(); i++)
+               {
+                       if (!inputBuffers[i]->isImage())
+                       {
+                               const Allocation& resultAlloc = inputBuffers[i]->getAllocation();
+                               invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                       context.getDevice(), resultAlloc.getMemory(),
+                                                                                       resultAlloc.getOffset(), inputBuffers[i]->getAsBuffer()->getSize());
+
+                               // we always have our result data first
+                               datas.push_back(resultAlloc.getHostPtr());
+                       }
+               }
+
+               if (!checkResult(datas, width, subgroupSize))
+               {
+                       failedIterations++;
+               }
+
+               context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
+       }
+
+       for (deUint32 i = 0; i < inputBuffers.size(); i++)
+       {
+               delete inputBuffers[i];
+       }
+
+       if (0 < failedIterations)
+       {
+               context.getTestContext().getLog()
+                               << TestLog::Message << (totalIterations - failedIterations) << " / "
+                               << totalIterations << " values passed" << TestLog::EndMessage;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus vkt::subgroups::makeFragmentTest(
+       Context& context, VkFormat format, SSBOData* extraDatas,
+       deUint32 extraDatasCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
+                                               deUint32 height, deUint32 subgroupSize))
+{
+       const Unique<VkShaderModule> vertexShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule> fragmentShaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("frag"), 0u));
+
+       std::vector<BufferOrImage*> inputBuffers(extraDatasCount);
+
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               if (extraDatas[i].isImage)
+               {
+                       inputBuffers[i] = new Image(context,
+                                                                               static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format);
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(extraDatas[i].format) * extraDatas[i].numElements;
+                       inputBuffers[i] = new Buffer(context, size);
+               }
+
+               const Allocation& alloc = inputBuffers[i]->getAllocation();
+               initializeMemory(context, alloc, extraDatas[i]);
+       }
+
+       DescriptorSetLayoutBuilder layoutBuilder;
+
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               layoutBuilder.addBinding(inputBuffers[i]->getType(), 1,
+                                                                VK_SHADER_STAGE_FRAGMENT_BIT, DE_NULL);
+       }
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkPipelineLayout> pipelineLayout(
+               makePipelineLayout(context, *descriptorSetLayout));
+
+       const Unique<VkRenderPass> renderPass(makeRenderPass(context, format));
+       const Unique<VkPipeline> pipeline(makeGraphicsPipeline(context, *pipelineLayout,
+                                                                         VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
+                                                                         *vertexShaderModule, *fragmentShaderModule, DE_NULL, DE_NULL, DE_NULL, *renderPass));
+
+       DescriptorPoolBuilder poolBuilder;
+
+       // To stop validation complaining, always add at least one type to pool.
+       poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               poolBuilder.addType(inputBuffers[i]->getType());
+       }
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                 VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       // Create descriptor set
+       const Unique<VkDescriptorSet> descriptorSet(
+               makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout));
+
+       DescriptorSetUpdateBuilder updateBuilder;
+
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               if (inputBuffers[i]->isImage())
+               {
+                       VkDescriptorImageInfo info =
+                               makeDescriptorImageInfo(inputBuffers[i]->getAsImage()->getSampler(),
+                                                                               inputBuffers[i]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+               else
+               {
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(),
+                                                                                0ull, inputBuffers[i]->getAsBuffer()->getSize());
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+       }
+
+       updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+
+       const deUint32 subgroupSize = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer> cmdBuffer(
+               makeCommandBuffer(context, *cmdPool));
+
+       unsigned totalIterations = 0;
+       unsigned failedIterations = 0;
+
+       for (deUint32 width = 8; width <= subgroupSize; width *= 2)
+       {
+               for (deUint32 height = 8; height <= subgroupSize; height *= 2)
+               {
+                       totalIterations++;
+
+                       // re-init the data
+                       for (deUint32 i = 0; i < extraDatasCount; i++)
+                       {
+                               const Allocation& alloc = inputBuffers[i]->getAllocation();
+                               initializeMemory(context, alloc, extraDatas[i]);
+                       }
+
+                       VkDeviceSize formatSize = getFormatSizeInBytes(format);
+                       const VkDeviceSize resultImageSizeInBytes =
+                               width * height * formatSize;
+
+                       Image resultImage(context, width, height, format,
+                                                         VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                         VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+                       Buffer resultBuffer(context, resultImageSizeInBytes,
+                                                               VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+
+                       const Unique<VkFramebuffer> framebuffer(makeFramebuffer(context,
+                                                                                                       *renderPass, resultImage.getImageView(), width, height));
+
+                       const VkClearValue clearValue = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+
+                       const VkRenderPassBeginInfo renderPassBeginInfo = {
+                               VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, DE_NULL, *renderPass,
+                               *framebuffer, {{0, 0}, {width, height}}, 1, &clearValue,
+                       };
+
+                       beginCommandBuffer(context, *cmdBuffer);
+
+                       VkViewport viewport = {0.0f, 0.0f, static_cast<float>(width),
+                                                                  static_cast<float>(height), 0.0f, 1.0f
+                                                                 };
+
+                       context.getDeviceInterface().cmdSetViewport(
+                               *cmdBuffer, 0, 1, &viewport);
+
+                       VkRect2D scissor = {{0, 0}, {width, height}};
+
+                       context.getDeviceInterface().cmdSetScissor(
+                               *cmdBuffer, 0, 1, &scissor);
+
+                       context.getDeviceInterface().cmdBeginRenderPass(
+                               *cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+                       context.getDeviceInterface().cmdBindPipeline(
+                               *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+                       context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
+                                       VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
+                                       &descriptorSet.get(), 0u, DE_NULL);
+
+                       context.getDeviceInterface().cmdDraw(*cmdBuffer, 3, 1, 0, 0);
+
+                       context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
+
+                       vk::VkBufferImageCopy region = {0, 0, 0,
+                               {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, {0, 0, 0},
+                               {width, height, 1}
+                       };
+                       context.getDeviceInterface().cmdCopyImageToBuffer(*cmdBuffer,
+                                       resultImage.getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+                                       resultBuffer.getBuffer(), 1, &region);
+
+                       endCommandBuffer(context, *cmdBuffer);
+
+                       Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+
+                       waitFence(context, fence);
+
+                       std::vector<const void*> datas;
+                       {
+                               const Allocation& resultAlloc = resultBuffer.getAllocation();
+                               invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                       context.getDevice(), resultAlloc.getMemory(),
+                                                                                       resultAlloc.getOffset(), resultImageSizeInBytes);
+
+                               // we always have our result data first
+                               datas.push_back(resultAlloc.getHostPtr());
+                       }
+
+                       for (deUint32 i = 0; i < extraDatasCount; i++)
+                       {
+                               if (!inputBuffers[i]->isImage())
+                               {
+                                       const Allocation& resultAlloc = inputBuffers[i]->getAllocation();
+                                       invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                               context.getDevice(), resultAlloc.getMemory(),
+                                                                                               resultAlloc.getOffset(), inputBuffers[i]->getAsBuffer()->getSize());
+
+                                       // we always have our result data first
+                                       datas.push_back(resultAlloc.getHostPtr());
+                               }
+                       }
+
+                       if (!checkResult(datas, width, height, subgroupSize))
+                       {
+                               failedIterations++;
+                       }
+
+                       context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
+               }
+       }
+
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               delete inputBuffers[i];
+       }
+
+       if (0 < failedIterations)
+       {
+               context.getTestContext().getLog()
+                               << TestLog::Message << (totalIterations - failedIterations) << " / "
+                               << totalIterations << " values passed" << TestLog::EndMessage;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
+tcu::TestStatus vkt::subgroups::makeComputeTest(
+       Context& context, VkFormat format, SSBOData* inputs, deUint32 inputsCount,
+       bool (*checkResult)(std::vector<const void*> datas,
+                                               const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                               deUint32 subgroupSize))
+{
+       VkDeviceSize elementSize = getFormatSizeInBytes(format);
+
+       const VkDeviceSize resultBufferSize = maxSupportedSubgroupSize() *
+                                                                                 maxSupportedSubgroupSize() *
+                                                                                 maxSupportedSubgroupSize();
+       const VkDeviceSize resultBufferSizeInBytes = resultBufferSize * elementSize;
+
+       Buffer resultBuffer(
+               context, resultBufferSizeInBytes);
+
+       std::vector<BufferOrImage*> inputBuffers(inputsCount);
+
+       for (deUint32 i = 0; i < inputsCount; i++)
+       {
+               if (inputs[i].isImage)
+               {
+                       inputBuffers[i] = new Image(context,
+                                                                               static_cast<deUint32>(inputs[i].numElements), 1, inputs[i].format);
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(inputs[i].format) * inputs[i].numElements;
+                       inputBuffers[i] = new Buffer(context, size);
+               }
+
+               const Allocation& alloc = inputBuffers[i]->getAllocation();
+               initializeMemory(context, alloc, inputs[i]);
+       }
+
+       DescriptorSetLayoutBuilder layoutBuilder;
+       layoutBuilder.addBinding(
+               resultBuffer.getType(), 1, VK_SHADER_STAGE_COMPUTE_BIT, DE_NULL);
+
+       for (deUint32 i = 0; i < inputsCount; i++)
+       {
+               layoutBuilder.addBinding(
+                       inputBuffers[i]->getType(), 1, VK_SHADER_STAGE_COMPUTE_BIT, DE_NULL);
+       }
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkShaderModule> shaderModule(
+               createShaderModule(context.getDeviceInterface(), context.getDevice(),
+                                                  context.getBinaryCollection().get("comp"), 0u));
+       const Unique<VkPipelineLayout> pipelineLayout(
+               makePipelineLayout(context, *descriptorSetLayout));
+
+       DescriptorPoolBuilder poolBuilder;
+
+       poolBuilder.addType(resultBuffer.getType());
+
+       for (deUint32 i = 0; i < inputsCount; i++)
+       {
+               poolBuilder.addType(inputBuffers[i]->getType());
+       }
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                 VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       // Create descriptor set
+       const Unique<VkDescriptorSet> descriptorSet(
+               makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout));
+
+       DescriptorSetUpdateBuilder updateBuilder;
+
+       const VkDescriptorBufferInfo resultDescriptorInfo =
+               makeDescriptorBufferInfo(
+                       resultBuffer.getBuffer(), 0ull, resultBufferSizeInBytes);
+
+       updateBuilder.writeSingle(*descriptorSet,
+                                                         DescriptorSetUpdateBuilder::Location::binding(0u),
+                                                         VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultDescriptorInfo);
+
+       for (deUint32 i = 0; i < inputsCount; i++)
+       {
+               if (inputBuffers[i]->isImage())
+               {
+                       VkDescriptorImageInfo info =
+                               makeDescriptorImageInfo(inputBuffers[i]->getAsImage()->getSampler(),
+                                                                               inputBuffers[i]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i + 1),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(inputs[i].format) * inputs[i].numElements;
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(), 0ull, size);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i + 1),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+       }
+
+       updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+
+       unsigned totalIterations = 0;
+       unsigned failedIterations = 0;
+
+       const deUint32 subgroupSize = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer> cmdBuffer(
+               makeCommandBuffer(context, *cmdPool));
+
+       const deUint32 numWorkgroups[3] = {4, 4, 4};
+
+       const deUint32 localSizesToTestCount = 15;
+       deUint32 localSizesToTest[localSizesToTestCount][3] =
+       {
+               {1, 1, 1},
+               {32, 4, 1},
+               {32, 1, 4},
+               {1, 32, 4},
+               {1, 4, 32},
+               {4, 1, 32},
+               {4, 32, 1},
+               {subgroupSize, 1, 1},
+               {1, subgroupSize, 1},
+               {1, 1, subgroupSize},
+               {3, 5, 7},
+               {128, 1, 1},
+               {1, 128, 1},
+               {1, 1, 64},
+               {1, 1, 1} // Isn't used, just here to make double buffering checks easier
+       };
+
+       Move<VkPipeline> lastPipeline(
+               makeComputePipeline(context, *pipelineLayout, *shaderModule,
+                                                       localSizesToTest[0][0], localSizesToTest[0][1], localSizesToTest[0][2]));
+
+       for (deUint32 index = 0; index < (localSizesToTestCount - 1); index++)
+       {
+               const deUint32 nextX = localSizesToTest[index + 1][0];
+               const deUint32 nextY = localSizesToTest[index + 1][1];
+               const deUint32 nextZ = localSizesToTest[index + 1][2];
+
+               // we are running one test
+               totalIterations++;
+
+               beginCommandBuffer(context, *cmdBuffer);
+
+               context.getDeviceInterface().cmdBindPipeline(
+                       *cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *lastPipeline);
+
+               context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
+                               VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u,
+                               &descriptorSet.get(), 0u, DE_NULL);
+
+               context.getDeviceInterface().cmdDispatch(*cmdBuffer,
+                               numWorkgroups[0], numWorkgroups[1], numWorkgroups[2]);
+
+               endCommandBuffer(context, *cmdBuffer);
+
+               Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+
+               Move<VkPipeline> nextPipeline(
+                       makeComputePipeline(context, *pipelineLayout, *shaderModule,
+                                                               nextX, nextY, nextZ));
+
+               waitFence(context, fence);
+
+               std::vector<const void*> datas;
+
+               {
+                       const Allocation& resultAlloc = resultBuffer.getAllocation();
+                       invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                               context.getDevice(), resultAlloc.getMemory(),
+                                                                               resultAlloc.getOffset(), resultBufferSizeInBytes);
+
+                       // we always have our result data first
+                       datas.push_back(resultAlloc.getHostPtr());
+               }
+
+               for (deUint32 i = 0; i < inputsCount; i++)
+               {
+                       if (!inputBuffers[i]->isImage())
+                       {
+                               vk::VkDeviceSize size =
+                                       getFormatSizeInBytes(inputs[i].format) *
+                                       inputs[i].numElements;
+                               const Allocation& resultAlloc = inputBuffers[i]->getAllocation();
+                               invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                       context.getDevice(), resultAlloc.getMemory(),
+                                                                                       resultAlloc.getOffset(), size);
+
+                               // we always have our result data first
+                               datas.push_back(resultAlloc.getHostPtr());
+                       }
+               }
+
+               if (!checkResult(datas, numWorkgroups, localSizesToTest[index], subgroupSize))
+               {
+                       failedIterations++;
+               }
+
+               context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
+
+               lastPipeline = nextPipeline;
+       }
+
+       for (deUint32 i = 0; i < inputsCount; i++)
+       {
+               delete inputBuffers[i];
+       }
+
+       if (0 < failedIterations)
+       {
+               context.getTestContext().getLog()
+                               << TestLog::Message << (totalIterations - failedIterations) << " / "
+                               << totalIterations << " values passed" << TestLog::EndMessage;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
new file mode 100644 (file)
index 0000000..f34d0d9
--- /dev/null
@@ -0,0 +1,136 @@
+#ifndef _VKTSUBGROUPSTESTSUTILS_HPP
+#define _VKTSUBGROUPSTESTSUTILS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups tests utility classes
+ */ /*--------------------------------------------------------------------*/
+
+#include "vkBuilderUtil.hpp"
+#include "vkDefs.hpp"
+#include "vkDeviceUtil.hpp"
+#include "vkMemUtil.hpp"
+#include "vkPlatform.hpp"
+#include "vkPrograms.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkRef.hpp"
+#include "vkRefUtil.hpp"
+#include "vkStrUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestCaseUtil.hpp"
+
+#include "tcuFormatUtil.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuVectorUtil.hpp"
+
+#include "gluShaderUtil.hpp"
+
+#include "deSharedPtr.hpp"
+#include "deUniquePtr.hpp"
+
+#include <string>
+
+namespace vkt
+{
+namespace subgroups
+{
+// A struct to represent input data to a shader
+struct SSBOData
+{
+       SSBOData() :
+               initializeType(InitializeNone),
+               format(vk::VK_FORMAT_UNDEFINED),
+               numElements(0),
+               isImage(false) {}
+
+       enum InputDataInitializeType
+       {
+               InitializeNone = 0,
+               InitializeNonZero,
+               InitializeZero,
+       } initializeType;
+
+       vk::VkFormat format;
+       vk::VkDeviceSize numElements;
+       bool isImage;
+};
+
+std::string getSharedMemoryBallotHelper();
+
+deUint32 getSubgroupSize(Context& context);
+
+vk::VkDeviceSize maxSupportedSubgroupSize();
+
+std::string getShaderStageName(vk::VkShaderStageFlags stage);
+
+std::string getSubgroupFeatureName(vk::VkSubgroupFeatureFlagBits bit);
+
+std::string getVertShaderForStage(vk::VkShaderStageFlags stage);
+
+bool areSubgroupOperationsSupportedForStage(
+       Context& context, vk::VkShaderStageFlags stage);
+
+bool areSubgroupOperationsRequiredForStage(vk::VkShaderStageFlags stage);
+
+bool isSubgroupFeatureSupportedForDevice(Context& context, vk::VkSubgroupFeatureFlagBits bit);
+
+bool isFragmentSSBOSupportedForDevice(Context& context);
+
+bool isVertexSSBOSupportedForDevice(Context& context);
+
+bool isDoubleSupportedForDevice(Context& context);
+
+bool isDoubleFormat(vk::VkFormat format);
+
+std::string getFormatNameForGLSL(vk::VkFormat format);
+
+tcu::TestStatus makeTessellationEvaluationTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
+
+tcu::TestStatus makeTessellationControlTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
+
+tcu::TestStatus makeGeometryTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
+
+tcu::TestStatus makeVertexTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
+
+tcu::TestStatus makeFragmentTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
+                                                                        deUint32 height, deUint32 subgroupSize));
+
+tcu::TestStatus makeComputeTest(
+       Context& context, vk::VkFormat format, SSBOData* inputs,
+       deUint32 inputsCount,
+       bool (*checkResult)(std::vector<const void*> datas,
+               const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+               deUint32 subgroupSize));
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSTESTSUTILS_HPP
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
new file mode 100644 (file)
index 0000000..80ec5aa
--- /dev/null
@@ -0,0 +1,718 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "vktSubgroupsVoteTests.hpp"
+#include "vktSubgroupsTestsUtils.hpp"
+
+#include <string>
+#include <vector>
+
+using namespace tcu;
+using namespace std;
+using namespace vk;
+using namespace vkt;
+
+namespace
+{
+enum OpType
+{
+       OPTYPE_ALL = 0,
+       OPTYPE_ANY,
+       OPTYPE_ALLEQUAL,
+       OPTYPE_LAST
+};
+
+static bool checkVertexPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = data[x];
+
+               if (0x7 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+static bool checkFragment(std::vector<const void*> datas, deUint32 width,
+                                                 deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               for (deUint32 y = 0; y < height; ++y)
+               {
+                       deUint32 val = data[x * height + y];
+
+                       if (0x7 != val)
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkCompute(std::vector<const void*> datas,
+                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       // The data should look (in binary) 0b111
+                                                       if (0x7 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkComputeAllEqual(std::vector<const void*> datas,
+                                                                const deUint32 numWorkgroups[3], const deUint32 localSize[3],
+                                                                deUint32)
+{
+       const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
+
+       for (deUint32 nX = 0; nX < numWorkgroups[0]; ++nX)
+       {
+               for (deUint32 nY = 0; nY < numWorkgroups[1]; ++nY)
+               {
+                       for (deUint32 nZ = 0; nZ < numWorkgroups[2]; ++nZ)
+                       {
+                               for (deUint32 lX = 0; lX < localSize[0]; ++lX)
+                               {
+                                       for (deUint32 lY = 0; lY < localSize[1]; ++lY)
+                                       {
+                                               for (deUint32 lZ = 0; lZ < localSize[2];
+                                                               ++lZ)
+                                               {
+                                                       const deUint32 globalInvocationX =
+                                                               nX * localSize[0] + lX;
+                                                       const deUint32 globalInvocationY =
+                                                               nY * localSize[1] + lY;
+                                                       const deUint32 globalInvocationZ =
+                                                               nZ * localSize[2] + lZ;
+
+                                                       const deUint32 globalSizeX =
+                                                               numWorkgroups[0] * localSize[0];
+                                                       const deUint32 globalSizeY =
+                                                               numWorkgroups[1] * localSize[1];
+
+                                                       const deUint32 offset =
+                                                               globalSizeX *
+                                                               ((globalSizeY *
+                                                                 globalInvocationZ) +
+                                                                globalInvocationY) +
+                                                               globalInvocationX;
+
+                                                       // The data should look (in binary) 0b111
+                                                       if (0x7 != data[offset])
+                                                       {
+                                                               return false;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+std::string getOpTypeName(int opType)
+{
+       switch (opType)
+       {
+               default:
+                       DE_FATAL("Unsupported op type");
+               case OPTYPE_ALL:
+                       return "subgroupAll";
+               case OPTYPE_ANY:
+                       return "subgroupAny";
+               case OPTYPE_ALLEQUAL:
+                       return "subgroupAllEqual";
+       }
+}
+
+struct CaseDefinition
+{
+       int opType;
+       VkShaderStageFlags shaderStage;
+       VkFormat format;
+};
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+                       << "layout (local_size_x_id = 0, local_size_y_id = 1, "
+                       "local_size_z_id = 2) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n"
+                       << "  highp uint offset = globalSize.x * ((globalSize.y * "
+                       "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + "
+                       "gl_GlobalInvocationID.x;\n";
+               if (OPTYPE_ALL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(data[gl_SubgroupInvocationID] > 0) ? 0x4 : 0;\n";
+               }
+               else if (OPTYPE_ANY == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(data[gl_SubgroupInvocationID] == data[0]) ? 0x4 : 0;\n";
+               }
+               else if (OPTYPE_ALLEQUAL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType) << "("
+                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  if (subgroupElect()) result[offset] |= 0x2;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(data[0]) ? 0x4 : 0;\n";
+               }
+
+               src << "}\n";
+
+               programCollection.glslSources.add("comp")
+                               << glu::ComputeSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream frag;
+
+               frag << "#version 450\n"
+                        << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+                        << "layout(location = 0) out uint result;\n"
+                        << "layout(set = 0, binding = 0, std430) buffer Buffer2\n"
+                        << "{\n"
+                        << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                        << "};\n"
+                        << "void main (void)\n"
+                        << "{\n";
+               if (OPTYPE_ALL == caseDef.opType)
+               {
+                       frag << "  result = " << getOpTypeName(caseDef.opType)
+                                << "(true) ? 0x1 : 0;\n"
+                                << "  result |= " << getOpTypeName(caseDef.opType)
+                                << "(false) ? 0 : 0x2;\n"
+                                << "  result |= " << getOpTypeName(caseDef.opType)
+                                << "(data[gl_SubgroupInvocationID] > 0) ? 0x4 : 0;\n";
+               }
+               else if (OPTYPE_ANY == caseDef.opType)
+               {
+                       frag << "  result = " << getOpTypeName(caseDef.opType)
+                                << "(true) ? 0x1 : 0;\n"
+                                << "  result |= " << getOpTypeName(caseDef.opType)
+                                << "(false) ? 0 : 0x2;\n"
+                                << "  result |= " << getOpTypeName(caseDef.opType)
+                                << "(data[gl_SubgroupInvocationID] == data[0]) ? 0x4 : 0;\n";
+               }
+               else if (OPTYPE_ALLEQUAL == caseDef.opType)
+               {
+                       frag << "  result = " << getOpTypeName(caseDef.opType) << "("
+                                << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                                << "  result |= " << getOpTypeName(caseDef.opType)
+                                << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                                << "  if (subgroupElect()) result |= 0x2;\n"
+                                << "  result |= " << getOpTypeName(caseDef.opType)
+                                << "(data[0]) ? 0x4 : 0;\n";
+               }
+               frag << "}\n";
+
+               programCollection.glslSources.add("frag")
+                               << glu::FragmentSource(frag.str());
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  highp uint offset = gl_VertexIndex;\n";
+               if (OPTYPE_ALL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ANY == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ALLEQUAL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType) << "("
+                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  if (subgroupElect()) result[offset] |= 0x2;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(data[0]) ? 0x4 : 0;\n";
+               }
+
+               src << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+                       << "layout(points) in;\n"
+                       << "layout(points, max_vertices = 1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  highp uint offset = gl_PrimitiveIDIn;\n";
+               if (OPTYPE_ALL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ANY == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ALLEQUAL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType) << "("
+                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  if (subgroupElect()) result[offset] |= 0x2;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(data[0]) ? 0x4 : 0;\n";
+               }
+
+               src << "}\n";
+
+               programCollection.glslSources.add("geom")
+                               << glu::GeometrySource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource("#version 450\nlayout(isolines) in;\nvoid main (void) {}\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+                       << "layout(vertices=1) out;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  highp uint offset = gl_PrimitiveID;\n";
+               if (OPTYPE_ALL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ANY == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ALLEQUAL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType) << "("
+                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  if (subgroupElect()) result[offset] |= 0x2;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(data[0]) ? 0x4 : 0;\n";
+               }
+
+               src << "}\n";
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource(src.str());
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+
+               programCollection.glslSources.add("tesc")
+                               << glu::TessellationControlSource("#version 450\nlayout(vertices=1) out;\nvoid main (void) { for(uint i = 0; i < 4; i++) { gl_TessLevelOuter[i] = 1.0f; } }\n");
+
+               std::ostringstream src;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+                       << "layout(isolines) in;\n"
+                       << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                       << "{\n"
+                       << "  uint result[];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  highp uint offset = gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5);\n";
+               if (OPTYPE_ALL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ANY == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result[offset] |= 0x4;\n";
+               }
+               else if (OPTYPE_ALLEQUAL == caseDef.opType)
+               {
+                       src << "  result[offset] = " << getOpTypeName(caseDef.opType) << "("
+                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  if (subgroupElect()) result[offset] |= 0x2;\n"
+                               << "  result[offset] |= " << getOpTypeName(caseDef.opType)
+                               << "(data[0]) ? 0x4 : 0;\n";
+               }
+
+               src << "}\n";
+
+               programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(src.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+{
+       if (!subgroups::areSubgroupOperationsSupportedForStage(
+                               context, caseDef.shaderStage))
+       {
+               if (subgroups::areSubgroupOperationsRequiredForStage(
+                                       caseDef.shaderStage))
+               {
+                       return tcu::TestStatus::fail(
+                                          "Shader stage " +
+                                          subgroups::getShaderStageName(caseDef.shaderStage) +
+                                          " is required to support subgroup operations!");
+               }
+               else
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage");
+               }
+       }
+
+       if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_VOTE_BIT))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup vote operations");
+       }
+
+       if (subgroups::isDoubleFormat(caseDef.format) &&
+                       !subgroups::isDoubleSupportedForDevice(context))
+       {
+               TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
+                                                                                  &inputData, 1, checkFragment);
+       }
+       else if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                 1, (OPTYPE_ALLEQUAL == caseDef.opType) ? checkComputeAllEqual
+                                                                                 : checkCompute);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeGeometryTest(context, VK_FORMAT_R32_UINT, &inputData,
+                                                                                  1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationControlTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeTessellationEvaluationTest(context, VK_FORMAT_R32_UINT, &inputData,
+                               1, checkVertexPipelineStages);
+       }
+       else
+       {
+               TCU_THROW(InternalError, "Unhandled shader stage");
+       }
+}
+}
+
+namespace vkt
+{
+namespace subgroups
+{
+tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+                       testCtx, "vote", "Subgroup vote category tests"));
+
+       const VkShaderStageFlags stages[] =
+       {
+               VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
+               VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
+               VK_SHADER_STAGE_GEOMETRY_BIT,
+               VK_SHADER_STAGE_VERTEX_BIT,
+               VK_SHADER_STAGE_FRAGMENT_BIT,
+               VK_SHADER_STAGE_COMPUTE_BIT
+       };
+
+       const VkFormat formats[] =
+       {
+               VK_FORMAT_R32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32B32_SINT,
+               VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R32G32_UINT,
+               VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32A32_UINT,
+               VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_SFLOAT,
+               VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
+               VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_SFLOAT,
+               VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT,
+               VK_FORMAT_R8_USCALED, VK_FORMAT_R8G8_USCALED,
+               VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8A8_USCALED,
+       };
+
+       for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
+       {
+               const VkShaderStageFlags stage = stages[stageIndex];
+
+               for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
+               {
+                       const VkFormat format = formats[formatIndex];
+
+                       for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
+                       {
+                               // Skip the typed tests for all but subgroupAllEqual()
+                               if ((VK_FORMAT_R32_UINT != format) && (OPTYPE_ALLEQUAL != opTypeIndex))
+                               {
+                                       continue;
+                               }
+
+                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+
+                               std::string op = getOpTypeName(opTypeIndex);
+
+                               addFunctionCaseWithPrograms(group.get(),
+                                                                                       de::toLower(op) + "_" +
+                                                                                       subgroups::getFormatNameForGLSL(format)
+                                                                                       + "_" + getShaderStageName(stage),
+                                                                                       "", initPrograms, test, caseDef);
+                       }
+               }
+       }
+
+       return group.release();
+}
+
+} // subgroups
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.hpp
new file mode 100644 (file)
index 0000000..57b795a
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTSUBGROUPSVOTETESTS_HPP
+#define _VKTSUBGROUPSVOTETESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017 Codeplay Software Ltd.
+ *
+ * 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 Subgroups Tests
+ */ /*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace subgroups
+{
+
+tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx);
+
+} // subgroups
+} // vkt
+
+#endif // _VKTSUBGROUPSVOTETESTS_HPP
index 4c58553..063c64e 100644 (file)
@@ -79,6 +79,7 @@
 #include "vktGeometryTests.hpp"
 #include "vktRobustnessTests.hpp"
 #include "vktMultiViewTests.hpp"
+#include "vktSubgroupsTests.hpp"
 #include "vktYCbCrTests.hpp"
 
 #include <vector>
@@ -405,6 +406,7 @@ void TestPackage::init (void)
        addChild(geometry::createTests                  (m_testCtx));
        addChild(robustness::createTests                (m_testCtx));
        addChild(MultiView::createTests                 (m_testCtx));
+       addChild(subgroups::createTests                 (m_testCtx));
        addChild(ycbcr::createTests                             (m_testCtx));
 }
 
index edc6656..a833272 100644 (file)
@@ -240441,6 +240441,4233 @@ dEQP-VK.multiview.index.tesellation_shader.15_15_15_15
 dEQP-VK.multiview.index.tesellation_shader.8_1_1_8
 dEQP-VK.multiview.index.tesellation_shader.1_2_4_8_16_32
 dEQP-VK.multiview.index.tesellation_shader.max_multi_view_view_count
+dEQP-VK.subgroups.builtin_var.subgroupsize_tess_eval
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_tess_eval
+dEQP-VK.subgroups.builtin_var.subgroupsize_tess_control
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_tess_control
+dEQP-VK.subgroups.builtin_var.subgroupsize_geometry
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_geometry
+dEQP-VK.subgroups.builtin_var.subgroupsize_vertex
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_vertex
+dEQP-VK.subgroups.builtin_var.subgroupsize_fragment
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_fragment
+dEQP-VK.subgroups.builtin_var.subgroupsize_compute
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_compute
+dEQP-VK.subgroups.builtin_var.numsubgroups_compute
+dEQP-VK.subgroups.builtin_var.subgroupid_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_tess_eval
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_tess_control
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_geometry
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_fragment
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_compute
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_compute
+dEQP-VK.subgroups.basic.subgroupelect_tess_eval
+dEQP-VK.subgroups.basic.subgroupbarrier_tess_eval
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_tess_eval
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_tess_eval
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_tess_eval
+dEQP-VK.subgroups.basic.subgroupelect_tess_control
+dEQP-VK.subgroups.basic.subgroupbarrier_tess_control
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_tess_control
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_tess_control
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_tess_control
+dEQP-VK.subgroups.basic.subgroupelect_geometry
+dEQP-VK.subgroups.basic.subgroupbarrier_geometry
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_geometry
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_geometry
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_geometry
+dEQP-VK.subgroups.basic.subgroupelect_vertex
+dEQP-VK.subgroups.basic.subgroupbarrier_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_vertex
+dEQP-VK.subgroups.basic.subgroupelect_fragment
+dEQP-VK.subgroups.basic.subgroupbarrier_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_fragment
+dEQP-VK.subgroups.basic.subgroupelect_compute
+dEQP-VK.subgroups.basic.subgroupbarrier_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarriershared_compute
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_compute
+dEQP-VK.subgroups.vote.subgroupallequal_int_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupall_uint_tess_eval
+dEQP-VK.subgroups.vote.subgroupany_uint_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_float_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_double_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_eval
+dEQP-VK.subgroups.vote.subgroupallequal_int_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_control
+dEQP-VK.subgroups.vote.subgroupall_uint_tess_control
+dEQP-VK.subgroups.vote.subgroupany_uint_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_float_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_double_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_control
+dEQP-VK.subgroups.vote.subgroupallequal_int_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_geometry
+dEQP-VK.subgroups.vote.subgroupall_uint_geometry
+dEQP-VK.subgroups.vote.subgroupany_uint_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uint_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_float_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_double_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bool_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_geometry
+dEQP-VK.subgroups.vote.subgroupallequal_int_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex
+dEQP-VK.subgroups.vote.subgroupall_uint_vertex
+dEQP-VK.subgroups.vote.subgroupany_uint_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_float_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_double_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_int_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_fragment
+dEQP-VK.subgroups.vote.subgroupall_uint_fragment
+dEQP-VK.subgroups.vote.subgroupany_uint_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uint_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_float_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_double_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bool_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_fragment
+dEQP-VK.subgroups.vote.subgroupallequal_int_compute
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_compute
+dEQP-VK.subgroups.vote.subgroupall_uint_compute
+dEQP-VK.subgroups.vote.subgroupany_uint_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uint_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_compute
+dEQP-VK.subgroups.vote.subgroupallequal_float_compute
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_compute
+dEQP-VK.subgroups.vote.subgroupallequal_double_compute
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bool_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_compute
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_compute
+dEQP-VK.subgroups.ballot.tess_eval
+dEQP-VK.subgroups.ballot.tess_control
+dEQP-VK.subgroups.ballot.geometry
+dEQP-VK.subgroups.ballot.vertex
+dEQP-VK.subgroups.ballot.fragment
+dEQP-VK.subgroups.ballot.compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_tess_eval
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_tess_control
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_geometry
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_fragment
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_compute
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_compute
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_tess_eval
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_tess_control
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_geometry
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_geometry
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_fragment
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_fragment
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_compute
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_tess_eval
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_tess_control
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_geometry
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_geometry
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_fragment
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_fragment
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_compute
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_compute
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_tess_eval
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_tess_control
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_geometry
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_fragment
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_compute
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_tess_eval
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_tess_control
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_geometry
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_fragment
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_compute
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_tess_eval
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_tess_control
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_geometry
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_fragment
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_compute
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_compute
+dEQP-VK.subgroups.shape.clustered_tess_eval
+dEQP-VK.subgroups.shape.quad_tess_eval
+dEQP-VK.subgroups.shape.clustered_tess_control
+dEQP-VK.subgroups.shape.quad_tess_control
+dEQP-VK.subgroups.shape.clustered_geometry
+dEQP-VK.subgroups.shape.quad_geometry
+dEQP-VK.subgroups.shape.clustered_vertex
+dEQP-VK.subgroups.shape.quad_vertex
+dEQP-VK.subgroups.shape.clustered_fragment
+dEQP-VK.subgroups.shape.quad_fragment
+dEQP-VK.subgroups.shape.clustered_compute
+dEQP-VK.subgroups.shape.quad_compute
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_optimal
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear_mapped
index 69865ff..f0073d3 100644 (file)
@@ -274,6 +274,7 @@ typedef enum VkStructureType {
     VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,
     VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = 1000085000,
     VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000093000,
     VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = 1000112000,
     VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = 1000112001,
@@ -4007,6 +4008,27 @@ typedef struct VkPhysicalDeviceSparseImageFormatInfo2KHR {
     VkImageTiling            tiling;
 } VkPhysicalDeviceSparseImageFormatInfo2KHR;
 
+typedef enum VkSubgroupFeatureFlagBits {
+    VK_SUBGROUP_FEATURE_BASIC_BIT = 0x00000001,
+    VK_SUBGROUP_FEATURE_VOTE_BIT = 0x00000002,
+    VK_SUBGROUP_FEATURE_ARITHMETIC_BIT = 0x00000004,
+    VK_SUBGROUP_FEATURE_BALLOT_BIT = 0x00000008,
+    VK_SUBGROUP_FEATURE_SHUFFLE_BIT = 0x00000010,
+    VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = 0x00000020,
+    VK_SUBGROUP_FEATURE_CLUSTERED_BIT = 0x00000040,
+    VK_SUBGROUP_FEATURE_QUAD_BIT = 0x00000080,
+    VK_SUBGROUP_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
+} VkSubgroupFeatureFlagBits;
+typedef VkFlags VkSubgroupFeatureFlags;
+
+typedef struct VkPhysicalDeviceSubgroupProperties {
+    VkStructureType           sType;
+    void*                     pNext;
+    uint32_t                  subgroupSize;
+    VkShaderStageFlags        supportedStages;
+    VkSubgroupFeatureFlags    supportedOperations;
+    VkBool32                  quadOperationsInAllStages;
+} VkPhysicalDeviceSubgroupProperties;
 
 typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR* pFeatures);
 typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2KHR* pProperties);