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
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 \
$(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 \
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
"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"),
]
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,
};
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,
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;
#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)
{
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);
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);
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";
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[] =
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";
VkImageTiling tiling;
};
+struct VkPhysicalDeviceSubgroupProperties
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 subgroupSize;
+ VkShaderStageFlags supportedStages;
+ VkSubgroupFeatureFlags supportedOperations;
+ VkBool32 quadOperationsInAllStages;
+};
+
struct VkPhysicalDevicePushDescriptorPropertiesKHR
{
VkStructureType sType;
add_subdirectory(robustness)
add_subdirectory(renderpass)
add_subdirectory(multiview)
+add_subdirectory(subgroups)
add_subdirectory(ycbcr)
include_directories(
robustness
renderpass
multiview
+ subgroups
ycbcr
)
deqp-vk-robustness
deqp-vk-render-pass
deqp-vk-multiview
+ deqp-vk-subgroups
deqp-vk-ycbcr
)
--- /dev/null
+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})
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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, ®ion);
+
+ 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");
+}
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
#include "vktGeometryTests.hpp"
#include "vktRobustnessTests.hpp"
#include "vktMultiViewTests.hpp"
+#include "vktSubgroupsTests.hpp"
#include "vktYCbCrTests.hpp"
#include <vector>
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));
}
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
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,
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);