KHR-GL45.gl_spirv.spirv_glsl_to_spirv_specialization_constants_test
KHR-GL45.gl_spirv.spirv_validation_builtin_variable_decorations_test
KHR-GL45.gl_spirv.spirv_validation_capabilities_test
+KHR-GL45.subgroups.builtin_var.graphics.subgroupsize
+KHR-GL45.subgroups.builtin_var.graphics.subgroupinvocationid
+KHR-GL45.subgroups.builtin_var.compute.subgroupsize_compute
+KHR-GL45.subgroups.builtin_var.compute.subgroupinvocationid_compute
+KHR-GL45.subgroups.builtin_var.compute.numsubgroups
+KHR-GL45.subgroups.builtin_var.compute.subgroupid
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupsize_vertex
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupsize_tess_eval
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupsize_tess_control
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupsize_geometry
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_vertex
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_eval
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_control
+KHR-GL45.subgroups.builtin_var.framebuffer.subgroupinvocationid_geometry
+KHR-GL45.subgroups.builtin_mask_var.graphics.subgroupeqmask
+KHR-GL45.subgroups.builtin_mask_var.graphics.subgroupgemask
+KHR-GL45.subgroups.builtin_mask_var.graphics.subgroupgtmask
+KHR-GL45.subgroups.builtin_mask_var.graphics.subgrouplemask
+KHR-GL45.subgroups.builtin_mask_var.graphics.subgroupltmask
+KHR-GL45.subgroups.builtin_mask_var.compute.subgroupeqmask
+KHR-GL45.subgroups.builtin_mask_var.compute.subgroupgemask
+KHR-GL45.subgroups.builtin_mask_var.compute.subgroupgtmask
+KHR-GL45.subgroups.builtin_mask_var.compute.subgrouplemask
+KHR-GL45.subgroups.builtin_mask_var.compute.subgroupltmask
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_vertex
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_eval
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_control
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_geometry
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_vertex
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_eval
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_control
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgemask_geometry
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_vertex
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_eval
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_control
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_geometry
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_vertex
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_eval
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_control
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgrouplemask_geometry
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_vertex
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_eval
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_control
+KHR-GL45.subgroups.builtin_mask_var.framebuffer.subgroupltmask_geometry
+KHR-GL45.subgroups.basic.graphics.subgroupelect
+KHR-GL45.subgroups.basic.graphics.subgroupbarrier
+KHR-GL45.subgroups.basic.graphics.subgroupmemorybarrier
+KHR-GL45.subgroups.basic.graphics.subgroupmemorybarrierbuffer
+KHR-GL45.subgroups.basic.graphics.subgroupmemorybarrierimage
+KHR-GL45.subgroups.basic.compute.subgroupelect
+KHR-GL45.subgroups.basic.compute.subgroupbarrier
+KHR-GL45.subgroups.basic.compute.subgroupmemorybarrier
+KHR-GL45.subgroups.basic.compute.subgroupmemorybarrierbuffer
+KHR-GL45.subgroups.basic.compute.subgroupmemorybarriershared
+KHR-GL45.subgroups.basic.compute.subgroupmemorybarrierimage
+KHR-GL45.subgroups.basic.framebuffer.subgroupelect_vertex
+KHR-GL45.subgroups.basic.framebuffer.subgroupelect_tess_eval
+KHR-GL45.subgroups.basic.framebuffer.subgroupelect_tess_control
+KHR-GL45.subgroups.basic.framebuffer.subgroupelect_geometry
+KHR-GL45.subgroups.basic.framebuffer.subgroupbarrier_fragment
+KHR-GL45.subgroups.basic.framebuffer.subgroupbarrier_vertex
+KHR-GL45.subgroups.basic.framebuffer.subgroupbarrier_tess_eval
+KHR-GL45.subgroups.basic.framebuffer.subgroupbarrier_tess_control
+KHR-GL45.subgroups.basic.framebuffer.subgroupbarrier_geometry
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_fragment
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_vertex
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_eval
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_control
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrier_geometry
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_fragment
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_vertex
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_eval
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_control
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_geometry
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_fragment
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_vertex
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_eval
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_control
+KHR-GL45.subgroups.basic.framebuffer.subgroupmemorybarrierimage_geometry
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_int
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_ivec2
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_ivec3
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_ivec4
+KHR-GL45.subgroups.vote.graphics.subgroupall_uint
+KHR-GL45.subgroups.vote.graphics.subgroupany_uint
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_uint
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_uvec2
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_uvec3
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_uvec4
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_float
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_vec2
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_vec3
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_vec4
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_double
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_dvec2
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_dvec3
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_dvec4
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_bool
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_bvec2
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_bvec3
+KHR-GL45.subgroups.vote.graphics.subgroupallequal_bvec4
+KHR-GL45.subgroups.vote.compute.subgroupallequal_int
+KHR-GL45.subgroups.vote.compute.subgroupallequal_ivec2
+KHR-GL45.subgroups.vote.compute.subgroupallequal_ivec3
+KHR-GL45.subgroups.vote.compute.subgroupallequal_ivec4
+KHR-GL45.subgroups.vote.compute.subgroupall_uint
+KHR-GL45.subgroups.vote.compute.subgroupany_uint
+KHR-GL45.subgroups.vote.compute.subgroupallequal_uint
+KHR-GL45.subgroups.vote.compute.subgroupallequal_uvec2
+KHR-GL45.subgroups.vote.compute.subgroupallequal_uvec3
+KHR-GL45.subgroups.vote.compute.subgroupallequal_uvec4
+KHR-GL45.subgroups.vote.compute.subgroupallequal_float
+KHR-GL45.subgroups.vote.compute.subgroupallequal_vec2
+KHR-GL45.subgroups.vote.compute.subgroupallequal_vec3
+KHR-GL45.subgroups.vote.compute.subgroupallequal_vec4
+KHR-GL45.subgroups.vote.compute.subgroupallequal_double
+KHR-GL45.subgroups.vote.compute.subgroupallequal_dvec2
+KHR-GL45.subgroups.vote.compute.subgroupallequal_dvec3
+KHR-GL45.subgroups.vote.compute.subgroupallequal_dvec4
+KHR-GL45.subgroups.vote.compute.subgroupallequal_bool
+KHR-GL45.subgroups.vote.compute.subgroupallequal_bvec2
+KHR-GL45.subgroups.vote.compute.subgroupallequal_bvec3
+KHR-GL45.subgroups.vote.compute.subgroupallequal_bvec4
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_int_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_int_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_int_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_int_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec2_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec3_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_ivec4_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupall_uint_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupall_uint_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupall_uint_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupall_uint_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupany_uint_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupany_uint_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupany_uint_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupany_uint_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uint_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec2_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec3_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_uvec4_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_float_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_float_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_float_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_float_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec2_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec3_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_vec4_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_double_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_double_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_double_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_double_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec2_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec3_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_dvec4_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bool_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec2_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec3_geometry
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_vertex
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_eval
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_control
+KHR-GL45.subgroups.vote.framebuffer.subgroupallequal_bvec4_geometry
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_int_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_ivec2_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_ivec3_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_ivec4_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupall_uint_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupany_uint_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_uint_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_uvec2_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_uvec3_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_uvec4_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_float_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_vec2_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_vec3_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_vec4_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_double_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_dvec2_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_dvec3_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_dvec4_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_bool_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_bvec2_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_bvec3_fragment
+KHR-GL45.subgroups.vote.frag_helper.subgroupallequal_bvec4_fragment
+KHR-GL45.subgroups.ballot.graphics.graphic
+KHR-GL45.subgroups.ballot.compute.compute
+KHR-GL45.subgroups.ballot.framebuffer.tess_eval
+KHR-GL45.subgroups.ballot.framebuffer.tess_control
+KHR-GL45.subgroups.ballot.framebuffer.geometry
+KHR-GL45.subgroups.ballot.framebuffer.vertex
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_int
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_int
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uint
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uint
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_float
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_float
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_double
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_double
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bool
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bool
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec2
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec3
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec4
+KHR-GL45.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_int
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_int
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uint
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uint
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_float
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_float
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_double
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_double
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bool
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bool
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec2
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec3
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec4
+KHR-GL45.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec4
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublevertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublegeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublevertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublegeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolvertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolgeometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4geometry
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4vertex
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_eval
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_control
+KHR-GL45.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4geometry
+KHR-GL45.subgroups.ballot_other.graphics.subgroupinverseballot
+KHR-GL45.subgroups.ballot_other.graphics.subgroupballotbitextract
+KHR-GL45.subgroups.ballot_other.graphics.subgroupballotbitcount
+KHR-GL45.subgroups.ballot_other.graphics.subgroupballotinclusivebitcount
+KHR-GL45.subgroups.ballot_other.graphics.subgroupballotexclusivebitcount
+KHR-GL45.subgroups.ballot_other.graphics.subgroupballotfindlsb
+KHR-GL45.subgroups.ballot_other.graphics.subgroupballotfindmsb
+KHR-GL45.subgroups.ballot_other.compute.subgroupinverseballot
+KHR-GL45.subgroups.ballot_other.compute.subgroupballotbitextract
+KHR-GL45.subgroups.ballot_other.compute.subgroupballotbitcount
+KHR-GL45.subgroups.ballot_other.compute.subgroupballotinclusivebitcount
+KHR-GL45.subgroups.ballot_other.compute.subgroupballotexclusivebitcount
+KHR-GL45.subgroups.ballot_other.compute.subgroupballotfindlsb
+KHR-GL45.subgroups.ballot_other.compute.subgroupballotfindmsb
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_vertex
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_eval
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_control
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupinverseballot_geometry
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_vertex
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_eval
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_control
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitextract_geometry
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_vertex
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_eval
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_control
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotbitcount_geometry
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_vertex
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_eval
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_control
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_geometry
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_vertex
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_eval
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_control
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_geometry
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_vertex
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_eval
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_control
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_geometry
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_vertex
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_eval
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_control
+KHR-GL45.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_geometry
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_int
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uint
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_float
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_vec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_vec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_vec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_double
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupadd_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmul_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmin_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupmax_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bool
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec2
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec3
+KHR-GL45.subgroups.arithmetic.graphics.subgroupand_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupor_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupxor_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec4
+KHR-GL45.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_int
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_ivec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_ivec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_ivec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uint
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_uvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_float
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_vec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_vec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_vec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_double
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_dvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_dvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupadd_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmul_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmin_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupmax_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemul_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemin_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivemax_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemul_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemin_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivemax_dvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bool
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bvec2
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bvec3
+KHR-GL45.subgroups.arithmetic.compute.subgroupand_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupor_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupxor_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveand_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusiveor_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupinclusivexor_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveand_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusiveor_bvec4
+KHR-GL45.subgroups.arithmetic.compute.subgroupexclusivexor_bvec4
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupand_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupor_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-GL45.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_int
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_int
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_int
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_int
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_int
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_int
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_int
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_ivec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_ivec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_ivec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_ivec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_ivec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_ivec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_ivec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_ivec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_ivec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_ivec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_ivec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_ivec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_ivec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_ivec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_ivec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_ivec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_ivec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_ivec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_ivec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_ivec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_ivec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uint
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uint
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uint
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uint
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_uint
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_uint
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uint
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_uvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_uvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_uvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_uvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_uvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_uvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_uvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_uvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_uvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_uvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_uvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_float
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_float
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_float
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_float
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_vec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_vec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_vec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_vec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_vec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_vec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_vec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_vec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_vec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_vec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_vec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_vec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_double
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_double
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_double
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_double
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_dvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_dvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_dvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_dvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_dvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_dvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_dvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_dvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredadd_dvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmul_dvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmin_dvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredmax_dvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_bool
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_bool
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bool
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_bvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_bvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bvec2
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_bvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_bvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bvec3
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredand_bvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredor_bvec4
+KHR-GL45.subgroups.clustered.graphics.subgroupclusteredxor_bvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_int
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_int
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_int
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_int
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_int
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_int
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_int
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_ivec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_ivec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_ivec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_ivec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_ivec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_ivec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_ivec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_ivec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_ivec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_ivec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_ivec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_ivec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_ivec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_ivec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_ivec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_ivec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_ivec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_ivec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_ivec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_ivec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_ivec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_uint
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_uint
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_uint
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_uint
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_uint
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_uint
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_uint
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_uvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_uvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_uvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_uvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_uvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_uvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_uvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_uvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_uvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_uvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_uvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_uvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_uvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_uvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_uvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_uvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_uvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_uvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_uvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_uvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_uvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_float
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_float
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_float
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_float
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_vec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_vec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_vec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_vec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_vec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_vec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_vec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_vec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_vec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_vec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_vec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_vec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_double
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_double
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_double
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_double
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_dvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_dvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_dvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_dvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_dvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_dvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_dvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_dvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredadd_dvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmul_dvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmin_dvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredmax_dvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_bool
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_bool
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_bool
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_bvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_bvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_bvec2
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_bvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_bvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_bvec3
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredand_bvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredor_bvec4
+KHR-GL45.subgroups.clustered.compute.subgroupclusteredxor_bvec4
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_int_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_int_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_int_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_int_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_int_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_int_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_int_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uint_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uint_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_float_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_float_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_float_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_float_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_double_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_double_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_double_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_double_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bool_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bool_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_geometry
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_vertex
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_eval
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_control
+KHR-GL45.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_geometry
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_int
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_ivec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_ivec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_ivec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uint
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_uvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_float
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_vec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_vec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_vec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_double
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_dvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_dvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupadd_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmul_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmin_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupmax_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemul_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemin_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivemax_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemul_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemin_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivemax_dvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bool
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bvec2
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bvec3
+KHR-GL45.subgroups.partitioned.graphics.subgroupand_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupor_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupxor_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveand_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusiveor_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupinclusivexor_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveand_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusiveor_bvec4
+KHR-GL45.subgroups.partitioned.graphics.subgroupexclusivexor_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_int
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_int
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_int
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_int
+KHR-GL45.subgroups.partitioned.compute.subgroupand_int
+KHR-GL45.subgroups.partitioned.compute.subgroupor_int
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_int
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_int
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_int
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_int
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_int
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_int
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_int
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_int
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_int
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_int
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_int
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_int
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_int
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_int
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_int
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupand_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupor_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_ivec2
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupand_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupor_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_ivec3
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupand_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupor_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_ivec4
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupand_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupor_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uint
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupand_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupor_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupand_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupor_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupand_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupor_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_uvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_float
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_float
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_float
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_float
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_float
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_float
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_float
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_float
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_float
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_float
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_float
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_float
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_vec2
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_vec3
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_vec4
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_double
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_double
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_double
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_double
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_double
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_double
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_double
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_double
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_double
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_double
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_double
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_double
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_dvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_dvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupadd_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmul_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmin_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupmax_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveadd_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemul_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemin_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivemax_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveadd_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemul_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemin_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivemax_dvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupand_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupor_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bool
+KHR-GL45.subgroups.partitioned.compute.subgroupand_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupor_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bvec2
+KHR-GL45.subgroups.partitioned.compute.subgroupand_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupor_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bvec3
+KHR-GL45.subgroups.partitioned.compute.subgroupand_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupor_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupxor_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveand_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusiveor_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupinclusivexor_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveand_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusiveor_bvec4
+KHR-GL45.subgroups.partitioned.compute.subgroupexclusivexor_bvec4
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupadd_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmul_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmin_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupmax_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupand_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupor_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupxor_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-GL45.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_int
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_int
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_int
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_int
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_ivec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_ivec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_ivec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_ivec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_ivec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_ivec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_ivec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_ivec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_ivec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_ivec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_ivec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_ivec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_uint
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uint
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uint
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uint
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_uvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_uvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_uvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_uvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_uvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_uvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_float
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_float
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_float
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_float
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_vec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_vec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_vec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_vec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_vec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_vec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_vec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_vec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_vec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_vec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_vec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_vec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_double
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_double
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_double
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_double
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_dvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_dvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_dvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_dvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_dvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_dvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_dvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_dvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_dvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_dvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_dvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_dvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_bool
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bool
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bool
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bool
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_bvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bvec2
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_bvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bvec3
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffle_bvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshufflexor_bvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffleup_bvec4
+KHR-GL45.subgroups.shuffle.graphics.subgroupshuffledown_bvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_int
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_int
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_int
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_int
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_ivec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_ivec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_ivec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_ivec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_ivec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_ivec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_ivec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_ivec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_ivec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_ivec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_ivec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_ivec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_uint
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_uint
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_uint
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_uint
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_uvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_uvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_uvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_uvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_uvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_uvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_uvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_uvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_uvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_uvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_uvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_uvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_float
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_float
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_float
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_float
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_vec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_vec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_vec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_vec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_vec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_vec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_vec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_vec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_vec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_vec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_vec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_vec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_double
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_double
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_double
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_double
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_dvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_dvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_dvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_dvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_dvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_dvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_dvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_dvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_dvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_dvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_dvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_dvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_bool
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_bool
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_bool
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_bool
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_bvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_bvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_bvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_bvec2
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_bvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_bvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_bvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_bvec3
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffle_bvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshufflexor_bvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffleup_bvec4
+KHR-GL45.subgroups.shuffle.compute.subgroupshuffledown_bvec4
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_int_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_int_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_int_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_int_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uint_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_float_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_float_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_float_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_float_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_double_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_double_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_double_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_double_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bool_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_geometry
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_vertex
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_eval
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_control
+KHR-GL45.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_geometry
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_int
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_int
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_int
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_int
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_ivec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_ivec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_ivec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uint
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uint
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uint
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uint
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_uvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_float
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_float
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_float
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_float
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_vec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_vec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_vec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_vec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_vec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_vec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_vec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_vec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_vec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_vec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_vec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_vec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_double
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_double
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_double
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_double
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_dvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_dvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_dvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bool
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bool
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bool
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bool
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapvertical_bvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_int
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uint
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_float
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_vec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_vec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_vec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_double
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bool
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_int
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uint
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_float
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_vec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_vec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_vec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_double
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bool
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_int
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uint
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_float
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_vec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_vec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_vec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_double
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec4
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bool
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec2
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec3
+KHR-GL45.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_int
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_int
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_int
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_int
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_ivec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_ivec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_ivec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_ivec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_ivec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_ivec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_ivec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_ivec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_ivec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_ivec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_ivec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_ivec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uint
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uint
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_uint
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uint
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_uvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_uvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_uvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_uvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_uvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_uvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_float
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_float
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_float
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_float
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_vec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_vec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_vec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_vec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_vec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_vec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_vec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_vec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_vec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_vec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_vec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_vec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_double
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_double
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_double
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_double
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_dvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_dvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_dvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_dvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_dvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_dvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_dvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_dvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_dvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_dvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_dvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_dvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bool
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bool
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_bool
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bool
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_bvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_bvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_0_bvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswaphorizontal_bvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapvertical_bvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadswapdiagonal_bvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_int
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_ivec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_ivec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_ivec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uint
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_uvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_float
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_vec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_vec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_vec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_double
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_dvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_dvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_dvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bool
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_1_bvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_int
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_ivec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_ivec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_ivec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uint
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_uvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_float
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_vec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_vec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_vec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_double
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_dvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_dvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_dvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bool
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_2_bvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_int
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_ivec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_ivec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_ivec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uint
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_uvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_float
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_vec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_vec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_vec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_double
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_dvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_dvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_dvec4
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bool
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bvec2
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bvec3
+KHR-GL45.subgroups.quad.compute.subgroupquadbroadcast_3_bvec4
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_int_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_float_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_double_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_geometry
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_vertex
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_eval
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_control
+KHR-GL45.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_geometry
+KHR-GL45.subgroups.shape.graphics.clustered
+KHR-GL45.subgroups.shape.graphics.quad
+KHR-GL45.subgroups.shape.compute.clustered
+KHR-GL45.subgroups.shape.compute.quad
+KHR-GL45.subgroups.shape.framebuffer.clustered_vertex
+KHR-GL45.subgroups.shape.framebuffer.clustered_tess_eval
+KHR-GL45.subgroups.shape.framebuffer.clustered_tess_control
+KHR-GL45.subgroups.shape.framebuffer.clustered_geometry
+KHR-GL45.subgroups.shape.framebuffer.quad_vertex
+KHR-GL45.subgroups.shape.framebuffer.quad_tess_eval
+KHR-GL45.subgroups.shape.framebuffer.quad_tess_control
+KHR-GL45.subgroups.shape.framebuffer.quad_geometry
KHR-GL46.gl_spirv.spirv_glsl_to_spirv_specialization_constants_test
KHR-GL46.gl_spirv.spirv_validation_builtin_variable_decorations_test
KHR-GL46.gl_spirv.spirv_validation_capabilities_test
+KHR-GL46.subgroups.builtin_var.graphics.subgroupsize
+KHR-GL46.subgroups.builtin_var.graphics.subgroupinvocationid
+KHR-GL46.subgroups.builtin_var.compute.subgroupsize_compute
+KHR-GL46.subgroups.builtin_var.compute.subgroupinvocationid_compute
+KHR-GL46.subgroups.builtin_var.compute.numsubgroups
+KHR-GL46.subgroups.builtin_var.compute.subgroupid
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupsize_vertex
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupsize_tess_eval
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupsize_tess_control
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupsize_geometry
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_vertex
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_eval
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_tess_control
+KHR-GL46.subgroups.builtin_var.framebuffer.subgroupinvocationid_geometry
+KHR-GL46.subgroups.builtin_mask_var.graphics.subgroupeqmask
+KHR-GL46.subgroups.builtin_mask_var.graphics.subgroupgemask
+KHR-GL46.subgroups.builtin_mask_var.graphics.subgroupgtmask
+KHR-GL46.subgroups.builtin_mask_var.graphics.subgrouplemask
+KHR-GL46.subgroups.builtin_mask_var.graphics.subgroupltmask
+KHR-GL46.subgroups.builtin_mask_var.compute.subgroupeqmask
+KHR-GL46.subgroups.builtin_mask_var.compute.subgroupgemask
+KHR-GL46.subgroups.builtin_mask_var.compute.subgroupgtmask
+KHR-GL46.subgroups.builtin_mask_var.compute.subgrouplemask
+KHR-GL46.subgroups.builtin_mask_var.compute.subgroupltmask
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_vertex
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_eval
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_tess_control
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupeqmask_geometry
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_vertex
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_eval
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_tess_control
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgemask_geometry
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_vertex
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_eval
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_tess_control
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupgtmask_geometry
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_vertex
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_eval
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_tess_control
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgrouplemask_geometry
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_vertex
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_eval
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_tess_control
+KHR-GL46.subgroups.builtin_mask_var.framebuffer.subgroupltmask_geometry
+KHR-GL46.subgroups.basic.graphics.subgroupelect
+KHR-GL46.subgroups.basic.graphics.subgroupbarrier
+KHR-GL46.subgroups.basic.graphics.subgroupmemorybarrier
+KHR-GL46.subgroups.basic.graphics.subgroupmemorybarrierbuffer
+KHR-GL46.subgroups.basic.graphics.subgroupmemorybarrierimage
+KHR-GL46.subgroups.basic.compute.subgroupelect
+KHR-GL46.subgroups.basic.compute.subgroupbarrier
+KHR-GL46.subgroups.basic.compute.subgroupmemorybarrier
+KHR-GL46.subgroups.basic.compute.subgroupmemorybarrierbuffer
+KHR-GL46.subgroups.basic.compute.subgroupmemorybarriershared
+KHR-GL46.subgroups.basic.compute.subgroupmemorybarrierimage
+KHR-GL46.subgroups.basic.framebuffer.subgroupelect_vertex
+KHR-GL46.subgroups.basic.framebuffer.subgroupelect_tess_eval
+KHR-GL46.subgroups.basic.framebuffer.subgroupelect_tess_control
+KHR-GL46.subgroups.basic.framebuffer.subgroupelect_geometry
+KHR-GL46.subgroups.basic.framebuffer.subgroupbarrier_fragment
+KHR-GL46.subgroups.basic.framebuffer.subgroupbarrier_vertex
+KHR-GL46.subgroups.basic.framebuffer.subgroupbarrier_tess_eval
+KHR-GL46.subgroups.basic.framebuffer.subgroupbarrier_tess_control
+KHR-GL46.subgroups.basic.framebuffer.subgroupbarrier_geometry
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_fragment
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_vertex
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_eval
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_tess_control
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrier_geometry
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_fragment
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_vertex
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_eval
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_tess_control
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierbuffer_geometry
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_fragment
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_vertex
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_eval
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_tess_control
+KHR-GL46.subgroups.basic.framebuffer.subgroupmemorybarrierimage_geometry
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_int
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_ivec2
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_ivec3
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_ivec4
+KHR-GL46.subgroups.vote.graphics.subgroupall_uint
+KHR-GL46.subgroups.vote.graphics.subgroupany_uint
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_uint
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_uvec2
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_uvec3
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_uvec4
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_float
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_vec2
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_vec3
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_vec4
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_double
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_dvec2
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_dvec3
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_dvec4
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_bool
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_bvec2
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_bvec3
+KHR-GL46.subgroups.vote.graphics.subgroupallequal_bvec4
+KHR-GL46.subgroups.vote.compute.subgroupallequal_int
+KHR-GL46.subgroups.vote.compute.subgroupallequal_ivec2
+KHR-GL46.subgroups.vote.compute.subgroupallequal_ivec3
+KHR-GL46.subgroups.vote.compute.subgroupallequal_ivec4
+KHR-GL46.subgroups.vote.compute.subgroupall_uint
+KHR-GL46.subgroups.vote.compute.subgroupany_uint
+KHR-GL46.subgroups.vote.compute.subgroupallequal_uint
+KHR-GL46.subgroups.vote.compute.subgroupallequal_uvec2
+KHR-GL46.subgroups.vote.compute.subgroupallequal_uvec3
+KHR-GL46.subgroups.vote.compute.subgroupallequal_uvec4
+KHR-GL46.subgroups.vote.compute.subgroupallequal_float
+KHR-GL46.subgroups.vote.compute.subgroupallequal_vec2
+KHR-GL46.subgroups.vote.compute.subgroupallequal_vec3
+KHR-GL46.subgroups.vote.compute.subgroupallequal_vec4
+KHR-GL46.subgroups.vote.compute.subgroupallequal_double
+KHR-GL46.subgroups.vote.compute.subgroupallequal_dvec2
+KHR-GL46.subgroups.vote.compute.subgroupallequal_dvec3
+KHR-GL46.subgroups.vote.compute.subgroupallequal_dvec4
+KHR-GL46.subgroups.vote.compute.subgroupallequal_bool
+KHR-GL46.subgroups.vote.compute.subgroupallequal_bvec2
+KHR-GL46.subgroups.vote.compute.subgroupallequal_bvec3
+KHR-GL46.subgroups.vote.compute.subgroupallequal_bvec4
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_int_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_int_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_int_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_int_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec2_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec3_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_ivec4_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupall_uint_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupall_uint_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupall_uint_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupall_uint_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupany_uint_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupany_uint_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupany_uint_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupany_uint_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uint_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec2_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec3_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_uvec4_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_float_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_float_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_float_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_float_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec2_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec3_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_vec4_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_double_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_double_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_double_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_double_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec2_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec3_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_dvec4_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bool_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec2_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec3_geometry
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_vertex
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_eval
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_tess_control
+KHR-GL46.subgroups.vote.framebuffer.subgroupallequal_bvec4_geometry
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_int_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_ivec2_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_ivec3_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_ivec4_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupall_uint_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupany_uint_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_uint_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_uvec2_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_uvec3_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_uvec4_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_float_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_vec2_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_vec3_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_vec4_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_double_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_dvec2_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_dvec3_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_dvec4_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_bool_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_bvec2_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_bvec3_fragment
+KHR-GL46.subgroups.vote.frag_helper.subgroupallequal_bvec4_fragment
+KHR-GL46.subgroups.ballot.graphics.graphic
+KHR-GL46.subgroups.ballot.compute.compute
+KHR-GL46.subgroups.ballot.framebuffer.tess_eval
+KHR-GL46.subgroups.ballot.framebuffer.tess_control
+KHR-GL46.subgroups.ballot.framebuffer.geometry
+KHR-GL46.subgroups.ballot.framebuffer.vertex
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_int
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_int
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_ivec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_ivec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uint
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uint
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_uvec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_uvec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_float
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_float
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_vec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_vec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_double
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_double
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_dvec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_dvec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bool
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bool
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec2
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec3
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcast_bvec4
+KHR-GL46.subgroups.ballot_broadcast.graphics.subgroupbroadcastfirst_bvec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_int
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_int
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_ivec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_ivec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uint
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uint
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_uvec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_float
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_float
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_vec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_vec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_double
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_double
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_dvec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_dvec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bool
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bool
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec2
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec3
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcast_bvec4
+KHR-GL46.subgroups.ballot_broadcast.compute.subgroupbroadcastfirst_bvec4
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_inttess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_intgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_inttess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_intgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_ivec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_ivec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uinttess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uintgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uinttess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uintgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_uvec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_uvec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floattess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_floatgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floattess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_floatgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_vec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_vec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublevertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doubletess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_doublegeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublevertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doubletess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_doublegeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_dvec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_dvec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_booltess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_boolgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolvertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_booltess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_boolgeometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec2geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec3geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcast_bvec4geometry
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4vertex
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_eval
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4tess_control
+KHR-GL46.subgroups.ballot_broadcast.framebuffer.subgroupbroadcastfirst_bvec4geometry
+KHR-GL46.subgroups.ballot_other.graphics.subgroupinverseballot
+KHR-GL46.subgroups.ballot_other.graphics.subgroupballotbitextract
+KHR-GL46.subgroups.ballot_other.graphics.subgroupballotbitcount
+KHR-GL46.subgroups.ballot_other.graphics.subgroupballotinclusivebitcount
+KHR-GL46.subgroups.ballot_other.graphics.subgroupballotexclusivebitcount
+KHR-GL46.subgroups.ballot_other.graphics.subgroupballotfindlsb
+KHR-GL46.subgroups.ballot_other.graphics.subgroupballotfindmsb
+KHR-GL46.subgroups.ballot_other.compute.subgroupinverseballot
+KHR-GL46.subgroups.ballot_other.compute.subgroupballotbitextract
+KHR-GL46.subgroups.ballot_other.compute.subgroupballotbitcount
+KHR-GL46.subgroups.ballot_other.compute.subgroupballotinclusivebitcount
+KHR-GL46.subgroups.ballot_other.compute.subgroupballotexclusivebitcount
+KHR-GL46.subgroups.ballot_other.compute.subgroupballotfindlsb
+KHR-GL46.subgroups.ballot_other.compute.subgroupballotfindmsb
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_vertex
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_eval
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_tess_control
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupinverseballot_geometry
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_vertex
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_eval
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_tess_control
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitextract_geometry
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_vertex
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_eval
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_tess_control
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotbitcount_geometry
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_vertex
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_eval
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_tess_control
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotinclusivebitcount_geometry
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_vertex
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_eval
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_tess_control
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotexclusivebitcount_geometry
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_vertex
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_eval
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_tess_control
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindlsb_geometry
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_vertex
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_eval
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_tess_control
+KHR-GL46.subgroups.ballot_other.framebuffer.subgroupballotfindmsb_geometry
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_int
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_ivec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uint
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_uvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_float
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_vec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_vec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_vec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_double
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupadd_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmul_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmin_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupmax_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveadd_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemul_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemin_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivemax_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveadd_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemul_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemin_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivemax_dvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bool
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec2
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec3
+KHR-GL46.subgroups.arithmetic.graphics.subgroupand_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupor_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupxor_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveand_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusiveor_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupinclusivexor_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveand_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusiveor_bvec4
+KHR-GL46.subgroups.arithmetic.graphics.subgroupexclusivexor_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_int
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_ivec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_ivec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_ivec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uint
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_uvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_float
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_vec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_vec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_vec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_double
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_dvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_dvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupadd_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmul_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmin_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupmax_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveadd_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemul_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemin_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivemax_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveadd_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemul_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemin_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivemax_dvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bool
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bvec2
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bvec3
+KHR-GL46.subgroups.arithmetic.compute.subgroupand_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupor_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupxor_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveand_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusiveor_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupinclusivexor_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveand_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusiveor_bvec4
+KHR-GL46.subgroups.arithmetic.compute.subgroupexclusivexor_bvec4
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_int_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_float_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_double_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupadd_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmul_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmin_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupmax_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupand_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupor_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupxor_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-GL46.subgroups.arithmetic.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_int
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_int
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_int
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_int
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_int
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_int
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_int
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_ivec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_ivec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_ivec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_ivec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_ivec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_ivec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_ivec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_ivec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_ivec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_ivec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_ivec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_ivec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_ivec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_ivec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_ivec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_ivec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_ivec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_ivec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_ivec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_ivec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_ivec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uint
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uint
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uint
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uint
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_uint
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_uint
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uint
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_uvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_uvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_uvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_uvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_uvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_uvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_uvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_uvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_uvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_uvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_uvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_float
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_float
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_float
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_float
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_vec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_vec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_vec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_vec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_vec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_vec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_vec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_vec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_vec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_vec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_vec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_vec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_double
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_double
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_double
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_double
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_dvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_dvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_dvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_dvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_dvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_dvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_dvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_dvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredadd_dvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmul_dvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmin_dvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredmax_dvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_bool
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_bool
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bool
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_bvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_bvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bvec2
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_bvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_bvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bvec3
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredand_bvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredor_bvec4
+KHR-GL46.subgroups.clustered.graphics.subgroupclusteredxor_bvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_int
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_int
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_int
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_int
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_int
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_int
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_int
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_ivec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_ivec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_ivec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_ivec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_ivec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_ivec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_ivec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_ivec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_ivec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_ivec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_ivec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_ivec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_ivec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_ivec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_ivec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_ivec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_ivec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_ivec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_ivec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_ivec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_ivec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_uint
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_uint
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_uint
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_uint
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_uint
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_uint
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_uint
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_uvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_uvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_uvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_uvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_uvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_uvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_uvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_uvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_uvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_uvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_uvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_uvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_uvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_uvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_uvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_uvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_uvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_uvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_uvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_uvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_uvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_float
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_float
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_float
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_float
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_vec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_vec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_vec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_vec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_vec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_vec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_vec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_vec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_vec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_vec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_vec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_vec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_double
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_double
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_double
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_double
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_dvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_dvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_dvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_dvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_dvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_dvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_dvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_dvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredadd_dvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmul_dvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmin_dvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredmax_dvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_bool
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_bool
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_bool
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_bvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_bvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_bvec2
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_bvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_bvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_bvec3
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredand_bvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredor_bvec4
+KHR-GL46.subgroups.clustered.compute.subgroupclusteredxor_bvec4
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_int_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_int_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_int_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_int_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_int_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_int_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_int_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_ivec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_ivec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_ivec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_ivec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_ivec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_ivec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_ivec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uint_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uint_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uint_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uint_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uint_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uint_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uint_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_uvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_uvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_uvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_uvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_uvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_uvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_uvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_float_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_float_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_float_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_float_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_vec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_vec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_vec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_vec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_double_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_double_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_double_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_double_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredadd_dvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmul_dvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmin_dvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredmax_dvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bool_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bool_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bool_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec2_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec3_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredand_bvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredor_bvec4_geometry
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_vertex
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_eval
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_tess_control
+KHR-GL46.subgroups.clustered.framebuffer.subgroupclusteredxor_bvec4_geometry
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_int
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_ivec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_ivec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_ivec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uint
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_uvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_float
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_vec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_vec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_vec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_double
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_dvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_dvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupadd_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmul_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmin_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupmax_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveadd_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemul_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemin_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivemax_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveadd_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemul_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemin_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivemax_dvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bool
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bvec2
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bvec3
+KHR-GL46.subgroups.partitioned.graphics.subgroupand_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupor_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupxor_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveand_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusiveor_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupinclusivexor_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveand_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusiveor_bvec4
+KHR-GL46.subgroups.partitioned.graphics.subgroupexclusivexor_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_int
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_int
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_int
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_int
+KHR-GL46.subgroups.partitioned.compute.subgroupand_int
+KHR-GL46.subgroups.partitioned.compute.subgroupor_int
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_int
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_int
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_int
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_int
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_int
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_int
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_int
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_int
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_int
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_int
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_int
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_int
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_int
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_int
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_int
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupand_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupor_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_ivec2
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupand_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupor_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_ivec3
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupand_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupor_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_ivec4
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupand_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupor_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uint
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupand_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupor_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupand_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupor_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupand_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupor_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_uvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_float
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_float
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_float
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_float
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_float
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_float
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_float
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_float
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_float
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_float
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_float
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_float
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_vec2
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_vec3
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_vec4
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_double
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_double
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_double
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_double
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_double
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_double
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_double
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_double
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_double
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_double
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_double
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_double
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_dvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_dvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupadd_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmul_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmin_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupmax_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveadd_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemul_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemin_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivemax_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveadd_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemul_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemin_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivemax_dvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupand_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupor_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bool
+KHR-GL46.subgroups.partitioned.compute.subgroupand_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupor_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bvec2
+KHR-GL46.subgroups.partitioned.compute.subgroupand_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupor_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bvec3
+KHR-GL46.subgroups.partitioned.compute.subgroupand_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupor_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupxor_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveand_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusiveor_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupinclusivexor_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveand_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusiveor_bvec4
+KHR-GL46.subgroups.partitioned.compute.subgroupexclusivexor_bvec4
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_int_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_ivec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uint_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_uvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_float_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_vec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_double_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupadd_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmul_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmin_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupmax_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveadd_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemul_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemin_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivemax_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveadd_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemul_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemin_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivemax_dvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bool_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec2_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec3_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupand_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupor_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupxor_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveand_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusiveor_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupinclusivexor_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveand_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusiveor_bvec4_geometry
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_vertex
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_eval
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_tess_control
+KHR-GL46.subgroups.partitioned.framebuffer.subgroupexclusivexor_bvec4_geometry
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_int
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_int
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_int
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_int
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_ivec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_ivec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_ivec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_ivec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_ivec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_ivec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_ivec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_ivec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_ivec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_ivec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_ivec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_ivec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_uint
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uint
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uint
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uint
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_uvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_uvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_uvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_uvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_uvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_uvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_float
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_float
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_float
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_float
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_vec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_vec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_vec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_vec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_vec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_vec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_vec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_vec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_vec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_vec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_vec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_vec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_double
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_double
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_double
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_double
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_dvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_dvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_dvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_dvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_dvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_dvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_dvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_dvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_dvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_dvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_dvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_dvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_bool
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bool
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bool
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bool
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_bvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bvec2
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_bvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bvec3
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffle_bvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshufflexor_bvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffleup_bvec4
+KHR-GL46.subgroups.shuffle.graphics.subgroupshuffledown_bvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_int
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_int
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_int
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_int
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_ivec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_ivec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_ivec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_ivec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_ivec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_ivec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_ivec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_ivec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_ivec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_ivec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_ivec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_ivec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_uint
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_uint
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_uint
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_uint
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_uvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_uvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_uvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_uvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_uvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_uvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_uvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_uvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_uvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_uvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_uvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_uvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_float
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_float
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_float
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_float
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_vec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_vec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_vec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_vec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_vec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_vec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_vec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_vec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_vec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_vec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_vec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_vec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_double
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_double
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_double
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_double
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_dvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_dvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_dvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_dvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_dvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_dvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_dvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_dvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_dvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_dvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_dvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_dvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_bool
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_bool
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_bool
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_bool
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_bvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_bvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_bvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_bvec2
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_bvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_bvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_bvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_bvec3
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffle_bvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshufflexor_bvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffleup_bvec4
+KHR-GL46.subgroups.shuffle.compute.subgroupshuffledown_bvec4
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_int_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_int_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_int_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_int_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_ivec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_ivec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_ivec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_ivec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uint_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uint_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uint_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uint_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_uvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_uvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_uvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_uvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_float_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_float_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_float_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_float_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_vec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_vec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_vec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_vec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_double_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_double_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_double_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_double_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_dvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_dvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_dvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_dvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bool_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bool_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bool_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bool_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec2_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec3_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffle_bvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshufflexor_bvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffleup_bvec4_geometry
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_vertex
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_eval
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_tess_control
+KHR-GL46.subgroups.shuffle.framebuffer.subgroupshuffledown_bvec4_geometry
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_int
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_int
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_int
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_int
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_ivec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_ivec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_ivec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_ivec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_ivec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_ivec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uint
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uint
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uint
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uint
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_uvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_uvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_uvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_uvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_float
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_float
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_float
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_float
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_vec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_vec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_vec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_vec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_vec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_vec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_vec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_vec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_vec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_vec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_vec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_vec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_double
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_double
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_double
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_double
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_dvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_dvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_dvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_dvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_dvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_dvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bool
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bool
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bool
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bool
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_0_bvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswaphorizontal_bvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapvertical_bvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadswapdiagonal_bvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_int
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_ivec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uint
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_uvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_float
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_vec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_vec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_vec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_double
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_dvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bool
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_1_bvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_int
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_ivec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uint
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_uvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_float
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_vec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_vec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_vec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_double
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_dvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bool
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_2_bvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_int
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_ivec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uint
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_uvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_float
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_vec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_vec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_vec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_double
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_dvec4
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bool
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec2
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec3
+KHR-GL46.subgroups.quad.graphics.subgroupquadbroadcast_3_bvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_int
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_int
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_int
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_int
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_ivec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_ivec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_ivec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_ivec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_ivec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_ivec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_ivec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_ivec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_ivec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_ivec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_ivec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_ivec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uint
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uint
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_uint
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uint
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_uvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_uvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_uvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_uvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_uvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_uvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_float
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_float
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_float
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_float
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_vec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_vec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_vec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_vec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_vec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_vec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_vec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_vec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_vec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_vec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_vec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_vec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_double
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_double
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_double
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_double
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_dvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_dvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_dvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_dvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_dvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_dvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_dvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_dvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_dvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_dvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_dvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_dvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bool
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bool
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_bool
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bool
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_bvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_bvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_0_bvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswaphorizontal_bvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapvertical_bvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadswapdiagonal_bvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_int
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_ivec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_ivec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_ivec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uint
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_uvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_float
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_vec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_vec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_vec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_double
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_dvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_dvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_dvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bool
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_1_bvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_int
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_ivec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_ivec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_ivec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uint
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_uvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_float
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_vec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_vec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_vec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_double
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_dvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_dvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_dvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bool
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_2_bvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_int
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_ivec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_ivec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_ivec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uint
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_uvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_float
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_vec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_vec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_vec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_double
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_dvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_dvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_dvec4
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bool
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bvec2
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bvec3
+KHR-GL46.subgroups.quad.compute.subgroupquadbroadcast_3_bvec4
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_int_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_int_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_int_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_int_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_ivec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_ivec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_ivec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_ivec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uint_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uint_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uint_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uint_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_uvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_uvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_uvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_uvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_float_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_float_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_float_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_float_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_vec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_vec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_vec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_vec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_double_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_double_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_double_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_double_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_dvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_dvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_dvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_dvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bool_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bool_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bool_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bool_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_0_bvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswaphorizontal_bvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapvertical_bvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadswapdiagonal_bvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_int_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_ivec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uint_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_uvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_float_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_vec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_double_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_dvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bool_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_1_bvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_int_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_ivec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uint_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_uvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_float_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_vec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_double_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_dvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bool_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_2_bvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_int_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_ivec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uint_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_uvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_float_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_vec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_double_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_dvec4_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bool_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec2_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec3_geometry
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_vertex
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_eval
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_tess_control
+KHR-GL46.subgroups.quad.framebuffer.subgroupquadbroadcast_3_bvec4_geometry
+KHR-GL46.subgroups.shape.graphics.clustered
+KHR-GL46.subgroups.shape.graphics.quad
+KHR-GL46.subgroups.shape.compute.clustered
+KHR-GL46.subgroups.shape.compute.quad
+KHR-GL46.subgroups.shape.framebuffer.clustered_vertex
+KHR-GL46.subgroups.shape.framebuffer.clustered_tess_eval
+KHR-GL46.subgroups.shape.framebuffer.clustered_tess_control
+KHR-GL46.subgroups.shape.framebuffer.clustered_geometry
+KHR-GL46.subgroups.shape.framebuffer.quad_vertex
+KHR-GL46.subgroups.shape.framebuffer.quad_tess_eval
+KHR-GL46.subgroups.shape.framebuffer.quad_tess_control
+KHR-GL46.subgroups.shape.framebuffer.quad_geometry
bool is_arb_gl_spirv = m_context.getContextInfo().isExtensionSupported("GL_ARB_gl_spirv");
if ((!is_at_least_gl_46) && (!is_arb_gl_spirv))
- TCU_THROW(NotSupportedError, "GL_ARB_gl_spirv is not supported");
+ TCU_THROW(NotSupportedError, "GL 4.6 or GL_ARB_gl_spirv is not supported");
}
#if defined DEQP_HAVE_GLSLANG
builtin->maxMeshViewCountNV = 4;
};
-bool compileGlslToSpirV(tcu::TestLog& log, std::string source, glu::ShaderType type, ShaderBinaryDataType* dst)
+glslang::EShTargetLanguageVersion getSpirvTargetVersion(SpirvVersion version)
+{
+ switch(version)
+ {
+ default:
+ DE_FATAL("unhandled SPIRV target version");
+ // fall-through
+ case SPIRV_VERSION_1_0:
+ return glslang::EShTargetSpv_1_0;
+ case SPIRV_VERSION_1_1:
+ return glslang::EShTargetSpv_1_1;
+ case SPIRV_VERSION_1_2:
+ return glslang::EShTargetSpv_1_2;
+ case SPIRV_VERSION_1_3:
+ return glslang::EShTargetSpv_1_3;
+ }
+}
+
+bool compileGlslToSpirV(tcu::TestLog& log, std::string source, glu::ShaderType type, ShaderBinaryDataType* dst, SpirvVersion version)
{
TBuiltInResource builtinRes;
const char* src[] = { source.c_str() };
shader.setStrings(src, 1);
+ shader.setEnvTarget(glslang::EshTargetSpv, getSpirvTargetVersion(version));
program.addShader(&shader);
const int compileRes = shader.parse(&builtinRes, 100, false, EShMsgSpvRules);
#endif // DEQP_HAVE_SPIRV_TOOLS
-ShaderBinary makeSpirV(tcu::TestLog& log, ShaderSource source)
+ShaderBinary makeSpirV(tcu::TestLog& log, ShaderSource source, SpirvVersion version)
{
ShaderBinary binary;
- if (!spirvUtils::compileGlslToSpirV(log, source.source, source.shaderType, &binary.binary))
+ if (!spirvUtils::compileGlslToSpirV(log, source.source, source.shaderType, &binary.binary, version))
TCU_THROW(InternalError, "Failed to convert GLSL to Spir-V");
binary << source.shaderType << "main";
namespace spirvUtils
{
+enum SpirvVersion
+{
+ SPIRV_VERSION_1_0 = 0, //!< SPIR-V 1.0
+ SPIRV_VERSION_1_1 = 1, //!< SPIR-V 1.1
+ SPIRV_VERSION_1_2 = 2, //!< SPIR-V 1.2
+ SPIRV_VERSION_1_3 = 3, //!< SPIR-V 1.3
+
+ SPIRV_VERSION_LAST
+};
+
void checkGlSpirvSupported(deqp::Context& m_context);
-glu::ShaderBinary makeSpirV(tcu::TestLog& log, glu::ShaderSource source);
+glu::ShaderBinary makeSpirV(tcu::TestLog& log, glu::ShaderSource source, SpirvVersion version = SPIRV_VERSION_1_0);
void spirvAssemble(glu::ShaderBinaryDataType& dst, const std::string& src);
void spirvDisassemble(std::string& dst, const glu::ShaderBinaryDataType& src);
include_directories(..)
set(DEQP_GL_SUBGROUPS_SRCS
-# glcSubgroupsTests.cpp
+ glcSubgroupsTests.cpp
glcSubgroupsTests.hpp
-# glcSubgroupsBuiltinVarTests.cpp
-# glcSubgroupsBuiltinVarTests.hpp
-# glcSubgroupsBuiltinMaskVarTests.cpp
-# glcSubgroupsBuiltinMaskVarTests.hpp
-# glcSubgroupsBasicTests.cpp
-# glcSubgroupsBasicTests.hpp
-# glcSubgroupsVoteTests.cpp
-# glcSubgroupsVoteTests.hpp
-# glcSubgroupsBallotTests.cpp
-# glcSubgroupsBallotTests.hpp
-# glcSubgroupsBallotBroadcastTests.cpp
-# glcSubgroupsBallotBroadcastTests.hpp
-# glcSubgroupsBallotOtherTests.cpp
-# glcSubgroupsBallotOtherTests.hpp
-# glcSubgroupsArithmeticTests.cpp
-# glcSubgroupsArithmeticTests.hpp
-# glcSubgroupsClusteredTests.cpp
-# glcSubgroupsClusteredTests.hpp
-# glcSubgroupsPartitionedTests.cpp
-# glcSubgroupsPartitionedTests.hpp
-# glcSubgroupsShuffleTests.cpp
-# glcSubgroupsShuffleTests.hpp
-# glcSubgroupsQuadTests.cpp
-# glcSubgroupsQuadTests.hpp
-# glcSubgroupsShapeTests.cpp
-# glcSubgroupsShapeTests.hpp
-# glcSubgroupsTestsUtils.cpp
-# glcSubgroupsTestsUtils.hpp
+ glcSubgroupsBuiltinVarTests.cpp
+ glcSubgroupsBuiltinVarTests.hpp
+ glcSubgroupsBuiltinMaskVarTests.cpp
+ glcSubgroupsBuiltinMaskVarTests.hpp
+ glcSubgroupsBasicTests.cpp
+ glcSubgroupsBasicTests.hpp
+ glcSubgroupsVoteTests.cpp
+ glcSubgroupsVoteTests.hpp
+ glcSubgroupsBallotTests.cpp
+ glcSubgroupsBallotTests.hpp
+ glcSubgroupsBallotBroadcastTests.cpp
+ glcSubgroupsBallotBroadcastTests.hpp
+ glcSubgroupsBallotOtherTests.cpp
+ glcSubgroupsBallotOtherTests.hpp
+ glcSubgroupsArithmeticTests.cpp
+ glcSubgroupsArithmeticTests.hpp
+ glcSubgroupsClusteredTests.cpp
+ glcSubgroupsClusteredTests.hpp
+ glcSubgroupsPartitionedTests.cpp
+ glcSubgroupsPartitionedTests.hpp
+ glcSubgroupsShuffleTests.cpp
+ glcSubgroupsShuffleTests.hpp
+ glcSubgroupsQuadTests.cpp
+ glcSubgroupsQuadTests.hpp
+ glcSubgroupsShapeTests.cpp
+ glcSubgroupsShapeTests.hpp
+ glcSubgroupsTestsUtils.cpp
+ glcSubgroupsTestsUtils.hpp
)
set(DEQP_GL_SUBGROUPS_LIBS
glutil
tcutil
- vkutil
)
PCH(DEQP_GL_SUBGROUPS_SRCS ../../pch.cpp)
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsArithmeticTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsArithmeticTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
enum OpType
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 0x3);
+ return glc::subgroups::check(datas, width, 0x3);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x3);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x3);
}
std::string getOpTypeName(int opType)
}
}
-std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+std::string getOpTypeOperation(int opType, Format format, std::string lhs, std::string rhs)
{
switch (opType)
{
{
default:
return "min(" + lhs + ", " + rhs + ")";
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R32_SFLOAT:
+ case 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:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
return "mix(mix(min(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
}
case OPTYPE_MAX:
{
default:
return "max(" + lhs + ", " + rhs + ")";
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R32_SFLOAT:
+ case 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:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
return "mix(mix(max(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
}
case OPTYPE_AND:
{
default:
return lhs + " & " + rhs;
- case VK_FORMAT_R8_USCALED:
+ case FORMAT_R32_BOOL:
return lhs + " && " + rhs;
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return "bvec2(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y)";
- case VK_FORMAT_R8G8B8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
return "bvec3(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z)";
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32A32_BOOL:
return "bvec4(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z, " + lhs + ".w && " + rhs + ".w)";
}
case OPTYPE_OR:
{
default:
return lhs + " | " + rhs;
- case VK_FORMAT_R8_USCALED:
+ case FORMAT_R32_BOOL:
return lhs + " || " + rhs;
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return "bvec2(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y)";
- case VK_FORMAT_R8G8B8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
return "bvec3(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z)";
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32A32_BOOL:
return "bvec4(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z, " + lhs + ".w || " + rhs + ".w)";
}
case OPTYPE_XOR:
{
default:
return lhs + " ^ " + rhs;
- case VK_FORMAT_R8_USCALED:
+ case FORMAT_R32_BOOL:
return lhs + " ^^ " + rhs;
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return "bvec2(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y)";
- case VK_FORMAT_R8G8B8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
return "bvec3(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z)";
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32A32_BOOL:
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)
+std::string getIdentity(int opType, Format format)
{
bool isFloat = false;
bool isInt = false;
default:
DE_FATAL("Unhandled format!");
break;
- case VK_FORMAT_R32_SINT:
- case VK_FORMAT_R32G32_SINT:
- case VK_FORMAT_R32G32B32_SINT:
- case VK_FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case 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:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case 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:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
break; // bool types are not anything
}
}
}
-std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+std::string getCompare(int opType, Format 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32_SINT:
return "(" + lhs + " == " + rhs + ")";
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
switch (opType)
{
default:
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:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
switch (opType)
{
default:
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
- VkFormat format;
+ ShaderStageFlags shaderStage;
+ Format format;
};
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
std::string indexVars;
std::ostringstream bdy;
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
switch (caseDef.opType)
<< " tempResult |= 0x2;\n"
<< " }\n";
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertexSrc.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
" tempResult |= 0x2;\n"
" }\n";
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
<< "};\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
"#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"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy+
- " result[gl_VertexIndex] = tempResult;\n"
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
"#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 = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveID] = tempResult;\n"
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveIDIn] = tempResult;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
"#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 = 4, std430) readonly buffer Buffer2\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
+ bdy +
" result = tempResult;\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
}
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_ARITHMETIC_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_ARITHMETIC_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup arithmetic operations");
}
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
-
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if(!checkShaderStages(context,caseDef))
{
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData;
inputData.binding = 4u;
inputData.stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, &inputData,
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData,
1, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsArithmeticTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup arithmetic category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup arithmetic category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer"));
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
+ const Format 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,
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
};
for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
{
- const VkFormat format = formats[formatIndex];
+ const Format format = formats[formatIndex];
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
{
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:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
isBool = true;
break;
}
std::string op = getOpTypeName(opTypeIndex);
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format};
- addFunctionCaseWithPrograms(computeGroup.get(),
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
de::toLower(op) + "_" +
subgroups::getFormatNameForGLSL(format),
"", supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format};
- addFunctionCaseWithPrograms(graphicGroup.get(),
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
de::toLower(op) + "_" +
subgroups::getFormatNameForGLSL(format),
"", supportedCheck, initPrograms, test, caseDef);
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
- addFunctionCaseWithPrograms(framebufferGroup.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) +
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) +
"_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "arithmetic", "Subgroup arithmetic category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSARITHMETICTESTS_HPP
-#define _VKTSUBGROUPSARITHMETICTESTS_HPP
+#ifndef _GLCSUBGROUPSARITHMETICTESTS_HPP
+#define _GLCSUBGROUPSARITHMETICTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsArithmeticTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSARITHMETICTESTS_HPP
+#endif // _GLCSUBGROUPSARITHMETICTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsBallotBroadcastTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsBallotBroadcastTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
enum OpType
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 3);
+ return glc::subgroups::check(datas, width, 3);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStages(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 3);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 3);
}
std::string getOpTypeName(int opType)
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
- VkFormat format;
+ ShaderStageFlags shaderStage;
+ Format format;
};
std::string getBodySource(CaseDefinition caseDef)
void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
-
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
std::string bdyStr = getBodySource(caseDef);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertex;
vertex << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
- << "layout(set = 0, binding = 0) uniform Buffer2\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" <<subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
{
std::string bdyStr = getBodySource(caseDef);
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
<< "};\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
const string vertex =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
- "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b0;\n"
+ "layout(set = 0, binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_VertexIndex] = tempResult;\n"
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_PrimitiveID] = tempResult;\n"
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b3;\n"
+ "layout(set = 0, binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_PrimitiveIDIn] = tempResult;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(location = 0) out uint result;\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer1\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
subgroups::addNoSubgroupShader(programCollection);
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
}
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
}
inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
inputData[0].format = caseDef.format;
inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 1u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, inputData, 1, checkComputeStages);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData;
inputData.binding = 4u;
inputData.stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsBallotBroadcastTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup ballot broadcast category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup ballot broadcast category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup ballot broadcast category tests: framebuffer"));
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
+ const Format 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,
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
};
for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
{
- const VkFormat format = formats[formatIndex];
+ const Format format = formats[formatIndex];
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
const std::string name = op + "_" + subgroups::getFormatNameForGLSL(format);
{
- CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format};
- addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format};
- addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
- addFunctionCaseWithPrograms(framebufferGroup.get(), name + getShaderStageName(caseDef.shaderStage), "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "ballot_broadcast", "Subgroup ballot broadcast category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSBALLOTBROADCASTTESTS_HPP
-#define _VKTSUBGROUPSBALLOTBROADCASTTESTS_HPP
+#ifndef _GLCSUBGROUPSBALLOTBROADCASTTESTS_HPP
+#define _GLCSUBGROUPSBALLOTBROADCASTTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsBallotBroadcastTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSBALLOTBROADCASTTESTS_HPP
+#endif // _GLCSUBGROUPSBALLOTBROADCASTTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsBallotOtherTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsBallotOtherTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
enum OpType
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 0xf);
+ return glc::subgroups::check(datas, width, 0xf);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 0xf);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0xf);
}
std::string getOpTypeName(int opType)
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
+ ShaderStageFlags shaderStage;
};
std::string getBodySource(CaseDefinition caseDef)
void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
-
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
std::string bdyStr = getBodySource(caseDef);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertex;
vertex << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
{
std::string bdyStr = getBodySource(caseDef);
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
const string vertex =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
- "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b0;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_VertexIndex] = tempResult;\n"
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b1;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_PrimitiveID] = tempResult;\n"
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b2;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b3;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdyStr +
- " result[gl_PrimitiveIDIn] = tempResult;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
subgroups::addNoSubgroupShader(programCollection);
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
}
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
}
}
}
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
- else if ((VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) & caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if ((SHADER_STAGE_TESS_CONTROL_BIT | SHADER_STAGE_TESS_EVALUATION_BIT) & caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test (Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
subgroups::getShaderStageName(caseDef.shaderStage) +
" is required to support subgroup operations!");
}
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
-
- if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
}
return tcu::TestStatus::pass("OK");
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsBallotOtherTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsBallotOtherTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup ballot other category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup ballot other category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup ballot other category tests: framebuffer"));
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
const string op = de::toLower(getOpTypeName(opTypeIndex));
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT};
- addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS};
- addFunctionCaseWithPrograms(graphicGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex]};
- addFunctionCaseWithPrograms(framebufferGroup.get(), op + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), op + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "ballot_other", "Subgroup ballot other category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSBALLOTOTHERTESTS_HPP
-#define _VKTSUBGROUPSBALLOTOTHERTESTS_HPP
+#ifndef _GLCSUBGROUPSBALLOTOTHERTESTS_HPP
+#define _GLCSUBGROUPSBALLOTOTHERTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsBallotOtherTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsBallotOtherTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSBALLOTOTHERTESTS_HPP
+#endif // _GLCSUBGROUPSBALLOTOTHERTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsBallotTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsBallotTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 0x7);
+ return glc::subgroups::check(datas, width, 0x7);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x7);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x7);
}
struct CaseDefinition
{
- VkShaderStageFlags shaderStage;
+ glc::subgroups::ShaderStageFlags shaderStage;
};
void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::SpirVAsmBuildOptions buildOptionsSpr (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3);
std::ostringstream subgroupSizeStr;
subgroupSizeStr << subgroups::maxSupportedSubgroupSize();
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
- /*
+ const string vertexGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(location = 0) in highp vec4 in_position;\n"
"layout(location = 0) out float out_color;\n"
- "layout(set = 0, binding = 0) uniform Buffer1\n"
+ "layout(binding = 0) uniform Buffer1\n"
"{\n"
- " uint data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
"};\n"
"\n"
"void main (void)\n"
" gl_Position = in_position;\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- */
- const string vertex =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 76\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %35 %62 %70 %72\n"
- "OpDecorate %30 ArrayStride 16\n"
- "OpMemberDecorate %31 0 Offset 0\n"
- "OpDecorate %31 Block\n"
- "OpDecorate %33 DescriptorSet 0\n"
- "OpDecorate %33 Binding 0\n"
- "OpDecorate %35 RelaxedPrecision\n"
- "OpDecorate %35 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpDecorate %62 Location 0\n"
- "OpMemberDecorate %68 0 BuiltIn Position\n"
- "OpMemberDecorate %68 1 BuiltIn PointSize\n"
- "OpMemberDecorate %68 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %68 3 BuiltIn CullDistance\n"
- "OpDecorate %68 Block\n"
- "OpDecorate %72 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 0\n"
- "%10 = OpTypeVector %6 4\n"
- "%11 = OpConstantComposite %10 %9 %9 %9 %9\n"
- "%12 = OpTypeBool\n"
- "%13 = OpConstantTrue %12\n"
- "%14 = OpConstant %6 3\n"
- "%16 = OpTypeVector %12 4\n"
- "%20 = OpTypeInt 32 1\n"
- "%21 = OpConstant %20 1\n"
- "%22 = OpConstant %20 0\n"
- "%27 = OpTypePointer Function %12\n"
- "%29 = OpConstant %6 " + subgroupSizeStr.str() + "\n"
- "%30 = OpTypeArray %6 %29\n"
- "%31 = OpTypeStruct %30\n"
- "%32 = OpTypePointer Uniform %31\n"
- "%33 = OpVariable %32 Uniform\n"
- "%34 = OpTypePointer Input %6\n"
- "%35 = OpVariable %34 Input\n"
- "%37 = OpTypePointer Uniform %6\n"
- "%46 = OpConstant %20 2\n"
- "%51 = OpConstantFalse %12\n"
- "%55 = OpConstant %20 4\n"
- "%60 = OpTypeFloat 32\n"
- "%61 = OpTypePointer Output %60\n"
- "%62 = OpVariable %61 Output\n"
- "%65 = OpTypeVector %60 4\n"
- "%66 = OpConstant %6 1\n"
- "%67 = OpTypeArray %60 %66\n"
- "%68 = OpTypeStruct %65 %60 %67 %67\n"
- "%69 = OpTypePointer Output %68\n"
- "%70 = OpVariable %69 Output\n"
- "%71 = OpTypePointer Input %65\n"
- "%72 = OpVariable %71 Input\n"
- "%74 = OpTypePointer Output %65\n"
- "%76 = OpConstant %60 1\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%28 = OpVariable %27 Function\n"
- "OpStore %8 %9\n"
- "%15 = OpGroupNonUniformBallot %10 %14 %13\n"
- "%17 = OpIEqual %16 %11 %15\n"
- "%18 = OpAll %12 %17\n"
- "%19 = OpLogicalNot %12 %18\n"
- "%23 = OpSelect %20 %19 %21 %22\n"
- "%24 = OpBitcast %6 %23\n"
- "%25 = OpLoad %6 %8\n"
- "%26 = OpBitwiseOr %6 %25 %24\n"
- "OpStore %8 %26\n"
- "%36 = OpLoad %6 %35\n"
- "%38 = OpAccessChain %37 %33 %22 %36\n"
- "%39 = OpLoad %6 %38\n"
- "%40 = OpINotEqual %12 %39 %9\n"
- "OpStore %28 %40\n"
- "%41 = OpLoad %12 %28\n"
- "%42 = OpGroupNonUniformBallot %10 %14 %41\n"
- "%43 = OpIEqual %16 %11 %42\n"
- "%44 = OpAll %12 %43\n"
- "%45 = OpLogicalNot %12 %44\n"
- "%47 = OpSelect %20 %45 %46 %22\n"
- "%48 = OpBitcast %6 %47\n"
- "%49 = OpLoad %6 %8\n"
- "%50 = OpBitwiseOr %6 %49 %48\n"
- "OpStore %8 %50\n"
- "%52 = OpGroupNonUniformBallot %10 %14 %51\n"
- "%53 = OpIEqual %16 %11 %52\n"
- "%54 = OpAll %12 %53\n"
- "%56 = OpSelect %20 %54 %55 %22\n"
- "%57 = OpBitcast %6 %56\n"
- "%58 = OpLoad %6 %8\n"
- "%59 = OpBitwiseOr %6 %58 %57\n"
- "OpStore %8 %59\n"
- "%63 = OpLoad %6 %8\n"
- "%64 = OpConvertUToF %60 %63\n"
- "OpStore %62 %64\n"
- "%73 = OpLoad %65 %72\n"
- "%75 = OpAccessChain %74 %70 %22\n"
- "OpStore %75 %73\n"
- "%77 = OpAccessChain %61 %70 %21\n"
- "OpStore %77 %76\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("vert") << vertex << buildOptionsSpr;
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
- /*
+ const string geometryGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(points) in;\n"
"layout(points, max_vertices = 1) out;\n"
"layout(location = 0) out float out_color;\n"
- "layout(set = 0, binding = 0) uniform Buffer1\n"
+ "layout(binding = 0) uniform Buffer1\n"
"{\n"
- " uint data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
"};\n"
"\n"
"void main (void)\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- */
- const string geometry =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 80\n"
- "; Schema: 0\n"
- "OpCapability Geometry\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Geometry %4 \"main\" %35 %62 %70 %74\n"
- "OpExecutionMode %4 InputPoints\n"
- "OpExecutionMode %4 Invocations 1\n"
- "OpExecutionMode %4 OutputPoints\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- "OpDecorate %30 ArrayStride 16\n"
- "OpMemberDecorate %31 0 Offset 0\n"
- "OpDecorate %31 Block\n"
- "OpDecorate %33 DescriptorSet 0\n"
- "OpDecorate %33 Binding 0\n"
- "OpDecorate %35 RelaxedPrecision\n"
- "OpDecorate %35 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpDecorate %62 Location 0\n"
- "OpMemberDecorate %68 0 BuiltIn Position\n"
- "OpMemberDecorate %68 1 BuiltIn PointSize\n"
- "OpMemberDecorate %68 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %68 3 BuiltIn CullDistance\n"
- "OpDecorate %68 Block\n"
- "OpMemberDecorate %71 0 BuiltIn Position\n"
- "OpMemberDecorate %71 1 BuiltIn PointSize\n"
- "OpMemberDecorate %71 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %71 3 BuiltIn CullDistance\n"
- "OpDecorate %71 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 0\n"
- "%10 = OpTypeVector %6 4\n"
- "%11 = OpConstantComposite %10 %9 %9 %9 %9\n"
- "%12 = OpTypeBool\n"
- "%13 = OpConstantTrue %12\n"
- "%14 = OpConstant %6 3\n"
- "%16 = OpTypeVector %12 4\n"
- "%20 = OpTypeInt 32 1\n"
- "%21 = OpConstant %20 1\n"
- "%22 = OpConstant %20 0\n"
- "%27 = OpTypePointer Function %12\n"
- "%29 = OpConstant %6 " + subgroupSizeStr.str() + "\n"
- "%30 = OpTypeArray %6 %29\n"
- "%31 = OpTypeStruct %30\n"
- "%32 = OpTypePointer Uniform %31\n"
- "%33 = OpVariable %32 Uniform\n"
- "%34 = OpTypePointer Input %6\n"
- "%35 = OpVariable %34 Input\n"
- "%37 = OpTypePointer Uniform %6\n"
- "%46 = OpConstant %20 2\n"
- "%51 = OpConstantFalse %12\n"
- "%55 = OpConstant %20 4\n"
- "%60 = OpTypeFloat 32\n"
- "%61 = OpTypePointer Output %60\n"
- "%62 = OpVariable %61 Output\n"
- "%65 = OpTypeVector %60 4\n"
- "%66 = OpConstant %6 1\n"
- "%67 = OpTypeArray %60 %66\n"
- "%68 = OpTypeStruct %65 %60 %67 %67\n"
- "%69 = OpTypePointer Output %68\n"
- "%70 = OpVariable %69 Output\n"
- "%71 = OpTypeStruct %65 %60 %67 %67\n"
- "%72 = OpTypeArray %71 %66\n"
- "%73 = OpTypePointer Input %72\n"
- "%74 = OpVariable %73 Input\n"
- "%75 = OpTypePointer Input %65\n"
- "%78 = OpTypePointer Output %65\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%28 = OpVariable %27 Function\n"
- "OpStore %8 %9\n"
- "%15 = OpGroupNonUniformBallot %10 %14 %13\n"
- "%17 = OpIEqual %16 %11 %15\n"
- "%18 = OpAll %12 %17\n"
- "%19 = OpLogicalNot %12 %18\n"
- "%23 = OpSelect %20 %19 %21 %22\n"
- "%24 = OpBitcast %6 %23\n"
- "%25 = OpLoad %6 %8\n"
- "%26 = OpBitwiseOr %6 %25 %24\n"
- "OpStore %8 %26\n"
- "%36 = OpLoad %6 %35\n"
- "%38 = OpAccessChain %37 %33 %22 %36\n"
- "%39 = OpLoad %6 %38\n"
- "%40 = OpINotEqual %12 %39 %9\n"
- "OpStore %28 %40\n"
- "%41 = OpLoad %12 %28\n"
- "%42 = OpGroupNonUniformBallot %10 %14 %41\n"
- "%43 = OpIEqual %16 %11 %42\n"
- "%44 = OpAll %12 %43\n"
- "%45 = OpLogicalNot %12 %44\n"
- "%47 = OpSelect %20 %45 %46 %22\n"
- "%48 = OpBitcast %6 %47\n"
- "%49 = OpLoad %6 %8\n"
- "%50 = OpBitwiseOr %6 %49 %48\n"
- "OpStore %8 %50\n"
- "%52 = OpGroupNonUniformBallot %10 %14 %51\n"
- "%53 = OpIEqual %16 %11 %52\n"
- "%54 = OpAll %12 %53\n"
- "%56 = OpSelect %20 %54 %55 %22\n"
- "%57 = OpBitcast %6 %56\n"
- "%58 = OpLoad %6 %8\n"
- "%59 = OpBitwiseOr %6 %58 %57\n"
- "OpStore %8 %59\n"
- "%63 = OpLoad %6 %8\n"
- "%64 = OpConvertUToF %60 %63\n"
- "OpStore %62 %64\n"
- "%76 = OpAccessChain %75 %74 %22 %22\n"
- "%77 = OpLoad %65 %76\n"
- "%79 = OpAccessChain %78 %70 %22\n"
- "OpStore %79 %77\n"
- "OpEmitVertex\n"
- "OpEndPrimitive\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("geometry") << geometry << buildOptionsSpr;
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
- /*
+ const string controlSourceGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(vertices = 2) out;\n"
"layout(location = 0) out float out_color[];\n"
- "layout(set = 0, binding = 0) uniform Buffer1\n"
+ "layout(binding = 0) uniform Buffer1\n"
"{\n"
- " uint data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
"};\n"
"\n"
"void main (void)\n"
"{\n"
" if (gl_InvocationID == 0)\n"
- {\n"
+ " {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_TessLevelOuter[1] = 1.0f;\n"
" }\n"
" out_color[gl_InvocationID] = float(tempResult);\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- */
- const string controlSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 102\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %50 %78 %89 %95\n"
- "OpExecutionMode %4 OutputVertices 2\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- "OpDecorate %45 ArrayStride 16\n"
- "OpMemberDecorate %46 0 Offset 0\n"
- "OpDecorate %46 Block\n"
- "OpDecorate %48 DescriptorSet 0\n"
- "OpDecorate %48 Binding 0\n"
- "OpDecorate %50 RelaxedPrecision\n"
- "OpDecorate %50 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %51 RelaxedPrecision\n"
- "OpDecorate %78 Location 0\n"
- "OpMemberDecorate %86 0 BuiltIn Position\n"
- "OpMemberDecorate %86 1 BuiltIn PointSize\n"
- "OpMemberDecorate %86 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %86 3 BuiltIn CullDistance\n"
- "OpDecorate %86 Block\n"
- "OpMemberDecorate %91 0 BuiltIn Position\n"
- "OpMemberDecorate %91 1 BuiltIn PointSize\n"
- "OpMemberDecorate %91 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %91 3 BuiltIn CullDistance\n"
- "OpDecorate %91 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpTypePointer Function %16\n"
- "%28 = OpConstant %16 0\n"
- "%29 = OpTypeVector %16 4\n"
- "%30 = OpConstantComposite %29 %28 %28 %28 %28\n"
- "%31 = OpConstantTrue %11\n"
- "%32 = OpConstant %16 3\n"
- "%34 = OpTypeVector %11 4\n"
- "%42 = OpTypePointer Function %11\n"
- "%44 = OpConstant %16 " + subgroupSizeStr.str() + "\n"
- "%45 = OpTypeArray %16 %44\n"
- "%46 = OpTypeStruct %45\n"
- "%47 = OpTypePointer Uniform %46\n"
- "%48 = OpVariable %47 Uniform\n"
- "%49 = OpTypePointer Input %16\n"
- "%50 = OpVariable %49 Input\n"
- "%52 = OpTypePointer Uniform %16\n"
- "%61 = OpConstant %6 2\n"
- "%66 = OpConstantFalse %11\n"
- "%70 = OpConstant %6 4\n"
- "%75 = OpConstant %16 2\n"
- "%76 = OpTypeArray %15 %75\n"
- "%77 = OpTypePointer Output %76\n"
- "%78 = OpVariable %77 Output\n"
- "%83 = OpTypeVector %15 4\n"
- "%84 = OpConstant %16 1\n"
- "%85 = OpTypeArray %15 %84\n"
- "%86 = OpTypeStruct %83 %15 %85 %85\n"
- "%87 = OpTypeArray %86 %75\n"
- "%88 = OpTypePointer Output %87\n"
- "%89 = OpVariable %88 Output\n"
- "%91 = OpTypeStruct %83 %15 %85 %85\n"
- "%92 = OpConstant %16 32\n"
- "%93 = OpTypeArray %91 %92\n"
- "%94 = OpTypePointer Input %93\n"
- "%95 = OpVariable %94 Input\n"
- "%97 = OpTypePointer Input %83\n"
- "%100 = OpTypePointer Output %83\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%27 = OpVariable %26 Function\n"
- "%43 = OpVariable %42 Function\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "OpStore %27 %28\n"
- "%33 = OpGroupNonUniformBallot %29 %32 %31\n"
- "%35 = OpIEqual %34 %30 %33\n"
- "%36 = OpAll %11 %35\n"
- "%37 = OpLogicalNot %11 %36\n"
- "%38 = OpSelect %6 %37 %24 %10\n"
- "%39 = OpBitcast %16 %38\n"
- "%40 = OpLoad %16 %27\n"
- "%41 = OpBitwiseOr %16 %40 %39\n"
- "OpStore %27 %41\n"
- "%51 = OpLoad %16 %50\n"
- "%53 = OpAccessChain %52 %48 %10 %51\n"
- "%54 = OpLoad %16 %53\n"
- "%55 = OpINotEqual %11 %54 %28\n"
- "OpStore %43 %55\n"
- "%56 = OpLoad %11 %43\n"
- "%57 = OpGroupNonUniformBallot %29 %32 %56\n"
- "%58 = OpIEqual %34 %30 %57\n"
- "%59 = OpAll %11 %58\n"
- "%60 = OpLogicalNot %11 %59\n"
- "%62 = OpSelect %6 %60 %61 %10\n"
- "%63 = OpBitcast %16 %62\n"
- "%64 = OpLoad %16 %27\n"
- "%65 = OpBitwiseOr %16 %64 %63\n"
- "OpStore %27 %65\n"
- "%67 = OpGroupNonUniformBallot %29 %32 %66\n"
- "%68 = OpIEqual %34 %30 %67\n"
- "%69 = OpAll %11 %68\n"
- "%71 = OpSelect %6 %69 %70 %10\n"
- "%72 = OpBitcast %16 %71\n"
- "%73 = OpLoad %16 %27\n"
- "%74 = OpBitwiseOr %16 %73 %72\n"
- "OpStore %27 %74\n"
- "%79 = OpLoad %6 %8\n"
- "%80 = OpLoad %16 %27\n"
- "%81 = OpConvertUToF %15 %80\n"
- "%82 = OpAccessChain %22 %78 %79\n"
- "OpStore %82 %81\n"
- "%90 = OpLoad %6 %8\n"
- "%96 = OpLoad %6 %8\n"
- "%98 = OpAccessChain %97 %95 %96 %10\n"
- "%99 = OpLoad %83 %98\n"
- "%101 = OpAccessChain %100 %89 %90 %10\n"
- "OpStore %101 %99\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
-
- programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
- /*
+ const string evaluationSourceGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines, equal_spacing, ccw ) in;\n"
"layout(location = 0) out float out_color;\n"
- "layout(set = 0, binding = 0) uniform Buffer1\n"
+ "layout(binding = 0) uniform Buffer1\n"
"{\n"
- " uint data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ " uint data[" + subgroupSizeStr.str() + "];\n"
"};\n"
"\n"
"void main (void)\n"
" out_color = float(tempResult);\n"
" gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
"}\n";
- */
- const string evaluationSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 91\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %35 %62 %70 %75 %83\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpDecorate %30 ArrayStride 16\n"
- "OpMemberDecorate %31 0 Offset 0\n"
- "OpDecorate %31 Block\n"
- "OpDecorate %33 DescriptorSet 0\n"
- "OpDecorate %33 Binding 0\n"
- "OpDecorate %35 RelaxedPrecision\n"
- "OpDecorate %35 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpDecorate %62 Location 0\n"
- "OpMemberDecorate %68 0 BuiltIn Position\n"
- "OpMemberDecorate %68 1 BuiltIn PointSize\n"
- "OpMemberDecorate %68 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %68 3 BuiltIn CullDistance\n"
- "OpDecorate %68 Block\n"
- "OpMemberDecorate %71 0 BuiltIn Position\n"
- "OpMemberDecorate %71 1 BuiltIn PointSize\n"
- "OpMemberDecorate %71 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %71 3 BuiltIn CullDistance\n"
- "OpDecorate %71 Block\n"
- "OpDecorate %83 BuiltIn TessCoord\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 0\n"
- "%10 = OpTypeVector %6 4\n"
- "%11 = OpConstantComposite %10 %9 %9 %9 %9\n"
- "%12 = OpTypeBool\n"
- "%13 = OpConstantTrue %12\n"
- "%14 = OpConstant %6 3\n"
- "%16 = OpTypeVector %12 4\n"
- "%20 = OpTypeInt 32 1\n"
- "%21 = OpConstant %20 1\n"
- "%22 = OpConstant %20 0\n"
- "%27 = OpTypePointer Function %12\n"
- "%29 = OpConstant %6 " + subgroupSizeStr.str() + "\n"
- "%30 = OpTypeArray %6 %29\n"
- "%31 = OpTypeStruct %30\n"
- "%32 = OpTypePointer Uniform %31\n"
- "%33 = OpVariable %32 Uniform\n"
- "%34 = OpTypePointer Input %6\n"
- "%35 = OpVariable %34 Input\n"
- "%37 = OpTypePointer Uniform %6\n"
- "%46 = OpConstant %20 2\n"
- "%51 = OpConstantFalse %12\n"
- "%55 = OpConstant %20 4\n"
- "%60 = OpTypeFloat 32\n"
- "%61 = OpTypePointer Output %60\n"
- "%62 = OpVariable %61 Output\n"
- "%65 = OpTypeVector %60 4\n"
- "%66 = OpConstant %6 1\n"
- "%67 = OpTypeArray %60 %66\n"
- "%68 = OpTypeStruct %65 %60 %67 %67\n"
- "%69 = OpTypePointer Output %68\n"
- "%70 = OpVariable %69 Output\n"
- "%71 = OpTypeStruct %65 %60 %67 %67\n"
- "%72 = OpConstant %6 32\n"
- "%73 = OpTypeArray %71 %72\n"
- "%74 = OpTypePointer Input %73\n"
- "%75 = OpVariable %74 Input\n"
- "%76 = OpTypePointer Input %65\n"
- "%81 = OpTypeVector %60 3\n"
- "%82 = OpTypePointer Input %81\n"
- "%83 = OpVariable %82 Input\n"
- "%84 = OpTypePointer Input %60\n"
- "%89 = OpTypePointer Output %65\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%28 = OpVariable %27 Function\n"
- "OpStore %8 %9\n"
- "%15 = OpGroupNonUniformBallot %10 %14 %13\n"
- "%17 = OpIEqual %16 %11 %15\n"
- "%18 = OpAll %12 %17\n"
- "%19 = OpLogicalNot %12 %18\n"
- "%23 = OpSelect %20 %19 %21 %22\n"
- "%24 = OpBitcast %6 %23\n"
- "%25 = OpLoad %6 %8\n"
- "%26 = OpBitwiseOr %6 %25 %24\n"
- "OpStore %8 %26\n"
- "%36 = OpLoad %6 %35\n"
- "%38 = OpAccessChain %37 %33 %22 %36\n"
- "%39 = OpLoad %6 %38\n"
- "%40 = OpINotEqual %12 %39 %9\n"
- "OpStore %28 %40\n"
- "%41 = OpLoad %12 %28\n"
- "%42 = OpGroupNonUniformBallot %10 %14 %41\n"
- "%43 = OpIEqual %16 %11 %42\n"
- "%44 = OpAll %12 %43\n"
- "%45 = OpLogicalNot %12 %44\n"
- "%47 = OpSelect %20 %45 %46 %22\n"
- "%48 = OpBitcast %6 %47\n"
- "%49 = OpLoad %6 %8\n"
- "%50 = OpBitwiseOr %6 %49 %48\n"
- "OpStore %8 %50\n"
- "%52 = OpGroupNonUniformBallot %10 %14 %51\n"
- "%53 = OpIEqual %16 %11 %52\n"
- "%54 = OpAll %12 %53\n"
- "%56 = OpSelect %20 %54 %55 %22\n"
- "%57 = OpBitcast %6 %56\n"
- "%58 = OpLoad %6 %8\n"
- "%59 = OpBitwiseOr %6 %58 %57\n"
- "OpStore %8 %59\n"
- "%63 = OpLoad %6 %8\n"
- "%64 = OpConvertUToF %60 %63\n"
- "OpStore %62 %64\n"
- "%77 = OpAccessChain %76 %75 %22 %22\n"
- "%78 = OpLoad %65 %77\n"
- "%79 = OpAccessChain %76 %75 %21 %22\n"
- "%80 = OpLoad %65 %79\n"
- "%85 = OpAccessChain %84 %83 %9\n"
- "%86 = OpLoad %60 %85\n"
- "%87 = OpCompositeConstruct %65 %86 %86 %86 %86\n"
- "%88 = OpExtInst %65 %1 FMix %78 %80 %87\n"
- "%90 = OpAccessChain %89 %70 %22\n"
- "OpStore %90 %88\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
+
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
}
else
{
void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer1\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "layout(binding = 1, std430) buffer Buffer2\n"
<< "{\n"
<< " uint data[];\n"
<< "};\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
const string vertex =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
- "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" uint data[];\n"
"};\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"
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" uint data[];\n"
"};\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"
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" uint data[];\n"
"};\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"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" uint data[];\n"
"};\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"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(location = 0) out uint result;\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer1\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" uint data[];\n"
"};\n"
subgroups::addNoSubgroupShader(programCollection);
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
}
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
}
}
subgroups::SSBOData inputData[1];
- inputData[0].format = VK_FORMAT_R32_UINT;
+ inputData[0].format = FORMAT_R32_UINT;
inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
-
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ inputData[0].binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
" is required to support subgroup operations!");
}
subgroups::SSBOData inputData[1];
- inputData[0].format = VK_FORMAT_R32_UINT;
+ inputData[0].format = FORMAT_R32_UINT;
inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 1u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, inputData, 1, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
-
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
-
- if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData;
- inputData.format = VK_FORMAT_R32_UINT;
+ inputData.format = FORMAT_R32_UINT;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
inputData.binding = 4u;
inputData.stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsBallotTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsBallotTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup ballot category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup ballot category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup ballot category tests: framebuffer"));
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
- VK_SHADER_STAGE_VERTEX_BIT
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT
};
{
- const CaseDefinition caseDef = {VK_SHADER_STAGE_COMPUTE_BIT};
- addFunctionCaseWithPrograms(computeGroup.get(), getShaderStageName(caseDef.shaderStage), "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ getShaderStageName(caseDef.shaderStage), "",
+ supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {VK_SHADER_STAGE_ALL_GRAPHICS};
- addFunctionCaseWithPrograms(graphicGroup.get(), "graphic", "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), "graphic", "", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {stages[stageIndex]};
- addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDef.shaderStage), "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "ballot", "Subgroup ballot category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSBALLOTTESTS_HPP
-#define _VKTSUBGROUPSBALLOTTESTS_HPP
+#ifndef _GLCSUBGROUPSBALLOTTESTS_HPP
+#define _GLCSUBGROUPSBALLOTTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsBallotTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsBallotTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSBALLOTTESTS_HPP
+#endif // _GLCSUBGROUPSBALLOTTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsBasicTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsBasicTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
+#include "gluContextInfo.hpp"
#include <string>
#include <vector>
+#include "tcuStringTemplate.hpp"
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+
+namespace glc
+{
+namespace subgroups
+{
namespace
{
static const deUint32 ELECTED_VALUE = 42u;
static const deUint32 UNELECTED_VALUE = 13u;
-static const vk::VkDeviceSize SHADER_BUFFER_SIZE = 4096ull; // min(maxUniformBufferRange, maxImageDimension1D)
+static const deUint64 SHADER_BUFFER_SIZE = 4096ull;
static bool checkFragmentSubgroupBarriersNoSSBO(std::vector<const void*> datas,
deUint32 width, deUint32 height, deUint32)
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
}
static bool checkComputeSubgroupBarriers(std::vector<const void*> datas,
{
// We used this SSBO to generate our unique value!
const deUint32 ref = *reinterpret_cast<const deUint32*>(datas[2]);
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, ref);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, ref);
}
enum OpType
struct CaseDefinition
{
- int opType;
- VkShaderStageFlags shaderStage;
+ int opType;
+ subgroups::ShaderStageFlags shaderStage;
};
void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- const vk::SpirVAsmBuildOptions buildOptionsSpr (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3);
-
- if(VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
+ if(subgroups::SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
{
- /*
+ const string fragmentGLSL =
+ "#version 450\n"
"layout(location = 0) in vec4 in_color;\n"
"layout(location = 0) out vec4 out_color;\n"
"void main()\n"
- {\n"
+ "{\n"
" out_color = in_color;\n"
"}\n";
- */
- const string fragment =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 13\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Fragment %4 \"main\" %9 %11\n"
- "OpExecutionMode %4 OriginUpperLeft\n"
- "OpDecorate %9 Location 0\n"
- "OpDecorate %11 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypePointer Output %7\n"
- "%9 = OpVariable %8 Output\n"
- "%10 = OpTypePointer Input %7\n"
- "%11 = OpVariable %10 Input\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%12 = OpLoad %7 %11\n"
- "OpStore %9 %12\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("fragment") << fragment;
+
+ programCollection.add("fragment") << glu::FragmentSource(fragmentGLSL);
}
- if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ if (subgroups::SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
{
- /*
+ const string vertexGLSL =
"#version 450\n"
"void main (void)\n"
"{\n"
- " vec2 uv = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);\n"
+ " vec2 uv = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2);\n"
" gl_Position = vec4(uv * 2.0f + -1.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- */
- const string vertex =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 44\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %12 %29\n"
- "OpDecorate %12 BuiltIn VertexIndex\n"
- "OpMemberDecorate %27 0 BuiltIn Position\n"
- "OpMemberDecorate %27 1 BuiltIn PointSize\n"
- "OpMemberDecorate %27 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %27 3 BuiltIn CullDistance\n"
- "OpDecorate %27 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 2\n"
- "%8 = OpTypePointer Function %7\n"
- "%10 = OpTypeInt 32 1\n"
- "%11 = OpTypePointer Input %10\n"
- "%12 = OpVariable %11 Input\n"
- "%14 = OpConstant %10 1\n"
- "%16 = OpConstant %10 2\n"
- "%23 = OpTypeVector %6 4\n"
- "%24 = OpTypeInt 32 0\n"
- "%25 = OpConstant %24 1\n"
- "%26 = OpTypeArray %6 %25\n"
- "%27 = OpTypeStruct %23 %6 %26 %26\n"
- "%28 = OpTypePointer Output %27\n"
- "%29 = OpVariable %28 Output\n"
- "%30 = OpConstant %10 0\n"
- "%32 = OpConstant %6 2\n"
- "%34 = OpConstant %6 -1\n"
- "%37 = OpConstant %6 0\n"
- "%38 = OpConstant %6 1\n"
- "%42 = OpTypePointer Output %23\n"
- "%44 = OpTypePointer Output %6\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpVariable %8 Function\n"
- "%13 = OpLoad %10 %12\n"
- "%15 = OpShiftLeftLogical %10 %13 %14\n"
- "%17 = OpBitwiseAnd %10 %15 %16\n"
- "%18 = OpConvertSToF %6 %17\n"
- "%19 = OpLoad %10 %12\n"
- "%20 = OpBitwiseAnd %10 %19 %16\n"
- "%21 = OpConvertSToF %6 %20\n"
- "%22 = OpCompositeConstruct %7 %18 %21\n"
- "OpStore %9 %22\n"
- "%31 = OpLoad %7 %9\n"
- "%33 = OpVectorTimesScalar %7 %31 %32\n"
- "%35 = OpCompositeConstruct %7 %34 %34\n"
- "%36 = OpFAdd %7 %33 %35\n"
- "%39 = OpCompositeExtract %6 %36 0\n"
- "%40 = OpCompositeExtract %6 %36 1\n"
- "%41 = OpCompositeConstruct %23 %39 %40 %37 %38\n"
- "%43 = OpAccessChain %42 %29 %30\n"
- "OpStore %43 %41\n"
- "%45 = OpAccessChain %44 %29 %14\n"
- "OpStore %45 %38\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("vert") << vertex;
+
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
}
- else if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
if (OPTYPE_ELECT == caseDef.opType)
electedValue << ELECTED_VALUE;
unelectedValue << UNELECTED_VALUE;
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (subgroups::SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
- /*
+ const string vertexGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(location = 0) out vec4 out_color;\n"
"layout(location = 0) in highp vec4 in_position;\n"
"{\n"
" if (subgroupElect())\n"
" {\n"
- " out_color.r = " << ELECTED_VALUE << ";\n"
+ " out_color.r = " + electedValue.str() + ";\n"
" out_color.g = 1.0f;\n"
" }\n"
" else\n"
" {\n"
- " out_color.r = " << UNELECTED_VALUE << ";\n"
+ " out_color.r = " + unelectedValue.str() + ";\n"
" out_color.g = 0.0f;\n"
" }\n"
" gl_Position = in_position;\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- */
- const string vertex =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 38\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %15 %31 %35\n"
- "OpDecorate %15 Location 0\n"
- "OpMemberDecorate %29 0 BuiltIn Position\n"
- "OpMemberDecorate %29 1 BuiltIn PointSize\n"
- "OpMemberDecorate %29 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %29 3 BuiltIn CullDistance\n"
- "OpDecorate %29 Block\n"
- "OpDecorate %35 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeBool\n"
- "%7 = OpTypeInt 32 0\n"
- "%8 = OpConstant %7 3\n"
- "%12 = OpTypeFloat 32\n"
- "%13 = OpTypeVector %12 4\n"
- "%14 = OpTypePointer Output %13\n"
- "%15 = OpVariable %14 Output\n"
- "%16 = OpConstant %12 " + electedValue.str() + "\n"
- "%17 = OpConstant %7 0\n"
- "%18 = OpTypePointer Output %12\n"
- "%20 = OpConstant %12 1\n"
- "%21 = OpConstant %7 1\n"
- "%24 = OpConstant %12 " + unelectedValue.str() + "\n"
- "%26 = OpConstant %12 0\n"
- "%28 = OpTypeArray %12 %21\n"
- "%29 = OpTypeStruct %13 %12 %28 %28\n"
- "%30 = OpTypePointer Output %29\n"
- "%31 = OpVariable %30 Output\n"
- "%32 = OpTypeInt 32 1\n"
- "%33 = OpConstant %32 0\n"
- "%34 = OpTypePointer Input %13\n"
- "%35 = OpVariable %34 Input\n"
- "%38 = OpConstant %32 1\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpGroupNonUniformElect %6 %8\n"
- "OpSelectionMerge %11 None\n"
- "OpBranchConditional %9 %10 %23\n"
- "%10 = OpLabel\n"
- "%19 = OpAccessChain %18 %15 %17\n"
- "OpStore %19 %16\n"
- "%22 = OpAccessChain %18 %15 %21\n"
- "OpStore %22 %20\n"
- "OpBranch %11\n"
- "%23 = OpLabel\n"
- "%25 = OpAccessChain %18 %15 %17\n"
- "OpStore %25 %24\n"
- "%27 = OpAccessChain %18 %15 %21\n"
- "OpStore %27 %26\n"
- "OpBranch %11\n"
- "%11 = OpLabel\n"
- "%36 = OpLoad %13 %35\n"
- "%37 = OpAccessChain %14 %31 %33\n"
- "OpStore %37 %36\n"
- "%39 = OpAccessChain %18 %31 %38\n"
- "OpStore %39 %20\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("vert") << vertex << buildOptionsSpr;
+
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
- /*
+ const string geometryGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(points) in;\n"
"{\n"
" if (subgroupElect())\n"
" {\n"
- " out_color.r = " << ELECTED_VALUE << ";\n"
+ " out_color.r = " + electedValue.str() + ";\n"
" out_color.g = 1.0f;\n"
" }\n"
" else\n"
" {\n"
- " out_color.r = " << UNELECTED_VALUE << ";\n"
+ " out_color.r = " + unelectedValue.str() + ";\n"
" out_color.g = 0.0f;\n"
" }\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- */
- const string geometry =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 42\n"
- "; Schema: 0\n"
- "OpCapability Geometry\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Geometry %4 \"main\" %15 %31 %37\n"
- "OpExecutionMode %4 InputPoints\n"
- "OpExecutionMode %4 Invocations 1\n"
- "OpExecutionMode %4 OutputPoints\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- "OpDecorate %15 Location 0\n"
- "OpMemberDecorate %29 0 BuiltIn Position\n"
- "OpMemberDecorate %29 1 BuiltIn PointSize\n"
- "OpMemberDecorate %29 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %29 3 BuiltIn CullDistance\n"
- "OpDecorate %29 Block\n"
- "OpMemberDecorate %34 0 BuiltIn Position\n"
- "OpMemberDecorate %34 1 BuiltIn PointSize\n"
- "OpMemberDecorate %34 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %34 3 BuiltIn CullDistance\n"
- "OpDecorate %34 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeBool\n"
- "%7 = OpTypeInt 32 0\n"
- "%8 = OpConstant %7 3\n"
- "%12 = OpTypeFloat 32\n"
- "%13 = OpTypeVector %12 4\n"
- "%14 = OpTypePointer Output %13\n"
- "%15 = OpVariable %14 Output\n"
- "%16 = OpConstant %12 " + electedValue.str() + "\n"
- "%17 = OpConstant %7 0\n"
- "%18 = OpTypePointer Output %12\n"
- "%20 = OpConstant %12 1\n"
- "%21 = OpConstant %7 1\n"
- "%24 = OpConstant %12 " + unelectedValue.str() + "\n"
- "%26 = OpConstant %12 0\n"
- "%28 = OpTypeArray %12 %21\n"
- "%29 = OpTypeStruct %13 %12 %28 %28\n"
- "%30 = OpTypePointer Output %29\n"
- "%31 = OpVariable %30 Output\n"
- "%32 = OpTypeInt 32 1\n"
- "%33 = OpConstant %32 0\n"
- "%34 = OpTypeStruct %13 %12 %28 %28\n"
- "%35 = OpTypeArray %34 %21\n"
- "%36 = OpTypePointer Input %35\n"
- "%37 = OpVariable %36 Input\n"
- "%38 = OpTypePointer Input %13\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpGroupNonUniformElect %6 %8\n"
- "OpSelectionMerge %11 None\n"
- "OpBranchConditional %9 %10 %23\n"
- "%10 = OpLabel\n"
- "%19 = OpAccessChain %18 %15 %17\n"
- "OpStore %19 %16\n"
- "%22 = OpAccessChain %18 %15 %21\n"
- "OpStore %22 %20\n"
- "OpBranch %11\n"
- "%23 = OpLabel\n"
- "%25 = OpAccessChain %18 %15 %17\n"
- "OpStore %25 %24\n"
- "%27 = OpAccessChain %18 %15 %21\n"
- "OpStore %27 %26\n"
- "OpBranch %11\n"
- "%11 = OpLabel\n"
- "%39 = OpAccessChain %38 %37 %33 %33\n"
- "%40 = OpLoad %13 %39\n"
- "%41 = OpAccessChain %14 %31 %33\n"
- "OpStore %41 %40\n"
- "OpEmitVertex\n"
- "OpEndPrimitive\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("geometry") << geometry << buildOptionsSpr;
+
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
- /*
- << "#extension GL_KHR_shader_subgroup_basic: enable\n"
- << "#extension GL_EXT_tessellation_shader : require\n"
- << "layout(vertices = 2) out;\n"
- << "void main (void)\n"
- << "{\n"
- << " if (gl_InvocationID == 0)\n"
- <<" {\n"
- << " gl_TessLevelOuter[0] = 1.0f;\n"
- << " gl_TessLevelOuter[1] = 1.0f;\n"
- << " }\n"
- << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
- << "}\n";
- */
- const string controlSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 46\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %33 %39\n"
- "OpExecutionMode %4 OutputVertices 2\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- "OpMemberDecorate %29 0 BuiltIn Position\n"
- "OpMemberDecorate %29 1 BuiltIn PointSize\n"
- "OpMemberDecorate %29 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %29 3 BuiltIn CullDistance\n"
- "OpDecorate %29 Block\n"
- "OpMemberDecorate %35 0 BuiltIn Position\n"
- "OpMemberDecorate %35 1 BuiltIn PointSize\n"
- "OpMemberDecorate %35 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %35 3 BuiltIn CullDistance\n"
- "OpDecorate %35 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpTypeVector %15 4\n"
- "%27 = OpConstant %16 1\n"
- "%28 = OpTypeArray %15 %27\n"
- "%29 = OpTypeStruct %26 %15 %28 %28\n"
- "%30 = OpConstant %16 2\n"
- "%31 = OpTypeArray %29 %30\n"
- "%32 = OpTypePointer Output %31\n"
- "%33 = OpVariable %32 Output\n"
- "%35 = OpTypeStruct %26 %15 %28 %28\n"
- "%36 = OpConstant %16 32\n"
- "%37 = OpTypeArray %35 %36\n"
- "%38 = OpTypePointer Input %37\n"
- "%39 = OpVariable %38 Input\n"
- "%41 = OpTypePointer Input %26\n"
- "%44 = OpTypePointer Output %26\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "%34 = OpLoad %6 %8\n"
- "%40 = OpLoad %6 %8\n"
- "%42 = OpAccessChain %41 %39 %40 %10\n"
- "%43 = OpLoad %26 %42\n"
- "%45 = OpAccessChain %44 %33 %34 %10\n"
- "OpStore %45 %43\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
-
- /*
+ const string controlSourceGLSL =
+ "#version 450\n"
+ "#extension GL_KHR_shader_subgroup_basic: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(vertices = 2) out;\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(isolines, equal_spacing, ccw ) in;\n"
"{\n"
" if (subgroupElect())\n"
" {\n"
- " out_color.r = " << 2 * ELECTED_VALUE - UNELECTED_VALUE << ";\n"
+ " out_color.r = 71.f;\n" // << 2 * ELECTED_VALUE - UNELECTED_VALUE << ";\n"
" out_color.g = 2.0f;\n"
" }\n"
" else\n"
" {\n"
- " out_color.r = " << UNELECTED_VALUE << ";\n"
+ " out_color.r = " + unelectedValue.str() + ";\n"
" out_color.g = 0.0f;\n"
" }\n"
" gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
"}\n";
- */
-
- const string evaluationSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 54\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %15 %31 %38 %47\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpDecorate %15 Location 0\n"
- "OpMemberDecorate %29 0 BuiltIn Position\n"
- "OpMemberDecorate %29 1 BuiltIn PointSize\n"
- "OpMemberDecorate %29 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %29 3 BuiltIn CullDistance\n"
- "OpDecorate %29 Block\n"
- "OpMemberDecorate %34 0 BuiltIn Position\n"
- "OpMemberDecorate %34 1 BuiltIn PointSize\n"
- "OpMemberDecorate %34 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %34 3 BuiltIn CullDistance\n"
- "OpDecorate %34 Block\n"
- "OpDecorate %47 BuiltIn TessCoord\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeBool\n"
- "%7 = OpTypeInt 32 0\n"
- "%8 = OpConstant %7 3\n"
- "%12 = OpTypeFloat 32\n"
- "%13 = OpTypeVector %12 4\n"
- "%14 = OpTypePointer Output %13\n"
- "%15 = OpVariable %14 Output\n"
- "%16 = OpConstant %12 71\n"//electedValue
- "%17 = OpConstant %7 0\n"
- "%18 = OpTypePointer Output %12\n"
- "%20 = OpConstant %12 2\n"
- "%21 = OpConstant %7 1\n"
- "%24 = OpConstant %12 " + unelectedValue.str() + "\n"
- "%26 = OpConstant %12 0\n"
- "%28 = OpTypeArray %12 %21\n"
- "%29 = OpTypeStruct %13 %12 %28 %28\n"
- "%30 = OpTypePointer Output %29\n"
- "%31 = OpVariable %30 Output\n"
- "%32 = OpTypeInt 32 1\n"
- "%33 = OpConstant %32 0\n"
- "%34 = OpTypeStruct %13 %12 %28 %28\n"
- "%35 = OpConstant %7 32\n"
- "%36 = OpTypeArray %34 %35\n"
- "%37 = OpTypePointer Input %36\n"
- "%38 = OpVariable %37 Input\n"
- "%39 = OpTypePointer Input %13\n"
- "%42 = OpConstant %32 1\n"
- "%45 = OpTypeVector %12 3\n"
- "%46 = OpTypePointer Input %45\n"
- "%47 = OpVariable %46 Input\n"
- "%48 = OpTypePointer Input %12\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpGroupNonUniformElect %6 %8\n"
- "OpSelectionMerge %11 None\n"
- "OpBranchConditional %9 %10 %23\n"
- "%10 = OpLabel\n"
- "%19 = OpAccessChain %18 %15 %17\n"
- "OpStore %19 %16\n"
- "%22 = OpAccessChain %18 %15 %21\n"
- "OpStore %22 %20\n"
- "OpBranch %11\n"
- "%23 = OpLabel\n"
- "%25 = OpAccessChain %18 %15 %17\n"
- "OpStore %25 %24\n"
- "%27 = OpAccessChain %18 %15 %21\n"
- "OpStore %27 %26\n"
- "OpBranch %11\n"
- "%11 = OpLabel\n"
- "%40 = OpAccessChain %39 %38 %33 %33\n"
- "%41 = OpLoad %13 %40\n"
- "%43 = OpAccessChain %39 %38 %42 %33\n"
- "%44 = OpLoad %13 %43\n"
- "%49 = OpAccessChain %48 %47 %17\n"
- "%50 = OpLoad %12 %49\n"
- "%51 = OpCompositeConstruct %13 %50 %50 %50 %50\n"
- "%52 = OpExtInst %13 %1 FMix %41 %44 %51\n"
- "%53 = OpAccessChain %14 %31 %33\n"
- "OpStore %53 %52\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
-
- programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
- /*
+ const string controlSourceGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(vertices = 2) out;\n"
"void main (void)\n"
"{\n"
" if (gl_InvocationID == 0)\n"
- {\n"
+ " {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_TessLevelOuter[1] = 1.0f;\n"
" }\n"
" if (subgroupElect())\n"
" {\n"
- " out_color[gl_InvocationID].r = " << ELECTED_VALUE << ";\n"
+ " out_color[gl_InvocationID].r = " + electedValue.str() + ";\n"
" out_color[gl_InvocationID].g = 1.0f;\n"
" }\n"
" else\n"
" {\n"
- " out_color[gl_InvocationID].r = " << UNELECTED_VALUE << ";\n"
+ " out_color[gl_InvocationID].r = " + unelectedValue.str() + ";\n"
" out_color[gl_InvocationID].g = 0.0f;\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- */
- const string controlSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 66\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %34 %53 %59\n"
- "OpExecutionMode %4 OutputVertices 2\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- "OpDecorate %34 Location 0\n"
- "OpMemberDecorate %50 0 BuiltIn Position\n"
- "OpMemberDecorate %50 1 BuiltIn PointSize\n"
- "OpMemberDecorate %50 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %50 3 BuiltIn CullDistance\n"
- "OpDecorate %50 Block\n"
- "OpMemberDecorate %55 0 BuiltIn Position\n"
- "OpMemberDecorate %55 1 BuiltIn PointSize\n"
- "OpMemberDecorate %55 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %55 3 BuiltIn CullDistance\n"
- "OpDecorate %55 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpConstant %16 3\n"
- "%30 = OpTypeVector %15 4\n"
- "%31 = OpConstant %16 2\n"
- "%32 = OpTypeArray %30 %31\n"
- "%33 = OpTypePointer Output %32\n"
- "%34 = OpVariable %33 Output\n"
- "%36 = OpConstant %15 " + electedValue.str() + "\n"
- "%37 = OpConstant %16 0\n"
- "%40 = OpConstant %16 1\n"
- "%44 = OpConstant %15 " + unelectedValue.str() + "\n"
- "%47 = OpConstant %15 0\n"
- "%49 = OpTypeArray %15 %40\n"
- "%50 = OpTypeStruct %30 %15 %49 %49\n"
- "%51 = OpTypeArray %50 %31\n"
- "%52 = OpTypePointer Output %51\n"
- "%53 = OpVariable %52 Output\n"
- "%55 = OpTypeStruct %30 %15 %49 %49\n"
- "%56 = OpConstant %16 32\n"
- "%57 = OpTypeArray %55 %56\n"
- "%58 = OpTypePointer Input %57\n"
- "%59 = OpVariable %58 Input\n"
- "%61 = OpTypePointer Input %30\n"
- "%64 = OpTypePointer Output %30\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "%27 = OpGroupNonUniformElect %11 %26\n"
- "OpSelectionMerge %29 None\n"
- "OpBranchConditional %27 %28 %42\n"
- "%28 = OpLabel\n"
- "%35 = OpLoad %6 %8\n"
- "%38 = OpAccessChain %22 %34 %35 %37\n"
- "OpStore %38 %36\n"
- "%39 = OpLoad %6 %8\n"
- "%41 = OpAccessChain %22 %34 %39 %40\n"
- "OpStore %41 %21\n"
- "OpBranch %29\n"
- "%42 = OpLabel\n"
- "%43 = OpLoad %6 %8\n"
- "%45 = OpAccessChain %22 %34 %43 %37\n"
- "OpStore %45 %44\n"
- "%46 = OpLoad %6 %8\n"
- "%48 = OpAccessChain %22 %34 %46 %40\n"
- "OpStore %48 %47\n"
- "OpBranch %29\n"
- "%29 = OpLabel\n"
- "%54 = OpLoad %6 %8\n"
- "%60 = OpLoad %6 %8\n"
- "%62 = OpAccessChain %61 %59 %60 %10\n"
- "%63 = OpLoad %30 %62\n"
- "%65 = OpAccessChain %64 %53 %54 %10\n"
- "OpStore %65 %63\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
-
- /*
+
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(isolines, equal_spacing, ccw ) in;\n"
" gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
" out_color = in_color[0];\n"
"}\n";
- */
-
- const string evaluationSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 44\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %13 %20 %29 %38 %41\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpMemberDecorate %11 0 BuiltIn Position\n"
- "OpMemberDecorate %11 1 BuiltIn PointSize\n"
- "OpMemberDecorate %11 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %11 3 BuiltIn CullDistance\n"
- "OpDecorate %11 Block\n"
- "OpMemberDecorate %16 0 BuiltIn Position\n"
- "OpMemberDecorate %16 1 BuiltIn PointSize\n"
- "OpMemberDecorate %16 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %16 3 BuiltIn CullDistance\n"
- "OpDecorate %16 Block\n"
- "OpDecorate %29 BuiltIn TessCoord\n"
- "OpDecorate %38 Location 0\n"
- "OpDecorate %41 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeInt 32 0\n"
- "%9 = OpConstant %8 1\n"
- "%10 = OpTypeArray %6 %9\n"
- "%11 = OpTypeStruct %7 %6 %10 %10\n"
- "%12 = OpTypePointer Output %11\n"
- "%13 = OpVariable %12 Output\n"
- "%14 = OpTypeInt 32 1\n"
- "%15 = OpConstant %14 0\n"
- "%16 = OpTypeStruct %7 %6 %10 %10\n"
- "%17 = OpConstant %8 32\n"
- "%18 = OpTypeArray %16 %17\n"
- "%19 = OpTypePointer Input %18\n"
- "%20 = OpVariable %19 Input\n"
- "%21 = OpTypePointer Input %7\n"
- "%24 = OpConstant %14 1\n"
- "%27 = OpTypeVector %6 3\n"
- "%28 = OpTypePointer Input %27\n"
- "%29 = OpVariable %28 Input\n"
- "%30 = OpConstant %8 0\n"
- "%31 = OpTypePointer Input %6\n"
- "%36 = OpTypePointer Output %7\n"
- "%38 = OpVariable %36 Output\n"
- "%39 = OpTypeArray %7 %17\n"
- "%40 = OpTypePointer Input %39\n"
- "%41 = OpVariable %40 Input\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%22 = OpAccessChain %21 %20 %15 %15\n"
- "%23 = OpLoad %7 %22\n"
- "%25 = OpAccessChain %21 %20 %24 %15\n"
- "%26 = OpLoad %7 %25\n"
- "%32 = OpAccessChain %31 %29 %30\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpCompositeConstruct %7 %33 %33 %33 %33\n"
- "%35 = OpExtInst %7 %1 FMix %23 %26 %34\n"
- "%37 = OpAccessChain %36 %13 %15\n"
- "OpStore %37 %35\n"
- "%42 = OpAccessChain %21 %41 %15\n"
- "%43 = OpLoad %7 %42\n"
- "OpStore %38 %43\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
+
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
}
else
{
else
{
std::ostringstream bdy;
- string color = (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage) ? "out_color[gl_InvocationID].b = 1.0f;\n" : "out_color.b = 1.0f;\n";
+ string color = (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage) ? "out_color[gl_InvocationID].b = 1.0f;\n" : "out_color.b = 1.0f;\n";
switch (caseDef.opType)
{
default:
case OPTYPE_SUBGROUP_MEMORY_BARRIER:
case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
{
- bdy << " tempResult2 = tempBuffer[id];\n"
+ bdy << " tempResult2 = tempBuffer[id];\n"
<< " if (subgroupElect())\n"
<< " {\n"
<< " tempResult = value;\n"
<< " " << color
<< " }\n"
- << " else\n"
+ << " else\n"
<< " {\n"
<< " tempResult = tempBuffer[id];\n"
<< " }\n"
break;
}
case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
- bdy <<"tempResult2 = imageLoad(tempImage, ivec2(id, 0)).x;\n"
+ bdy << " tempResult2 = imageLoad(tempImage, ivec2(id, 0)).x;\n"
<< " if (subgroupElect())\n"
<< " {\n"
<< " tempResult = value;\n"
- << " " << color
+ << " " << color
<< " }\n"
<< " else\n"
<< " {\n"
break;
}
- if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ if (subgroups::SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
{
std::ostringstream fragment;
fragment << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(location = 0) out vec4 out_color;\n"
<< "\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer1\n"
<< "{\n"
<< " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
<< "};\n"
<< "\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer2\n"
<< "{\n"
<< " uint value;\n"
<< "};\n"
- << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(set = 0, binding = 2, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
<< "void main (void)\n"
<< "{\n"
<< " if (gl_HelperInvocation) return;\n"
<< " out_color.g = float(value);\n"
<< " out_color.a = float(tempResult2);\n"
<< "}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment.str()) << buildOptions;
+ programCollection.add("fragment") << glu::FragmentSource(fragment.str());
}
- else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertex;
vertex << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "layout(location = 0) out vec4 out_color;\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer1\n"
<< "{\n"
<< " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
<< "};\n"
<< "\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer2\n"
<< "{\n"
<< " uint value;\n"
<< "};\n"
- << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(set = 0, binding = 2, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
<< "void main (void)\n"
<< "{\n"
<< " uint id = 0;\n"
<< " if (subgroupElect())\n"
<< " {\n"
- << " id = gl_VertexIndex;\n"
+ << " id = gl_VertexID;\n"
<< " }\n"
<< " id = subgroupBroadcastFirst(id);\n"
<< " uint tempResult = 0u;\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out vec4 out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer1\n"
<< "{\n"
<< " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
<< "};\n"
<< "\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer2\n"
<< "{\n"
<< " uint value;\n"
<< "};\n"
- << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(set = 0, binding = 2, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
<< "void main (void)\n"
<< "{\n"
<< " uint id = 0;\n"
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
std::ostringstream evaluationSource;
<< "#extension GL_EXT_tessellation_shader : require\n"
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out vec4 out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer1\n"
<< "{\n"
<< " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
<< "};\n"
<< "\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer2\n"
<< "{\n"
<< " uint value;\n"
<< "};\n"
- << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(set = 0, binding = 2, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
<< "void main (void)\n"
<< "{\n"
<< " uint id = 0;\n"
<< " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
std::ostringstream evaluationSource;
<< "#extension GL_EXT_tessellation_shader : require\n"
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out vec4 out_color[];\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer1\n"
<< "{\n"
<< " uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
<< "};\n"
<< "\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer2\n"
<< "{\n"
<< " uint value;\n"
<< "};\n"
- << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(set = 0, binding = 2, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+ << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(binding = 0, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
<< "void main (void)\n"
<< "{\n"
<< " uint id = 0;\n"
<< " out_color = in_color[0];\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
{
if (OPTYPE_ELECT == caseDef.opType)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (subgroups::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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer1\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
<< " result[offset] = bits.x + bits.y + bits.z + bits.w;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
std::ostringstream vertex;
vertex << "#version 450\n"
<< "#extension GL_KHR_shader_subgroup_basic: enable\n"
- << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
- << "};\n"
- << "layout(set = 0, binding = 4, std430) buffer Buffer2\n"
+ << "} b0;\n"
+ << "layout(binding = 4, std430) buffer Buffer4\n"
<< "{\n"
<< " uint numSubgroupsExecuted;\n"
- << "};\n"
+ << "} b4;\n"
<< "\n"
<< "void main (void)\n"
<< "{\n"
<< " if (subgroupElect())\n"
<< " {\n"
- << " result[gl_VertexIndex] = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
+ << " b0.result[gl_VertexID] = " << ELECTED_VALUE << ";\n"
+ << " atomicAdd(b4.numSubgroupsExecuted, 1);\n"
<< " }\n"
<< " else\n"
<< " {\n"
- << " result[gl_VertexIndex] = " << UNELECTED_VALUE << ";\n"
+ << " b0.result[gl_VertexID] = " << UNELECTED_VALUE << ";\n"
<< " }\n"
<< " float pixelSize = 2.0f/1024.0f;\n"
<< " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- << " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ << " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex.str());
}
{
tesc << "#version 450\n"
<< "#extension GL_KHR_shader_subgroup_basic: enable\n"
<< "layout(vertices=1) out;\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
<< "{\n"
<< " uint result[];\n"
- << "};\n"
- << "layout(set = 0, binding = 5, std430) buffer Buffer2\n"
+ << "} b1;\n"
+ << "layout(binding = 5, std430) buffer Buffer5\n"
<< "{\n"
<< " uint numSubgroupsExecuted;\n"
- << "};\n"
+ << "} b5;\n"
<< "\n"
<< "void main (void)\n"
<< "{\n"
<< " if (subgroupElect())\n"
<< " {\n"
- << " result[gl_PrimitiveID] = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
+ << " b1.result[gl_PrimitiveID] = " << ELECTED_VALUE << ";\n"
+ << " atomicAdd(b5.numSubgroupsExecuted, 1);\n"
<< " }\n"
<< " else\n"
<< " {\n"
- << " result[gl_PrimitiveID] = " << UNELECTED_VALUE << ";\n"
+ << " b1.result[gl_PrimitiveID] = " << UNELECTED_VALUE << ";\n"
<< " }\n"
<< " if (gl_InvocationID == 0)\n"
<< " {\n"
<< " }\n"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc.str());
}
{
tese << "#version 450\n"
<< "#extension GL_KHR_shader_subgroup_basic: enable\n"
<< "layout(isolines) in;\n"
- << "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ << "layout(binding = 2, std430) buffer Buffer2\n"
<< "{\n"
<< " uint result[];\n"
- << "};\n"
- << "layout(set = 0, binding = 6, std430) buffer Buffer2\n"
+ << "} b2;\n"
+ << "layout(binding = 6, std430) buffer Buffer6\n"
<< "{\n"
<< " uint numSubgroupsExecuted;\n"
- << "};\n"
+ << "} b6;\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"
+ << " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = " << ELECTED_VALUE << ";\n"
+ << " atomicAdd(b6.numSubgroupsExecuted, 1);\n"
<< " }\n"
<< " else\n"
<< " {\n"
- << " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = " << UNELECTED_VALUE << ";\n"
+ << " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = " << UNELECTED_VALUE << ";\n"
<< " }\n"
<< " float pixelSize = 2.0f/1024.0f;\n"
<< " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
<< "}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese.str());
}
-
{
std::ostringstream geometry;
geometry << "#version 450\n"
<< "#extension GL_KHR_shader_subgroup_basic: enable\n"
<< "layout(${TOPOLOGY}) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
- << "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ << "layout(binding = 3, std430) buffer Buffer3\n"
<< "{\n"
<< " uint result[];\n"
- << "};\n"
- << "layout(set = 0, binding = 7, std430) buffer Buffer2\n"
+ << "} b3;\n"
+ << "layout(binding = 7, std430) buffer Buffer7\n"
<< "{\n"
<< " uint numSubgroupsExecuted;\n"
- << "};\n"
+ << "} b7;\n"
<< "\n"
<< "void main (void)\n"
<< "{\n"
<< " if (subgroupElect())\n"
<< " {\n"
- << " result[gl_PrimitiveIDIn] = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
+ << " b3.result[gl_PrimitiveIDIn] = " << ELECTED_VALUE << ";\n"
+ << " atomicAdd(b7.numSubgroupsExecuted, 1);\n"
<< " }\n"
<< " else\n"
<< " {\n"
- << " result[gl_PrimitiveIDIn] = " << UNELECTED_VALUE << ";\n"
+ << " b3.result[gl_PrimitiveIDIn] = " << UNELECTED_VALUE << ";\n"
<< " }\n"
<< " gl_Position = gl_in[0].gl_Position;\n"
<< " EmitVertex();\n"
<< " EndPrimitive();\n"
<< "}\n";
- subgroups::addGeometryShadersFromTemplate(geometry.str(), vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry.str(), programCollection);
}
{
fragment << "#version 450\n"
<< "#extension GL_KHR_shader_subgroup_basic: enable\n"
<< "layout(location = 0) out uint data;\n"
- << "layout(set = 0, binding = 8, std430) buffer Buffer\n"
+ << "layout(binding = 8, std430) buffer Buffer8\n"
<< "{\n"
<< " uint numSubgroupsExecuted;\n"
- << "};\n"
+ << "} b8;\n"
<< "void main (void)\n"
<< "{\n"
<< " if (gl_HelperInvocation) return;\n"
<< " if (subgroupElect())\n"
<< " {\n"
<< " data = " << ELECTED_VALUE << ";\n"
- << " atomicAdd(numSubgroupsExecuted, 1);\n"
+ << " atomicAdd(b8.numSubgroupsExecuted, 1);\n"
<< " }\n"
<< " else\n"
<< " {\n"
<< " data = " << UNELECTED_VALUE << ";\n"
<< " }\n"
<< "}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment.str())<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment.str());
}
subgroups::addNoSubgroupShader(programCollection);
}
case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
bdy << " if (subgroupElect())\n"
<< " {\n"
- << " tempBuffer[id] = value;\n"
+ << " b${SSBO1}.tempBuffer[id] = b${SSBO2}.value;\n"
<< " }\n"
<< " " << getOpTypeName(caseDef.opType) << "();\n"
- << " tempResult = tempBuffer[id];\n";
+ << " tempResult = b${SSBO1}.tempBuffer[id];\n";
break;
case OPTYPE_SUBGROUP_MEMORY_BARRIER_SHARED:
bdy << " if (subgroupElect())\n"
<< " {\n"
- << " tempShared[localId] = value;\n"
+ << " tempShared[localId] = b${SSBO2}.value;\n"
<< " }\n"
<< " subgroupMemoryBarrierShared();\n"
<< " tempResult = tempShared[localId];\n";
case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
bdy << " if (subgroupElect())\n"
<< " {\n"
- << " imageStore(tempImage, ivec2(id, 0), ivec4(value));\n"
+ << " imageStore(tempImage${IMG1}, ivec2(id, 0), ivec4(b${SSBO2}.value));\n"
<< " }\n"
<< " subgroupMemoryBarrierImage();\n"
- << " tempResult = imageLoad(tempImage, ivec2(id, 0)).x;\n";
+ << " tempResult = imageLoad(tempImage${IMG1}, ivec2(id, 0)).x;\n";
break;
}
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ tcu::StringTemplate bdyTemplate(bdy.str());
+
+ if (subgroups::SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
std::ostringstream src;
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "1"));
+ bufferNameMapping.insert(pair<string, string>("SSBO2", "2"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "0"));
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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
- << "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "} b0;\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
<< "{\n"
<< " uint tempBuffer[];\n"
- << "};\n"
- << "layout(set = 0, binding = 2, std430) buffer Buffer3\n"
+ << "} b1;\n"
+ << "layout(binding = 2, std430) buffer Buffer2\n"
<< "{\n"
<< " uint value;\n"
- << "};\n"
- << "layout(set = 0, binding = 3, r32ui) uniform uimage2D tempImage;\n"
+ << "} b2;\n"
+ << "layout(binding = 0, r32ui) uniform uimage2D tempImage0;\n"
<< "shared uint tempShared[gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z];\n"
<< "\n"
<< "void main (void)\n"
"gl_WorkGroupID.z) + gl_WorkGroupID.y) + "
"gl_WorkGroupID.x + localId;\n"
<< " uint tempResult = 0;\n"
- << bdy.str()
- << " result[offset] = tempResult;\n"
+ << bdyTemplate.specialize(bufferNameMapping)
+ << " b0.result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "4"));
+ bufferNameMapping.insert(pair<string, string>("SSBO2", "6"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "0"));
+
const string vertex =
"#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"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) buffer Buffer2\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) buffer Buffer4\n"
"{\n"
" uint tempBuffer[];\n"
- "};\n"
- "layout(set = 0, binding = 5, std430) buffer Buffer3\n"
+ "} b4;\n"
+ "layout(binding = 5, std430) buffer Buffer5\n"
"{\n"
" uint subgroupID;\n"
- "};\n"
- "layout(set = 0, binding = 6, std430) buffer Buffer4\n"
+ "} b5;\n"
+ "layout(binding = 6, std430) buffer Buffer6\n"
"{\n"
" uint value;\n"
- "};\n"
- "layout(set = 0, binding = 7, r32ui) uniform uimage2D tempImage;\n"
+ "} b6;\n"
+ "layout(binding = 0, r32ui) uniform uimage2D tempImage0;\n"
"void main (void)\n"
"{\n"
" uint id = 0;\n"
" if (subgroupElect())\n"
" {\n"
- " id = atomicAdd(subgroupID, 1);\n"
+ " id = atomicAdd(b5.subgroupID, 1);\n"
" }\n"
" id = subgroupBroadcastFirst(id);\n"
" uint localId = id;\n"
" uint tempResult = 0;\n"
- + bdy.str() +
- " result[gl_VertexIndex] = tempResult;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "7"));
+ bufferNameMapping.insert(pair<string, string>("SSBO2", "9"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "1"));
+
const string tesc =
"#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 = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 8, std430) buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 7, std430) buffer Buffer7\n"
"{\n"
" uint tempBuffer[];\n"
- "};\n"
- "layout(set = 0, binding = 9, std430) buffer Buffer3\n"
+ "} b7;\n"
+ "layout(binding = 8, std430) buffer Buffer8\n"
"{\n"
" uint subgroupID;\n"
- "};\n"
- "layout(set = 0, binding = 10, std430) buffer Buffer4\n"
+ "} b8;\n"
+ "layout(binding = 9, std430) buffer Buffer9\n"
"{\n"
" uint value;\n"
- "};\n"
- "layout(set = 0, binding = 11, r32ui) uniform uimage2D tempImage;\n"
+ "} b9;\n"
+ "layout(binding = 1, r32ui) uniform uimage2D tempImage1;\n"
"void main (void)\n"
"{\n"
" uint id = 0;\n"
" if (subgroupElect())\n"
" {\n"
- " id = atomicAdd(subgroupID, 1);\n"
+ " id = atomicAdd(b8.subgroupID, 1);\n"
" }\n"
" id = subgroupBroadcastFirst(id);\n"
" uint localId = id;\n"
" uint tempResult = 0;\n"
- + bdy.str() +
- " result[gl_PrimitiveID] = tempResult;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "10"));
+ bufferNameMapping.insert(pair<string, string>("SSBO2", "12"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "2"));
+
const string tese =
"#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 = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 12, std430) buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 10, std430) buffer Buffer10\n"
"{\n"
" uint tempBuffer[];\n"
- "};\n"
- "layout(set = 0, binding = 13, std430) buffer Buffer3\n"
+ "} b10;\n"
+ "layout(binding = 11, std430) buffer Buffer11\n"
"{\n"
" uint subgroupID;\n"
- "};\n"
- "layout(set = 0, binding = 14, std430) buffer Buffer4\n"
+ "} b11;\n"
+ "layout(binding = 12, std430) buffer Buffer12\n"
"{\n"
" uint value;\n"
- "};\n"
- "layout(set = 0, binding = 15, r32ui) uniform uimage2D tempImage;\n"
+ "} b12;\n"
+ "layout(binding = 2, r32ui) uniform uimage2D tempImage2;\n"
"void main (void)\n"
"{\n"
" uint id = 0;\n"
" if (subgroupElect())\n"
" {\n"
- " id = atomicAdd(subgroupID, 1);\n"
+ " id = atomicAdd(b11.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"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
-
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "13"));
+ bufferNameMapping.insert(pair<string, string>("SSBO2", "15"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "3"));
+
const string geometry =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 16, std430) buffer Buffer2\n"
+ "} b3;\n"
+ "layout(binding = 13, std430) buffer Buffer13\n"
"{\n"
" uint tempBuffer[];\n"
- "};\n"
- "layout(set = 0, binding = 17, std430) buffer Buffer3\n"
+ "} b13;\n"
+ "layout(binding = 14, std430) buffer Buffer14\n"
"{\n"
" uint subgroupID;\n"
- "};\n"
- "layout(set = 0, binding = 18, std430) buffer Buffer4\n"
+ "} b14;\n"
+ "layout(binding = 15, std430) buffer Buffer15\n"
"{\n"
" uint value;\n"
- "};\n"
- "layout(set = 0, binding = 19, r32ui) uniform uimage2D tempImage;\n"
+ "} b15;\n"
+ "layout(binding = 3, r32ui) uniform uimage2D tempImage3;\n"
"void main (void)\n"
"{\n"
" uint id = 0;\n"
" if (subgroupElect())\n"
" {\n"
- " id = atomicAdd(subgroupID, 1);\n"
+ " id = atomicAdd(b14.subgroupID, 1);\n"
" }\n"
" id = subgroupBroadcastFirst(id);\n"
" uint localId = id;\n"
" uint tempResult = 0;\n"
- + bdy.str() +
- " result[gl_PrimitiveIDIn] = tempResult;\n"
+ + bdyTemplate.specialize(bufferNameMapping) +
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "16"));
+ bufferNameMapping.insert(pair<string, string>("SSBO2", "18"));
+ bufferNameMapping.insert(pair<string, string>("IMG1", "4"));
+
const string fragment =
"#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 = 20, std430) buffer Buffer1\n"
+ "layout(binding = 16, std430) buffer Buffer16\n"
"{\n"
" uint tempBuffer[];\n"
- "};\n"
- "layout(set = 0, binding = 21, std430) buffer Buffer2\n"
+ "} b16;\n"
+ "layout(binding = 17, std430) buffer Buffer17\n"
"{\n"
" uint subgroupID;\n"
- "};\n"
- "layout(set = 0, binding = 22, std430) buffer Buffer3\n"
+ "} b17;\n"
+ "layout(binding = 18, std430) buffer Buffer18\n"
"{\n"
" uint value;\n"
- "};\n"
- "layout(set = 0, binding = 23, r32ui) uniform uimage2D tempImage;\n"
+ "} b18;\n"
+ "layout(binding = 4, r32ui) uniform uimage2D tempImage4;\n"
"void main (void)\n"
"{\n"
" if (gl_HelperInvocation) return;\n"
" uint id = 0;\n"
" if (subgroupElect())\n"
" {\n"
- " id = atomicAdd(subgroupID, 1);\n"
+ " id = atomicAdd(b17.subgroupID, 1);\n"
" }\n"
" id = subgroupBroadcastFirst(id);\n"
" uint localId = id;\n"
" uint tempResult = 0;\n"
- + bdy.str() +
+ + bdyTemplate.specialize(bufferNameMapping) +
" result = tempResult;\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
}
}
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BASIC_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BASIC_BIT))
{
return tcu::TestStatus::fail(
"Subgroup feature " +
- subgroups::getSubgroupFeatureName(VK_SUBGROUP_FEATURE_BASIC_BIT) +
+ subgroups::getSubgroupFeatureName(subgroups::SUBGROUP_FEATURE_BASIC_BIT) +
" is a required capability!");
}
- if (OPTYPE_ELECT != caseDef.opType && VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage)
+ if (OPTYPE_ELECT != caseDef.opType && subgroups::SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage)
{
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BALLOT_BIT))
{
TCU_THROW(NotSupportedError, "Subgroup basic operation non-compute stage test required that ballot operations are supported!");
}
const deUint32 inputDatasCount = OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? 3u : 2u;
std::vector<subgroups::SSBOData> inputDatas (inputDatasCount);
- inputDatas[0].format = VK_FORMAT_R32_UINT;
+ inputDatas[0].format = subgroups::FORMAT_R32_UINT;
inputDatas[0].numElements = SHADER_BUFFER_SIZE/4ull;
inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputDatas[0].binding = 0u;
- inputDatas[1].format = VK_FORMAT_R32_UINT;
+ inputDatas[1].format = subgroups::FORMAT_R32_UINT;
inputDatas[1].numElements = 1ull;
inputDatas[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputDatas[1].binding = 1u;
if(OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType )
{
- inputDatas[2].format = VK_FORMAT_R32_UINT;
+ inputDatas[2].format = subgroups::FORMAT_R32_UINT;
inputDatas[2].numElements = SHADER_BUFFER_SIZE;
inputDatas[2].initializeType = subgroups::SSBOData::InitializeNone;
inputDatas[2].isImage = true;
+ inputDatas[2].binding = 0u;
}
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (subgroups::SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
if (OPTYPE_ELECT == caseDef.opType)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO);
+ return subgroups::makeVertexFrameBufferTest(context, subgroups::FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO);
else
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkVertexPipelineStagesSubgroupBarriersNoSSBO);
+ return subgroups::makeVertexFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkVertexPipelineStagesSubgroupBarriersNoSSBO);
}
- else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
{
- return subgroups::makeFragmentFrameBufferTest(context, VK_FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkFragmentSubgroupBarriersNoSSBO);
+ return subgroups::makeFragmentFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkFragmentSubgroupBarriersNoSSBO);
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (subgroups::SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
if (OPTYPE_ELECT == caseDef.opType)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO);
+ return subgroups::makeGeometryFrameBufferTest(context, subgroups::FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO);
else
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkVertexPipelineStagesSubgroupBarriersNoSSBO);
+ return subgroups::makeGeometryFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount, checkVertexPipelineStagesSubgroupBarriersNoSSBO);
}
if (OPTYPE_ELECT == caseDef.opType)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO, caseDef.shaderStage);
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, subgroups::FORMAT_R32G32_SFLOAT, DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO, caseDef.shaderStage);
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount,
- (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)? checkVertexPipelineStagesSubgroupBarriersNoSSBO : checkTessellationEvaluationSubgroupBarriersNoSSBO,
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, subgroups::FORMAT_R32G32B32A32_SFLOAT, &inputDatas[0], inputDatasCount,
+ (subgroups::SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)? checkVertexPipelineStagesSubgroupBarriersNoSSBO : checkTessellationEvaluationSubgroupBarriersNoSSBO,
caseDef.shaderStage);
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BASIC_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BASIC_BIT))
{
return tcu::TestStatus::fail(
"Subgroup feature " +
- subgroups::getSubgroupFeatureName(VK_SUBGROUP_FEATURE_BASIC_BIT) +
+ subgroups::getSubgroupFeatureName(subgroups::SUBGROUP_FEATURE_BASIC_BIT) +
" is a required capability!");
}
- if (OPTYPE_ELECT != caseDef.opType && VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage)
+ if (OPTYPE_ELECT != caseDef.opType && subgroups::SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage)
{
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_BALLOT_BIT))
{
TCU_THROW(NotSupportedError, "Subgroup basic operation non-compute stage test required that ballot operations are supported!");
}
}
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (subgroups::SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
if (OPTYPE_ELECT == caseDef.opType)
{
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkComputeSubgroupElect);
+ return subgroups::makeComputeTest(context, subgroups::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].format = subgroups::FORMAT_R32_UINT;
inputDatas[0].numElements = SHADER_BUFFER_SIZE;
inputDatas[0].initializeType = subgroups::SSBOData::InitializeNone;
+ inputDatas[0].binding = 1u;
- inputDatas[1].format = VK_FORMAT_R32_UINT;
+ inputDatas[1].format = subgroups::FORMAT_R32_UINT;
inputDatas[1].numElements = 1;
inputDatas[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputDatas[1].binding = 2u;
- inputDatas[2].format = VK_FORMAT_R32_UINT;
+ inputDatas[2].format = subgroups::FORMAT_R32_UINT;
inputDatas[2].numElements = SHADER_BUFFER_SIZE;
inputDatas[2].initializeType = subgroups::SSBOData::InitializeNone;
inputDatas[2].isImage = true;
+ inputDatas[2].binding = 0u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, inputDatas, inputDatasCount, checkComputeSubgroupBarriers);
+ return subgroups::makeComputeTest(context, subgroups::FORMAT_R32_UINT, inputDatas, inputDatasCount, checkComputeSubgroupBarriers);
}
}
else
TCU_THROW(NotSupportedError, "Subgroup basic operation require that the fragment stage be able to write to SSBOs!");
}
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ subgroups::ShaderStageFlags stages = (subgroups::ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if ( subgroups::SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & subgroups::SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = subgroups::SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((subgroups::ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
if (OPTYPE_ELECT == caseDef.opType)
const deUint32 inputCount = 5u;
subgroups::SSBOData inputData[inputCount];
- inputData[0].format = VK_FORMAT_R32_UINT;
+ inputData[0].format = subgroups::FORMAT_R32_UINT;
inputData[0].numElements = 1;
inputData[0].initializeType = subgroups::SSBOData::InitializeZero;
inputData[0].binding = 4u;
- inputData[0].stages = VK_SHADER_STAGE_VERTEX_BIT;
+ inputData[0].stages = subgroups::SHADER_STAGE_VERTEX_BIT;
- inputData[1].format = VK_FORMAT_R32_UINT;
+ inputData[1].format = subgroups::FORMAT_R32_UINT;
inputData[1].numElements = 1;
inputData[1].initializeType = subgroups::SSBOData::InitializeZero;
inputData[1].binding = 5u;
- inputData[1].stages = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
+ inputData[1].stages = subgroups::SHADER_STAGE_TESS_CONTROL_BIT;
- inputData[2].format = VK_FORMAT_R32_UINT;
+ inputData[2].format = subgroups::FORMAT_R32_UINT;
inputData[2].numElements = 1;
inputData[2].initializeType = subgroups::SSBOData::InitializeZero;
inputData[2].binding = 6u;
- inputData[2].stages = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
+ inputData[2].stages = subgroups::SHADER_STAGE_TESS_EVALUATION_BIT;
- inputData[3].format = VK_FORMAT_R32_UINT;
+ inputData[3].format = subgroups::FORMAT_R32_UINT;
inputData[3].numElements = 1;
inputData[3].initializeType = subgroups::SSBOData::InitializeZero;
inputData[3].binding = 7u;
- inputData[3].stages = VK_SHADER_STAGE_GEOMETRY_BIT;
+ inputData[3].stages = subgroups::SHADER_STAGE_GEOMETRY_BIT;
- inputData[4].format = VK_FORMAT_R32_UINT;
+ inputData[4].format = subgroups::FORMAT_R32_UINT;
inputData[4].numElements = 1;
inputData[4].initializeType = subgroups::SSBOData::InitializeZero;
inputData[4].binding = 8u;
- inputData[4].stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ inputData[4].stages = subgroups::SHADER_STAGE_FRAGMENT_BIT;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, inputData, inputCount, checkVertexPipelineStagesSubgroupElect, stages);
+ return subgroups::allStages(context, subgroups::FORMAT_R32_UINT, inputData, inputCount, checkVertexPipelineStagesSubgroupElect, stages);
}
else
{
- const VkShaderStageFlagBits stagesBits[] =
+ const subgroups::ShaderStageFlags stagesBits[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
- VK_SHADER_STAGE_FRAGMENT_BIT,
+ subgroups::SHADER_STAGE_VERTEX_BIT,
+ subgroups::SHADER_STAGE_TESS_CONTROL_BIT,
+ subgroups::SHADER_STAGE_TESS_EVALUATION_BIT,
+ subgroups::SHADER_STAGE_GEOMETRY_BIT,
+ subgroups::SHADER_STAGE_FRAGMENT_BIT,
};
const deUint32 inputDatasCount = DE_LENGTH_OF_ARRAY(stagesBits) * 4u;
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stagesBits); ++ndx)
{
const deUint32 index = ndx*4;
- inputDatas[index].format = VK_FORMAT_R32_UINT;
+ const deUint32 ssboIndex = ndx*3;
+ const deUint32 imgIndex = ndx;
+ inputDatas[index].format = subgroups::FORMAT_R32_UINT;
inputDatas[index].numElements = SHADER_BUFFER_SIZE;
inputDatas[index].initializeType = subgroups::SSBOData::InitializeNonZero;
- inputDatas[index].binding = index + 4u;
+ inputDatas[index].binding = ssboIndex + 4u;
inputDatas[index].stages = stagesBits[ndx];
- inputDatas[index + 1].format = VK_FORMAT_R32_UINT;
+ inputDatas[index + 1].format = subgroups::FORMAT_R32_UINT;
inputDatas[index + 1].numElements = 1;
inputDatas[index + 1].initializeType = subgroups::SSBOData::InitializeZero;
- inputDatas[index + 1].binding = index + 5u;
+ inputDatas[index + 1].binding = ssboIndex + 5u;
inputDatas[index + 1].stages = stagesBits[ndx];
- inputDatas[index + 2].format = VK_FORMAT_R32_UINT;
+ inputDatas[index + 2].format = subgroups::FORMAT_R32_UINT;
inputDatas[index + 2].numElements = 1;
inputDatas[index + 2].initializeType = subgroups::SSBOData::InitializeNonZero;
- inputDatas[index + 2].binding = index + 6u;
+ inputDatas[index + 2].binding = ssboIndex + 6u;
inputDatas[index + 2].stages = stagesBits[ndx];
- inputDatas[index + 3].format = VK_FORMAT_R32_UINT;
+ inputDatas[index + 3].format = subgroups::FORMAT_R32_UINT;
inputDatas[index + 3].numElements = SHADER_BUFFER_SIZE;
inputDatas[index + 3].initializeType = subgroups::SSBOData::InitializeNone;
inputDatas[index + 3].isImage = true;
- inputDatas[index + 3].binding = index + 7u;
+ inputDatas[index + 3].binding = imgIndex;
inputDatas[index + 3].stages = stagesBits[ndx];
}
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, inputDatas, inputDatasCount, checkVertexPipelineStagesSubgroupBarriers, stages);
+ return subgroups::allStages(context, subgroups::FORMAT_R32_UINT, inputDatas, inputDatasCount, checkVertexPipelineStagesSubgroupBarriers, stages);
}
}
}
}
-namespace vkt
+deqp::TestCaseGroup* createSubgroupsBasicTests(deqp::Context& testCtx)
{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
-{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup basic category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup basic category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup basic category tests: framebuffer"));
-
- const VkShaderStageFlags stages[] =
+ const subgroups::ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_FRAGMENT_BIT,
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_FRAGMENT_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
const std::string op = de::toLower(getOpTypeName(opTypeIndex));
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT};
- addFunctionCaseWithPrograms(computeGroup.get(), op, "",
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), op, "",
supportedCheck, initPrograms, test, caseDef);
}
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS};
- addFunctionCaseWithPrograms(graphicGroup.get(),
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
op, "",
supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 1; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex]};
- addFunctionCaseWithPrograms(framebufferGroup.get(),
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
op + "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDefFrag = {opTypeIndex, stages[stageIndex]};
- addFunctionCaseWithPrograms(framebufferGroup.get(),
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
op + "_" + getShaderStageName(caseDefFrag.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDefFrag);
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "basic", "Subgroup basic category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSBASICTESTS_HPP
-#define _VKTSUBGROUPSBASICTESTS_HPP
+#ifndef _GLCSUBGROUPSBASICTESTS_HPP
+#define _GLCSUBGROUPSBASICTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsBasicTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSBASICTESTS_HPP
+#endif // _GLCSUBGROUPSBASICTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsBuiltinMaskVarTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsBuiltinMaskVarTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-namespace vkt
+namespace glc
{
namespace subgroups
{
struct CaseDefinition
{
std::string varName;
- VkShaderStageFlags shaderStage;
+ ShaderStageFlags shaderStage;
};
}
-std::string subgroupComparison (const CaseDefinition& caseDef)
-{
- if ("gl_SubgroupEqMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%56 = OpIEqual %11 %53 %55\n";
- else
- return "%38 = OpIEqual %16 %35 %37\n";
- }
- else if ("gl_SubgroupGeMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%56 = OpUGreaterThanEqual %11 %53 %55\n";
- else
- return "%38 = OpUGreaterThanEqual %16 %35 %37\n";
- }
- else if ("gl_SubgroupGtMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%56 = OpUGreaterThan %11 %53 %55\n";
- else
- return "%38 = OpUGreaterThan %16 %35 %37\n";
- }
- else if ("gl_SubgroupLeMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%56 = OpULessThanEqual %11 %53 %55\n";
- else
- return "%38 = OpULessThanEqual %16 %35 %37\n";
- }
- else if ("gl_SubgroupLtMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%56 = OpULessThan %11 %53 %55\n";
- else
- return "%38 = OpULessThan %16 %35 %37\n";
- }
- return "";
-}
-
-std::string varSubgroupMask (const CaseDefinition& caseDef)
-{
- if ("gl_SubgroupEqMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %40 BuiltIn SubgroupEqMask\n";
- else
- return "OpDecorate %22 BuiltIn SubgroupEqMask\n";
- }
- else if ("gl_SubgroupGeMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %40 BuiltIn SubgroupGeMask\n";
- else
- return "OpDecorate %22 BuiltIn SubgroupGeMask\n";
- }
- else if ("gl_SubgroupGtMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %40 BuiltIn SubgroupGtMask\n";
- else
- return "OpDecorate %22 BuiltIn SubgroupGtMask\n";
- }
- else if ("gl_SubgroupLeMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %40 BuiltIn SubgroupLeMask\n";
- else
- return "OpDecorate %22 BuiltIn SubgroupLeMask\n";
- }
- else if ("gl_SubgroupLtMask" == caseDef.varName)
- {
- if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %40 BuiltIn SubgroupLtMask\n";
- else
- return "OpDecorate %22 BuiltIn SubgroupLtMask\n";
- }
- return "";
-}
-
std::string subgroupMask (const CaseDefinition& caseDef)
{
std::ostringstream bdy;
void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::SpirVAsmBuildOptions buildOptionsSpr (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3);
- const string comparison = subgroupComparison(caseDef);
- const string mask = varSubgroupMask(caseDef);
-
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
- /*
- const string bdy = subgroupMask(caseDef);
- const string vertex =
+ const string bdy = subgroupMask(caseDef);
+ const string vertexGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(location = 0) out float out_color;\n"
" gl_Position = in_position;\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
- */
-
- const string vertex =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 123\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %22 %32 %36 %107 %114 %117\n"
- + mask +
- "OpDecorate %32 RelaxedPrecision\n"
- "OpDecorate %32 BuiltIn SubgroupSize\n"
- "OpDecorate %33 RelaxedPrecision\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %37 RelaxedPrecision\n"
- "OpDecorate %107 Location 0\n"
- "OpMemberDecorate %112 0 BuiltIn Position\n"
- "OpMemberDecorate %112 1 BuiltIn PointSize\n"
- "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
- "OpDecorate %112 Block\n"
- "OpDecorate %117 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 1\n"
- "%12 = OpConstant %6 0\n"
- "%13 = OpTypeVector %6 4\n"
- "%14 = OpTypePointer Function %13\n"
- "%16 = OpTypeBool\n"
- "%17 = OpConstantTrue %16\n"
- "%18 = OpConstant %6 3\n"
- "%21 = OpTypePointer Input %13\n"
- "%22 = OpVariable %21 Input\n"
- "%31 = OpTypePointer Input %6\n"
- "%32 = OpVariable %31 Input\n"
- "%36 = OpVariable %31 Input\n"
- "%46 = OpTypeInt 32 1\n"
- "%47 = OpConstant %46 1\n"
- "%56 = OpConstant %6 32\n"
- "%76 = OpConstant %6 2\n"
- "%105 = OpTypeFloat 32\n"
- "%106 = OpTypePointer Output %105\n"
- "%107 = OpVariable %106 Output\n"
- "%110 = OpTypeVector %105 4\n"
- "%111 = OpTypeArray %105 %9\n"
- "%112 = OpTypeStruct %110 %105 %111 %111\n"
- "%113 = OpTypePointer Output %112\n"
- "%114 = OpVariable %113 Output\n"
- "%115 = OpConstant %46 0\n"
- "%116 = OpTypePointer Input %110\n"
- "%117 = OpVariable %116 Input\n"
- "%119 = OpTypePointer Output %110\n"
- "%121 = OpConstant %105 1\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%10 = OpVariable %7 Function\n"
- "%11 = OpVariable %7 Function\n"
- "%15 = OpVariable %14 Function\n"
- "%20 = OpVariable %14 Function\n"
- "%24 = OpVariable %7 Function\n"
- "%49 = OpVariable %7 Function\n"
- "OpStore %8 %9\n"
- "OpStore %10 %9\n"
- "OpStore %11 %12\n"
- "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
- "OpStore %15 %19\n"
- "%23 = OpLoad %13 %22\n"
- "OpStore %20 %23\n"
- "OpStore %24 %12\n"
- "OpBranch %25\n"
- "%25 = OpLabel\n"
- "OpLoopMerge %27 %28 None\n"
- "OpBranch %29\n"
- "%29 = OpLabel\n"
- "%30 = OpLoad %6 %24\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpULessThan %16 %30 %33\n"
- "OpBranchConditional %34 %26 %27\n"
- "%26 = OpLabel\n"
- "%35 = OpLoad %6 %24\n"
- "%37 = OpLoad %6 %36\n"
- + comparison +
- "%39 = OpLoad %13 %20\n"
- "%40 = OpLoad %6 %24\n"
- "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
- "%42 = OpLogicalNotEqual %16 %38 %41\n"
- "OpSelectionMerge %44 None\n"
- "OpBranchConditional %42 %43 %44\n"
- "%43 = OpLabel\n"
- "OpStore %8 %12\n"
- "OpBranch %44\n"
- "%44 = OpLabel\n"
- "OpBranch %28\n"
- "%28 = OpLabel\n"
- "%45 = OpLoad %6 %24\n"
- "%48 = OpIAdd %6 %45 %47\n"
- "OpStore %24 %48\n"
- "OpBranch %25\n"
- "%27 = OpLabel\n"
- "OpStore %49 %12\n"
- "OpBranch %50\n"
- "%50 = OpLabel\n"
- "OpLoopMerge %52 %53 None\n"
- "OpBranch %54\n"
- "%54 = OpLabel\n"
- "%55 = OpLoad %6 %49\n"
- "%57 = OpULessThan %16 %55 %56\n"
- "OpBranchConditional %57 %51 %52\n"
- "%51 = OpLabel\n"
- "%58 = OpAccessChain %7 %20 %12\n"
- "%59 = OpLoad %6 %58\n"
- "%60 = OpLoad %6 %10\n"
- "%61 = OpBitwiseAnd %6 %59 %60\n"
- "%62 = OpUGreaterThan %16 %61 %12\n"
- "OpSelectionMerge %64 None\n"
- "OpBranchConditional %62 %63 %64\n"
- "%63 = OpLabel\n"
- "%65 = OpLoad %6 %11\n"
- "%66 = OpIAdd %6 %65 %47\n"
- "OpStore %11 %66\n"
- "OpBranch %64\n"
- "%64 = OpLabel\n"
- "%67 = OpAccessChain %7 %20 %9\n"
- "%68 = OpLoad %6 %67\n"
- "%69 = OpLoad %6 %10\n"
- "%70 = OpBitwiseAnd %6 %68 %69\n"
- "%71 = OpUGreaterThan %16 %70 %12\n"
- "OpSelectionMerge %73 None\n"
- "OpBranchConditional %71 %72 %73\n"
- "%72 = OpLabel\n"
- "%74 = OpLoad %6 %11\n"
- "%75 = OpIAdd %6 %74 %47\n"
- "OpStore %11 %75\n"
- "OpBranch %73\n"
- "%73 = OpLabel\n"
- "%77 = OpAccessChain %7 %20 %76\n"
- "%78 = OpLoad %6 %77\n"
- "%79 = OpLoad %6 %10\n"
- "%80 = OpBitwiseAnd %6 %78 %79\n"
- "%81 = OpUGreaterThan %16 %80 %12\n"
- "OpSelectionMerge %83 None\n"
- "OpBranchConditional %81 %82 %83\n"
- "%82 = OpLabel\n"
- "%84 = OpLoad %6 %11\n"
- "%85 = OpIAdd %6 %84 %47\n"
- "OpStore %11 %85\n"
- "OpBranch %83\n"
- "%83 = OpLabel\n"
- "%86 = OpAccessChain %7 %20 %18\n"
- "%87 = OpLoad %6 %86\n"
- "%88 = OpLoad %6 %10\n"
- "%89 = OpBitwiseAnd %6 %87 %88\n"
- "%90 = OpUGreaterThan %16 %89 %12\n"
- "OpSelectionMerge %92 None\n"
- "OpBranchConditional %90 %91 %92\n"
- "%91 = OpLabel\n"
- "%93 = OpLoad %6 %11\n"
- "%94 = OpIAdd %6 %93 %47\n"
- "OpStore %11 %94\n"
- "OpBranch %92\n"
- "%92 = OpLabel\n"
- "%95 = OpLoad %6 %10\n"
- "%96 = OpShiftLeftLogical %6 %95 %47\n"
- "OpStore %10 %96\n"
- "OpBranch %53\n"
- "%53 = OpLabel\n"
- "%97 = OpLoad %6 %49\n"
- "%98 = OpIAdd %6 %97 %47\n"
- "OpStore %49 %98\n"
- "OpBranch %50\n"
- "%52 = OpLabel\n"
- "%99 = OpLoad %13 %20\n"
- "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
- "%101 = OpLoad %6 %11\n"
- "%102 = OpINotEqual %16 %100 %101\n"
- "OpSelectionMerge %104 None\n"
- "OpBranchConditional %102 %103 %104\n"
- "%103 = OpLabel\n"
- "OpStore %8 %12\n"
- "OpBranch %104\n"
- "%104 = OpLabel\n"
- "%108 = OpLoad %6 %8\n"
- "%109 = OpConvertUToF %105 %108\n"
- "OpStore %107 %109\n"
- "%118 = OpLoad %110 %117\n"
- "%120 = OpAccessChain %119 %114 %115\n"
- "OpStore %120 %118\n"
- "%122 = OpAccessChain %106 %114 %47\n"
- "OpStore %122 %121\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("vert") << vertex << buildOptionsSpr;
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
- /*
- const string bdy = subgroupMask(caseDef);
- const string evaluationSource =
+ const string bdy = subgroupMask(caseDef);
+ const string evaluationSourceGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
" out_color = float(tempResult);\n"
" gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
- */
- const string evaluationSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 136\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %22 %32 %36 %107 %114 %120 %128\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- + mask +
- "OpDecorate %32 RelaxedPrecision\n"
- "OpDecorate %32 BuiltIn SubgroupSize\n"
- "OpDecorate %33 RelaxedPrecision\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %37 RelaxedPrecision\n"
- "OpDecorate %107 Location 0\n"
- "OpMemberDecorate %112 0 BuiltIn Position\n"
- "OpMemberDecorate %112 1 BuiltIn PointSize\n"
- "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
- "OpDecorate %112 Block\n"
- "OpMemberDecorate %116 0 BuiltIn Position\n"
- "OpMemberDecorate %116 1 BuiltIn PointSize\n"
- "OpMemberDecorate %116 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %116 3 BuiltIn CullDistance\n"
- "OpDecorate %116 Block\n"
- "OpDecorate %128 BuiltIn TessCoord\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 1\n"
- "%12 = OpConstant %6 0\n"
- "%13 = OpTypeVector %6 4\n"
- "%14 = OpTypePointer Function %13\n"
- "%16 = OpTypeBool\n"
- "%17 = OpConstantTrue %16\n"
- "%18 = OpConstant %6 3\n"
- "%21 = OpTypePointer Input %13\n"
- "%22 = OpVariable %21 Input\n"
- "%31 = OpTypePointer Input %6\n"
- "%32 = OpVariable %31 Input\n"
- "%36 = OpVariable %31 Input\n"
- "%46 = OpTypeInt 32 1\n"
- "%47 = OpConstant %46 1\n"
- "%56 = OpConstant %6 32\n"
- "%76 = OpConstant %6 2\n"
- "%105 = OpTypeFloat 32\n"
- "%106 = OpTypePointer Output %105\n"
- "%107 = OpVariable %106 Output\n"
- "%110 = OpTypeVector %105 4\n"
- "%111 = OpTypeArray %105 %9\n"
- "%112 = OpTypeStruct %110 %105 %111 %111\n"
- "%113 = OpTypePointer Output %112\n"
- "%114 = OpVariable %113 Output\n"
- "%115 = OpConstant %46 0\n"
- "%116 = OpTypeStruct %110 %105 %111 %111\n"
- "%117 = OpConstant %6 32\n"
- "%118 = OpTypeArray %116 %117\n"
- "%119 = OpTypePointer Input %118\n"
- "%120 = OpVariable %119 Input\n"
- "%121 = OpTypePointer Input %110\n"
- "%126 = OpTypeVector %105 3\n"
- "%127 = OpTypePointer Input %126\n"
- "%128 = OpVariable %127 Input\n"
- "%129 = OpTypePointer Input %105\n"
- "%134 = OpTypePointer Output %110\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%10 = OpVariable %7 Function\n"
- "%11 = OpVariable %7 Function\n"
- "%15 = OpVariable %14 Function\n"
- "%20 = OpVariable %14 Function\n"
- "%24 = OpVariable %7 Function\n"
- "%49 = OpVariable %7 Function\n"
- "OpStore %8 %9\n"
- "OpStore %10 %9\n"
- "OpStore %11 %12\n"
- "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
- "OpStore %15 %19\n"
- "%23 = OpLoad %13 %22\n"
- "OpStore %20 %23\n"
- "OpStore %24 %12\n"
- "OpBranch %25\n"
- "%25 = OpLabel\n"
- "OpLoopMerge %27 %28 None\n"
- "OpBranch %29\n"
- "%29 = OpLabel\n"
- "%30 = OpLoad %6 %24\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpULessThan %16 %30 %33\n"
- "OpBranchConditional %34 %26 %27\n"
- "%26 = OpLabel\n"
- "%35 = OpLoad %6 %24\n"
- "%37 = OpLoad %6 %36\n"
- + comparison +
- "%39 = OpLoad %13 %20\n"
- "%40 = OpLoad %6 %24\n"
- "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
- "%42 = OpLogicalNotEqual %16 %38 %41\n"
- "OpSelectionMerge %44 None\n"
- "OpBranchConditional %42 %43 %44\n"
- "%43 = OpLabel\n"
- "OpStore %8 %12\n"
- "OpBranch %44\n"
- "%44 = OpLabel\n"
- "OpBranch %28\n"
- "%28 = OpLabel\n"
- "%45 = OpLoad %6 %24\n"
- "%48 = OpIAdd %6 %45 %47\n"
- "OpStore %24 %48\n"
- "OpBranch %25\n"
- "%27 = OpLabel\n"
- "OpStore %49 %12\n"
- "OpBranch %50\n"
- "%50 = OpLabel\n"
- "OpLoopMerge %52 %53 None\n"
- "OpBranch %54\n"
- "%54 = OpLabel\n"
- "%55 = OpLoad %6 %49\n"
- "%57 = OpULessThan %16 %55 %56\n"
- "OpBranchConditional %57 %51 %52\n"
- "%51 = OpLabel\n"
- "%58 = OpAccessChain %7 %20 %12\n"
- "%59 = OpLoad %6 %58\n"
- "%60 = OpLoad %6 %10\n"
- "%61 = OpBitwiseAnd %6 %59 %60\n"
- "%62 = OpUGreaterThan %16 %61 %12\n"
- "OpSelectionMerge %64 None\n"
- "OpBranchConditional %62 %63 %64\n"
- "%63 = OpLabel\n"
- "%65 = OpLoad %6 %11\n"
- "%66 = OpIAdd %6 %65 %47\n"
- "OpStore %11 %66\n"
- "OpBranch %64\n"
- "%64 = OpLabel\n"
- "%67 = OpAccessChain %7 %20 %9\n"
- "%68 = OpLoad %6 %67\n"
- "%69 = OpLoad %6 %10\n"
- "%70 = OpBitwiseAnd %6 %68 %69\n"
- "%71 = OpUGreaterThan %16 %70 %12\n"
- "OpSelectionMerge %73 None\n"
- "OpBranchConditional %71 %72 %73\n"
- "%72 = OpLabel\n"
- "%74 = OpLoad %6 %11\n"
- "%75 = OpIAdd %6 %74 %47\n"
- "OpStore %11 %75\n"
- "OpBranch %73\n"
- "%73 = OpLabel\n"
- "%77 = OpAccessChain %7 %20 %76\n"
- "%78 = OpLoad %6 %77\n"
- "%79 = OpLoad %6 %10\n"
- "%80 = OpBitwiseAnd %6 %78 %79\n"
- "%81 = OpUGreaterThan %16 %80 %12\n"
- "OpSelectionMerge %83 None\n"
- "OpBranchConditional %81 %82 %83\n"
- "%82 = OpLabel\n"
- "%84 = OpLoad %6 %11\n"
- "%85 = OpIAdd %6 %84 %47\n"
- "OpStore %11 %85\n"
- "OpBranch %83\n"
- "%83 = OpLabel\n"
- "%86 = OpAccessChain %7 %20 %18\n"
- "%87 = OpLoad %6 %86\n"
- "%88 = OpLoad %6 %10\n"
- "%89 = OpBitwiseAnd %6 %87 %88\n"
- "%90 = OpUGreaterThan %16 %89 %12\n"
- "OpSelectionMerge %92 None\n"
- "OpBranchConditional %90 %91 %92\n"
- "%91 = OpLabel\n"
- "%93 = OpLoad %6 %11\n"
- "%94 = OpIAdd %6 %93 %47\n"
- "OpStore %11 %94\n"
- "OpBranch %92\n"
- "%92 = OpLabel\n"
- "%95 = OpLoad %6 %10\n"
- "%96 = OpShiftLeftLogical %6 %95 %47\n"
- "OpStore %10 %96\n"
- "OpBranch %53\n"
- "%53 = OpLabel\n"
- "%97 = OpLoad %6 %49\n"
- "%98 = OpIAdd %6 %97 %47\n"
- "OpStore %49 %98\n"
- "OpBranch %50\n"
- "%52 = OpLabel\n"
- "%99 = OpLoad %13 %20\n"
- "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
- "%101 = OpLoad %6 %11\n"
- "%102 = OpINotEqual %16 %100 %101\n"
- "OpSelectionMerge %104 None\n"
- "OpBranchConditional %102 %103 %104\n"
- "%103 = OpLabel\n"
- "OpStore %8 %12\n"
- "OpBranch %104\n"
- "%104 = OpLabel\n"
- "%108 = OpLoad %6 %8\n"
- "%109 = OpConvertUToF %105 %108\n"
- "OpStore %107 %109\n"
- "%122 = OpAccessChain %121 %120 %115 %115\n"
- "%123 = OpLoad %110 %122\n"
- "%124 = OpAccessChain %121 %120 %47 %115\n"
- "%125 = OpLoad %110 %124\n"
- "%130 = OpAccessChain %129 %128 %12\n"
- "%131 = OpLoad %105 %130\n"
- "%132 = OpCompositeConstruct %110 %131 %131 %131 %131\n"
- "%133 = OpExtInst %110 %1 FMix %123 %125 %132\n"
- "%135 = OpAccessChain %134 %114 %115\n"
- "OpStore %135 %133\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
- /*
- const string bdy = subgroupMask(caseDef);
- const string controlSource =
+ const string bdy = subgroupMask(caseDef);
+ const string controlSourceGLSL =
"#version 450\n"
"#extension GL_EXT_tessellation_shader : require\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
" out_color[gl_InvocationID] = float(tempResult);\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
- */
- const string controlSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 146\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %40 %50 %54 %123 %133 %139\n"
- "OpExecutionMode %4 OutputVertices 2\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- + mask +
- "OpDecorate %50 RelaxedPrecision\n"
- "OpDecorate %50 BuiltIn SubgroupSize\n"
- "OpDecorate %51 RelaxedPrecision\n"
- "OpDecorate %54 RelaxedPrecision\n"
- "OpDecorate %54 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %55 RelaxedPrecision\n"
- "OpDecorate %123 Location 0\n"
- "OpMemberDecorate %130 0 BuiltIn Position\n"
- "OpMemberDecorate %130 1 BuiltIn PointSize\n"
- "OpMemberDecorate %130 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %130 3 BuiltIn CullDistance\n"
- "OpDecorate %130 Block\n"
- "OpMemberDecorate %135 0 BuiltIn Position\n"
- "OpMemberDecorate %135 1 BuiltIn PointSize\n"
- "OpMemberDecorate %135 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %135 3 BuiltIn CullDistance\n"
- "OpDecorate %135 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpTypePointer Function %16\n"
- "%28 = OpConstant %16 1\n"
- "%31 = OpConstant %16 0\n"
- "%32 = OpTypeVector %16 4\n"
- "%33 = OpTypePointer Function %32\n"
- "%35 = OpConstantTrue %11\n"
- "%36 = OpConstant %16 3\n"
- "%39 = OpTypePointer Input %32\n"
- "%40 = OpVariable %39 Input\n"
- "%49 = OpTypePointer Input %16\n"
- "%50 = OpVariable %49 Input\n"
- "%54 = OpVariable %49 Input\n"
- "%72 = OpConstant %16 32\n"
- "%92 = OpConstant %16 2\n"
- "%121 = OpTypeArray %15 %92\n"
- "%122 = OpTypePointer Output %121\n"
- "%123 = OpVariable %122 Output\n"
- "%128 = OpTypeVector %15 4\n"
- "%129 = OpTypeArray %15 %28\n"
- "%130 = OpTypeStruct %128 %15 %129 %129\n"
- "%131 = OpTypeArray %130 %92\n"
- "%132 = OpTypePointer Output %131\n"
- "%133 = OpVariable %132 Output\n"
- "%135 = OpTypeStruct %128 %15 %129 %129\n"
- "%136 = OpConstant %16 32\n"
- "%137 = OpTypeArray %135 %136\n"
- "%138 = OpTypePointer Input %137\n"
- "%139 = OpVariable %138 Input\n"
- "%141 = OpTypePointer Input %128\n"
- "%144 = OpTypePointer Output %128\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%27 = OpVariable %26 Function\n"
- "%29 = OpVariable %26 Function\n"
- "%30 = OpVariable %26 Function\n"
- "%34 = OpVariable %33 Function\n"
- "%38 = OpVariable %33 Function\n"
- "%42 = OpVariable %26 Function\n"
- "%65 = OpVariable %26 Function\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "OpStore %27 %28\n"
- "OpStore %29 %28\n"
- "OpStore %30 %31\n"
- "%37 = OpGroupNonUniformBallot %32 %36 %35\n"
- "OpStore %34 %37\n"
- "%41 = OpLoad %32 %40\n"
- "OpStore %38 %41\n"
- "OpStore %42 %31\n"
- "OpBranch %43\n"
- "%43 = OpLabel\n"
- "OpLoopMerge %45 %46 None\n"
- "OpBranch %47\n"
- "%47 = OpLabel\n"
- "%48 = OpLoad %16 %42\n"
- "%51 = OpLoad %16 %50\n"
- "%52 = OpULessThan %11 %48 %51\n"
- "OpBranchConditional %52 %44 %45\n"
- "%44 = OpLabel\n"
- "%53 = OpLoad %16 %42\n"
- "%55 = OpLoad %16 %54\n"
- + comparison +
- "%57 = OpLoad %32 %38\n"
- "%58 = OpLoad %16 %42\n"
- "%59 = OpGroupNonUniformBallotBitExtract %11 %36 %57 %58\n"
- "%60 = OpLogicalNotEqual %11 %56 %59\n"
- "OpSelectionMerge %62 None\n"
- "OpBranchConditional %60 %61 %62\n"
- "%61 = OpLabel\n"
- "OpStore %27 %31\n"
- "OpBranch %62\n"
- "%62 = OpLabel\n"
- "OpBranch %46\n"
- "%46 = OpLabel\n"
- "%63 = OpLoad %16 %42\n"
- "%64 = OpIAdd %16 %63 %24\n"
- "OpStore %42 %64\n"
- "OpBranch %43\n"
- "%45 = OpLabel\n"
- "OpStore %65 %31\n"
- "OpBranch %66\n"
- "%66 = OpLabel\n"
- "OpLoopMerge %68 %69 None\n"
- "OpBranch %70\n"
- "%70 = OpLabel\n"
- "%71 = OpLoad %16 %65\n"
- "%73 = OpULessThan %11 %71 %72\n"
- "OpBranchConditional %73 %67 %68\n"
- "%67 = OpLabel\n"
- "%74 = OpAccessChain %26 %38 %31\n"
- "%75 = OpLoad %16 %74\n"
- "%76 = OpLoad %16 %29\n"
- "%77 = OpBitwiseAnd %16 %75 %76\n"
- "%78 = OpUGreaterThan %11 %77 %31\n"
- "OpSelectionMerge %80 None\n"
- "OpBranchConditional %78 %79 %80\n"
- "%79 = OpLabel\n"
- "%81 = OpLoad %16 %30\n"
- "%82 = OpIAdd %16 %81 %24\n"
- "OpStore %30 %82\n"
- "OpBranch %80\n"
- "%80 = OpLabel\n"
- "%83 = OpAccessChain %26 %38 %28\n"
- "%84 = OpLoad %16 %83\n"
- "%85 = OpLoad %16 %29\n"
- "%86 = OpBitwiseAnd %16 %84 %85\n"
- "%87 = OpUGreaterThan %11 %86 %31\n"
- "OpSelectionMerge %89 None\n"
- "OpBranchConditional %87 %88 %89\n"
- "%88 = OpLabel\n"
- "%90 = OpLoad %16 %30\n"
- "%91 = OpIAdd %16 %90 %24\n"
- "OpStore %30 %91\n"
- "OpBranch %89\n"
- "%89 = OpLabel\n"
- "%93 = OpAccessChain %26 %38 %92\n"
- "%94 = OpLoad %16 %93\n"
- "%95 = OpLoad %16 %29\n"
- "%96 = OpBitwiseAnd %16 %94 %95\n"
- "%97 = OpUGreaterThan %11 %96 %31\n"
- "OpSelectionMerge %99 None\n"
- "OpBranchConditional %97 %98 %99\n"
- "%98 = OpLabel\n"
- "%100 = OpLoad %16 %30\n"
- "%101 = OpIAdd %16 %100 %24\n"
- "OpStore %30 %101\n"
- "OpBranch %99\n"
- "%99 = OpLabel\n"
- "%102 = OpAccessChain %26 %38 %36\n"
- "%103 = OpLoad %16 %102\n"
- "%104 = OpLoad %16 %29\n"
- "%105 = OpBitwiseAnd %16 %103 %104\n"
- "%106 = OpUGreaterThan %11 %105 %31\n"
- "OpSelectionMerge %108 None\n"
- "OpBranchConditional %106 %107 %108\n"
- "%107 = OpLabel\n"
- "%109 = OpLoad %16 %30\n"
- "%110 = OpIAdd %16 %109 %24\n"
- "OpStore %30 %110\n"
- "OpBranch %108\n"
- "%108 = OpLabel\n"
- "%111 = OpLoad %16 %29\n"
- "%112 = OpShiftLeftLogical %16 %111 %24\n"
- "OpStore %29 %112\n"
- "OpBranch %69\n"
- "%69 = OpLabel\n"
- "%113 = OpLoad %16 %65\n"
- "%114 = OpIAdd %16 %113 %24\n"
- "OpStore %65 %114\n"
- "OpBranch %66\n"
- "%68 = OpLabel\n"
- "%115 = OpLoad %32 %38\n"
- "%116 = OpGroupNonUniformBallotBitCount %16 %36 Reduce %115\n"
- "%117 = OpLoad %16 %30\n"
- "%118 = OpINotEqual %11 %116 %117\n"
- "OpSelectionMerge %120 None\n"
- "OpBranchConditional %118 %119 %120\n"
- "%119 = OpLabel\n"
- "OpStore %27 %31\n"
- "OpBranch %120\n"
- "%120 = OpLabel\n"
- "%124 = OpLoad %6 %8\n"
- "%125 = OpLoad %16 %27\n"
- "%126 = OpConvertUToF %15 %125\n"
- "%127 = OpAccessChain %22 %123 %124\n"
- "OpStore %127 %126\n"
- "%134 = OpLoad %6 %8\n"
- "%140 = OpLoad %6 %8\n"
- "%142 = OpAccessChain %141 %139 %140 %10\n"
- "%143 = OpLoad %128 %142\n"
- "%145 = OpAccessChain %144 %133 %134 %10\n"
- "OpStore %145 %143\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
- /*
const string bdy = subgroupMask(caseDef);
- const string geometry =
- "#version 450\n"
- "#extension GL_KHR_shader_subgroup_ballot: enable\n"
- "layout(points) in;\n"
- "layout(points, max_vertices = 1) out;\n"
- "layout(location = 0) out float out_color;\n"
- "\n"
- "void main (void)\n"
- "{\n"
- + bdy +
- " out_color = float(tempResult);\n"
- " gl_Position = gl_in[0].gl_Position;\n"
- " EmitVertex();\n"
- " EndPrimitive();\n"
- "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
- */
-
- const string geometry =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 125\n"
- "; Schema: 0\n"
- "OpCapability Geometry\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Geometry %4 \"main\" %22 %32 %36 %107 %114 %119\n"
- "OpExecutionMode %4 InputPoints\n"
- "OpExecutionMode %4 Invocations 1\n"
- "OpExecutionMode %4 OutputPoints\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- + mask +
- "OpDecorate %32 RelaxedPrecision\n"
- "OpDecorate %32 BuiltIn SubgroupSize\n"
- "OpDecorate %33 RelaxedPrecision\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %37 RelaxedPrecision\n"
- "OpDecorate %107 Location 0\n"
- "OpMemberDecorate %112 0 BuiltIn Position\n"
- "OpMemberDecorate %112 1 BuiltIn PointSize\n"
- "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
- "OpDecorate %112 Block\n"
- "OpMemberDecorate %116 0 BuiltIn Position\n"
- "OpMemberDecorate %116 1 BuiltIn PointSize\n"
- "OpMemberDecorate %116 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %116 3 BuiltIn CullDistance\n"
- "OpDecorate %116 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 1\n"
- "%12 = OpConstant %6 0\n"
- "%13 = OpTypeVector %6 4\n"
- "%14 = OpTypePointer Function %13\n"
- "%16 = OpTypeBool\n"
- "%17 = OpConstantTrue %16\n"
- "%18 = OpConstant %6 3\n"
- "%21 = OpTypePointer Input %13\n"
- "%22 = OpVariable %21 Input\n"
- "%31 = OpTypePointer Input %6\n"
- "%32 = OpVariable %31 Input\n"
- "%36 = OpVariable %31 Input\n"
- "%46 = OpTypeInt 32 1\n"
- "%47 = OpConstant %46 1\n"
- "%56 = OpConstant %6 32\n"
- "%76 = OpConstant %6 2\n"
- "%105 = OpTypeFloat 32\n"
- "%106 = OpTypePointer Output %105\n"
- "%107 = OpVariable %106 Output\n"
- "%110 = OpTypeVector %105 4\n"
- "%111 = OpTypeArray %105 %9\n"
- "%112 = OpTypeStruct %110 %105 %111 %111\n"
- "%113 = OpTypePointer Output %112\n"
- "%114 = OpVariable %113 Output\n"
- "%115 = OpConstant %46 0\n"
- "%116 = OpTypeStruct %110 %105 %111 %111\n"
- "%117 = OpTypeArray %116 %9\n"
- "%118 = OpTypePointer Input %117\n"
- "%119 = OpVariable %118 Input\n"
- "%120 = OpTypePointer Input %110\n"
- "%123 = OpTypePointer Output %110\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%10 = OpVariable %7 Function\n"
- "%11 = OpVariable %7 Function\n"
- "%15 = OpVariable %14 Function\n"
- "%20 = OpVariable %14 Function\n"
- "%24 = OpVariable %7 Function\n"
- "%49 = OpVariable %7 Function\n"
- "OpStore %8 %9\n"
- "OpStore %10 %9\n"
- "OpStore %11 %12\n"
- "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
- "OpStore %15 %19\n"
- "%23 = OpLoad %13 %22\n"
- "OpStore %20 %23\n"
- "OpStore %24 %12\n"
- "OpBranch %25\n"
- "%25 = OpLabel\n"
- "OpLoopMerge %27 %28 None\n"
- "OpBranch %29\n"
- "%29 = OpLabel\n"
- "%30 = OpLoad %6 %24\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpULessThan %16 %30 %33\n"
- "OpBranchConditional %34 %26 %27\n"
- "%26 = OpLabel\n"
- "%35 = OpLoad %6 %24\n"
- "%37 = OpLoad %6 %36\n"
- + comparison +
- "%39 = OpLoad %13 %20\n"
- "%40 = OpLoad %6 %24\n"
- "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
- "%42 = OpLogicalNotEqual %16 %38 %41\n"
- "OpSelectionMerge %44 None\n"
- "OpBranchConditional %42 %43 %44\n"
- "%43 = OpLabel\n"
- "OpStore %8 %12\n"
- "OpBranch %44\n"
- "%44 = OpLabel\n"
- "OpBranch %28\n"
- "%28 = OpLabel\n"
- "%45 = OpLoad %6 %24\n"
- "%48 = OpIAdd %6 %45 %47\n"
- "OpStore %24 %48\n"
- "OpBranch %25\n"
- "%27 = OpLabel\n"
- "OpStore %49 %12\n"
- "OpBranch %50\n"
- "%50 = OpLabel\n"
- "OpLoopMerge %52 %53 None\n"
- "OpBranch %54\n"
- "%54 = OpLabel\n"
- "%55 = OpLoad %6 %49\n"
- "%57 = OpULessThan %16 %55 %56\n"
- "OpBranchConditional %57 %51 %52\n"
- "%51 = OpLabel\n"
- "%58 = OpAccessChain %7 %20 %12\n"
- "%59 = OpLoad %6 %58\n"
- "%60 = OpLoad %6 %10\n"
- "%61 = OpBitwiseAnd %6 %59 %60\n"
- "%62 = OpUGreaterThan %16 %61 %12\n"
- "OpSelectionMerge %64 None\n"
- "OpBranchConditional %62 %63 %64\n"
- "%63 = OpLabel\n"
- "%65 = OpLoad %6 %11\n"
- "%66 = OpIAdd %6 %65 %47\n"
- "OpStore %11 %66\n"
- "OpBranch %64\n"
- "%64 = OpLabel\n"
- "%67 = OpAccessChain %7 %20 %9\n"
- "%68 = OpLoad %6 %67\n"
- "%69 = OpLoad %6 %10\n"
- "%70 = OpBitwiseAnd %6 %68 %69\n"
- "%71 = OpUGreaterThan %16 %70 %12\n"
- "OpSelectionMerge %73 None\n"
- "OpBranchConditional %71 %72 %73\n"
- "%72 = OpLabel\n"
- "%74 = OpLoad %6 %11\n"
- "%75 = OpIAdd %6 %74 %47\n"
- "OpStore %11 %75\n"
- "OpBranch %73\n"
- "%73 = OpLabel\n"
- "%77 = OpAccessChain %7 %20 %76\n"
- "%78 = OpLoad %6 %77\n"
- "%79 = OpLoad %6 %10\n"
- "%80 = OpBitwiseAnd %6 %78 %79\n"
- "%81 = OpUGreaterThan %16 %80 %12\n"
- "OpSelectionMerge %83 None\n"
- "OpBranchConditional %81 %82 %83\n"
- "%82 = OpLabel\n"
- "%84 = OpLoad %6 %11\n"
- "%85 = OpIAdd %6 %84 %47\n"
- "OpStore %11 %85\n"
- "OpBranch %83\n"
- "%83 = OpLabel\n"
- "%86 = OpAccessChain %7 %20 %18\n"
- "%87 = OpLoad %6 %86\n"
- "%88 = OpLoad %6 %10\n"
- "%89 = OpBitwiseAnd %6 %87 %88\n"
- "%90 = OpUGreaterThan %16 %89 %12\n"
- "OpSelectionMerge %92 None\n"
- "OpBranchConditional %90 %91 %92\n"
- "%91 = OpLabel\n"
- "%93 = OpLoad %6 %11\n"
- "%94 = OpIAdd %6 %93 %47\n"
- "OpStore %11 %94\n"
- "OpBranch %92\n"
- "%92 = OpLabel\n"
- "%95 = OpLoad %6 %10\n"
- "%96 = OpShiftLeftLogical %6 %95 %47\n"
- "OpStore %10 %96\n"
- "OpBranch %53\n"
- "%53 = OpLabel\n"
- "%97 = OpLoad %6 %49\n"
- "%98 = OpIAdd %6 %97 %47\n"
- "OpStore %49 %98\n"
- "OpBranch %50\n"
- "%52 = OpLabel\n"
- "%99 = OpLoad %13 %20\n"
- "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
- "%101 = OpLoad %6 %11\n"
- "%102 = OpINotEqual %16 %100 %101\n"
- "OpSelectionMerge %104 None\n"
- "OpBranchConditional %102 %103 %104\n"
- "%103 = OpLabel\n"
- "OpStore %8 %12\n"
- "OpBranch %104\n"
- "%104 = OpLabel\n"
- "%108 = OpLoad %6 %8\n"
- "%109 = OpConvertUToF %105 %108\n"
- "OpStore %107 %109\n"
- "%121 = OpAccessChain %120 %119 %115 %115\n"
- "%122 = OpLoad %110 %121\n"
- "%124 = OpAccessChain %123 %114 %115\n"
- "OpStore %124 %122\n"
- "OpEmitVertex\n"
- "OpEndPrimitive\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("geometry") << geometry << buildOptionsSpr;
+ const string geometryGLSL =
+ "#version 450\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(points) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(location = 0) out float out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " out_color = float(tempResult);\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
}
else
{
{
const string bdy = subgroupMask(caseDef);
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Output\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
const string vertex =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
- "layout(set = 0, binding = 0, std430) buffer Output\n"
+ "layout(binding = 0, std430) buffer Output0\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b0;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy +
- " result[gl_VertexIndex] = tempResult;\n"
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Output\n"
+ "layout(binding = 1, std430) buffer Output1\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b1;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy +
- " result[gl_PrimitiveID] = tempResult;\n"
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
"#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Output\n"
+ "layout(binding = 2, std430) buffer Output2\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b2;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Output\n"
+ "layout(binding = 3, std430) buffer Output3\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b3;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy +
- " result[gl_PrimitiveIDIn] = tempResult;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
" result = tempResult;\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
}
}
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
}
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
- else if ((VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) & caseDef.shaderStage )
- return makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return makeVertexFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if ((SHADER_STAGE_TESS_EVALUATION_BIT | SHADER_STAGE_TESS_CONTROL_BIT) & caseDef.shaderStage )
+ return makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
- return makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ return makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BALLOT_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
}
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
"Shader stage " + getShaderStageName(caseDef.shaderStage) +
" is required to support subgroup operations!");
}
- return makeComputeTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkComputeStage);
+ return makeComputeTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ subgroups::ShaderStageFlags stages = (subgroups::ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
}
}
-tcu::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(deqp::Context& testCtx)
{
-de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup builtin mask category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup builtin mask category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup builtin mask category tests: framebuffer"));
const char* const all_stages_vars[] =
"SubgroupLtMask",
};
- const VkShaderStageFlags stages[] =
+ const subgroups::ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
const std::string varLower = de::toLower(var);
{
- const CaseDefinition caseDef = {"gl_" + var, VK_SHADER_STAGE_ALL_GRAPHICS};
- addFunctionCaseWithPrograms(graphicGroup.get(),
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_ALL_GRAPHICS};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
varLower, "",
supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {"gl_" + var, VK_SHADER_STAGE_COMPUTE_BIT};
- addFunctionCaseWithPrograms(computeGroup.get(),
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
varLower, "",
supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {"gl_" + var, stages[stageIndex]};
- addFunctionCaseWithPrograms(framebufferGroup.get(),
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
varLower + "_" +
getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "builtin_mask_var", "Subgroup builtin mask variable tests"));
group->addChild(graphicGroup.release());
return group.release();
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSBUILTINMASKVARTESTS_HPP
-#define _VKTSUBGROUPSBUILTINMASKVARTESTS_HPP
+#ifndef _GLCSUBGROUPSBUILTINMASKVARTESTS_HPP
+#define _GLCSUBGROUPSBUILTINMASKVARTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSBUILTINMASKVARTESTS_HPP
+#endif // _GLCSUBGROUPSBUILTINMASKVARTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsBuiltinVarTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsBuiltinVarTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-namespace vkt
+namespace glc
{
namespace subgroups
{
struct CaseDefinition
{
std::string varName;
- VkShaderStageFlags shaderStage;
+ ShaderStageFlags shaderStage;
};
}
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
- const vk::SpirVAsmBuildOptions buildOptionsSpr (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3);
-
{
- /*
+ const string fragmentGLSL =
+ "#version 450\n"
"layout(location = 0) in vec4 in_color;\n"
"layout(location = 0) out uvec4 out_color;\n"
"void main()\n"
"{\n"
" out_color = uvec4(in_color);\n"
"}\n";
- */
- const string fragment =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 16\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Fragment %4 \"main\" %9 %13\n"
- "OpExecutionMode %4 OriginUpperLeft\n"
- "OpDecorate %9 Location 0\n"
- "OpDecorate %13 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypePointer Output %7\n"
- "%9 = OpVariable %8 Output\n"
- "%10 = OpTypeFloat 32\n"
- "%11 = OpTypeVector %10 4\n"
- "%12 = OpTypePointer Input %11\n"
- "%13 = OpVariable %12 Input\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%14 = OpLoad %11 %13\n"
- "%15 = OpConvertFToU %7 %14\n"
- "OpStore %9 %15\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("fragment") << fragment << buildOptionsSpr;
+ programCollection.add("fragment") << glu::FragmentSource(fragmentGLSL);
}
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
- /*
+ const string vertexGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(location = 0) out vec4 out_color;\n"
"layout(location = 0) in highp vec4 in_position;\n"
" gl_Position = in_position;\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- */
- const string vertex =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 31\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %9 %12 %15 %24 %28\n"
- "OpDecorate %9 Location 0\n"
- "OpDecorate %12 RelaxedPrecision\n"
- "OpDecorate %12 BuiltIn SubgroupSize\n"
- "OpDecorate %13 RelaxedPrecision\n"
- "OpDecorate %15 RelaxedPrecision\n"
- "OpDecorate %15 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %16 RelaxedPrecision\n"
- "OpMemberDecorate %22 0 BuiltIn Position\n"
- "OpMemberDecorate %22 1 BuiltIn PointSize\n"
- "OpMemberDecorate %22 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %22 3 BuiltIn CullDistance\n"
- "OpDecorate %22 Block\n"
- "OpDecorate %28 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypePointer Output %7\n"
- "%9 = OpVariable %8 Output\n"
- "%10 = OpTypeInt 32 0\n"
- "%11 = OpTypePointer Input %10\n"
- "%12 = OpVariable %11 Input\n"
- "%15 = OpVariable %11 Input\n"
- "%18 = OpConstant %6 1\n"
- "%20 = OpConstant %10 1\n"
- "%21 = OpTypeArray %6 %20\n"
- "%22 = OpTypeStruct %7 %6 %21 %21\n"
- "%23 = OpTypePointer Output %22\n"
- "%24 = OpVariable %23 Output\n"
- "%25 = OpTypeInt 32 1\n"
- "%26 = OpConstant %25 0\n"
- "%27 = OpTypePointer Input %7\n"
- "%28 = OpVariable %27 Input\n"
- "%31 = OpConstant %25 1\n"
- "%32 = OpTypePointer Output %6\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%13 = OpLoad %10 %12\n"
- "%14 = OpConvertUToF %6 %13\n"
- "%16 = OpLoad %10 %15\n"
- "%17 = OpConvertUToF %6 %16\n"
- "%19 = OpCompositeConstruct %7 %14 %17 %18 %18\n"
- "OpStore %9 %19\n"
- "%29 = OpLoad %7 %28\n"
- "%30 = OpAccessChain %8 %24 %26\n"
- "OpStore %30 %29\n"
- "%33 = OpAccessChain %32 %24 %31\n"
- "OpStore %33 %18\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("vert") << vertex << buildOptionsSpr;
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
- /*
+ const string controlSourceGLSL =
+ "#version 450\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(vertices = 2) out;\n"
"layout(location = 0) out vec4 out_color[];\n"
"void main (void)\n"
"{\n"
" if (gl_InvocationID == 0)\n"
- {\n"
+ " {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_TessLevelOuter[1] = 1.0f;\n"
" }\n"
" out_color[gl_InvocationID] = vec4(0.0f);\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- */
- const string controlSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 53\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %30 %41 %47\n"
- "OpExecutionMode %4 OutputVertices 2\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- "OpDecorate %30 Location 0\n"
- "OpMemberDecorate %38 0 BuiltIn Position\n"
- "OpMemberDecorate %38 1 BuiltIn PointSize\n"
- "OpMemberDecorate %38 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %38 3 BuiltIn CullDistance\n"
- "OpDecorate %38 Block\n"
- "OpMemberDecorate %43 0 BuiltIn Position\n"
- "OpMemberDecorate %43 1 BuiltIn PointSize\n"
- "OpMemberDecorate %43 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %43 3 BuiltIn CullDistance\n"
- "OpDecorate %43 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpTypeVector %15 4\n"
- "%27 = OpConstant %16 2\n"
- "%28 = OpTypeArray %26 %27\n"
- "%29 = OpTypePointer Output %28\n"
- "%30 = OpVariable %29 Output\n"
- "%32 = OpConstant %15 0\n"
- "%33 = OpConstantComposite %26 %32 %32 %32 %32\n"
- "%34 = OpTypePointer Output %26\n"
- "%36 = OpConstant %16 1\n"
- "%37 = OpTypeArray %15 %36\n"
- "%38 = OpTypeStruct %26 %15 %37 %37\n"
- "%39 = OpTypeArray %38 %27\n"
- "%40 = OpTypePointer Output %39\n"
- "%41 = OpVariable %40 Output\n"
- "%43 = OpTypeStruct %26 %15 %37 %37\n"
- "%44 = OpConstant %16 32\n"
- "%45 = OpTypeArray %43 %44\n"
- "%46 = OpTypePointer Input %45\n"
- "%47 = OpVariable %46 Input\n"
- "%49 = OpTypePointer Input %26\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "%31 = OpLoad %6 %8\n"
- "%35 = OpAccessChain %34 %30 %31\n"
- "OpStore %35 %33\n"
- "%42 = OpLoad %6 %8\n"
- "%48 = OpLoad %6 %8\n"
- "%50 = OpAccessChain %49 %47 %48 %10\n"
- "%51 = OpLoad %26 %50\n"
- "%52 = OpAccessChain %34 %41 %42 %10\n"
- "OpStore %52 %51\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
-
- /*
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(isolines, equal_spacing, ccw ) in;\n"
" gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
" out_color = vec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0.0f, 0.0f);\n"
"}\n";
- */
- const string evaluationSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 51\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %13 %20 %29 %38 %40 %43 %50\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpMemberDecorate %11 0 BuiltIn Position\n"
- "OpMemberDecorate %11 1 BuiltIn PointSize\n"
- "OpMemberDecorate %11 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %11 3 BuiltIn CullDistance\n"
- "OpDecorate %11 Block\n"
- "OpMemberDecorate %16 0 BuiltIn Position\n"
- "OpMemberDecorate %16 1 BuiltIn PointSize\n"
- "OpMemberDecorate %16 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %16 3 BuiltIn CullDistance\n"
- "OpDecorate %16 Block\n"
- "OpDecorate %29 BuiltIn TessCoord\n"
- "OpDecorate %38 Location 0\n"
- "OpDecorate %40 RelaxedPrecision\n"
- "OpDecorate %40 BuiltIn SubgroupSize\n"
- "OpDecorate %41 RelaxedPrecision\n"
- "OpDecorate %43 RelaxedPrecision\n"
- "OpDecorate %43 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %44 RelaxedPrecision\n"
- "OpDecorate %50 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeInt 32 0\n"
- "%9 = OpConstant %8 1\n"
- "%10 = OpTypeArray %6 %9\n"
- "%11 = OpTypeStruct %7 %6 %10 %10\n"
- "%12 = OpTypePointer Output %11\n"
- "%13 = OpVariable %12 Output\n"
- "%14 = OpTypeInt 32 1\n"
- "%15 = OpConstant %14 0\n"
- "%16 = OpTypeStruct %7 %6 %10 %10\n"
- "%17 = OpConstant %8 32\n"
- "%18 = OpTypeArray %16 %17\n"
- "%19 = OpTypePointer Input %18\n"
- "%20 = OpVariable %19 Input\n"
- "%21 = OpTypePointer Input %7\n"
- "%24 = OpConstant %14 1\n"
- "%27 = OpTypeVector %6 3\n"
- "%28 = OpTypePointer Input %27\n"
- "%29 = OpVariable %28 Input\n"
- "%30 = OpConstant %8 0\n"
- "%31 = OpTypePointer Input %6\n"
- "%36 = OpTypePointer Output %7\n"
- "%38 = OpVariable %36 Output\n"
- "%39 = OpTypePointer Input %8\n"
- "%40 = OpVariable %39 Input\n"
- "%43 = OpVariable %39 Input\n"
- "%46 = OpConstant %6 0\n"
- "%48 = OpTypeArray %7 %17\n"
- "%49 = OpTypePointer Input %48\n"
- "%50 = OpVariable %49 Input\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%22 = OpAccessChain %21 %20 %15 %15\n"
- "%23 = OpLoad %7 %22\n"
- "%25 = OpAccessChain %21 %20 %24 %15\n"
- "%26 = OpLoad %7 %25\n"
- "%32 = OpAccessChain %31 %29 %30\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpCompositeConstruct %7 %33 %33 %33 %33\n"
- "%35 = OpExtInst %7 %1 FMix %23 %26 %34\n"
- "%37 = OpAccessChain %36 %13 %15\n"
- "OpStore %37 %35\n"
- "%41 = OpLoad %8 %40\n"
- "%42 = OpConvertUToF %6 %41\n"
- "%44 = OpLoad %8 %43\n"
- "%45 = OpConvertUToF %6 %44\n"
- "%47 = OpCompositeConstruct %7 %42 %45 %46 %46\n"
- "OpStore %38 %47\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
-
- programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
- /*
+ const string controlSourceGLSL =
+ "#version 450\n"
"#extension GL_EXT_tessellation_shader : require\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(vertices = 2) out;\n"
"void main (void)\n"
"{\n"
" if (gl_InvocationID == 0)\n"
- {\n"
+ " {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_TessLevelOuter[1] = 1.0f;\n"
" }\n"
" out_color[gl_InvocationID] = vec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- */
- const string controlSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 60\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %30 %33 %36 %48 %54\n"
- "OpExecutionMode %4 OutputVertices 2\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- "OpDecorate %30 Location 0\n"
- "OpDecorate %33 RelaxedPrecision\n"
- "OpDecorate %33 BuiltIn SubgroupSize\n"
- "OpDecorate %34 RelaxedPrecision\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %37 RelaxedPrecision\n"
- "OpMemberDecorate %45 0 BuiltIn Position\n"
- "OpMemberDecorate %45 1 BuiltIn PointSize\n"
- "OpMemberDecorate %45 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %45 3 BuiltIn CullDistance\n"
- "OpDecorate %45 Block\n"
- "OpMemberDecorate %50 0 BuiltIn Position\n"
- "OpMemberDecorate %50 1 BuiltIn PointSize\n"
- "OpMemberDecorate %50 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %50 3 BuiltIn CullDistance\n"
- "OpDecorate %50 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpTypeVector %15 4\n"
- "%27 = OpConstant %16 2\n"
- "%28 = OpTypeArray %26 %27\n"
- "%29 = OpTypePointer Output %28\n"
- "%30 = OpVariable %29 Output\n"
- "%32 = OpTypePointer Input %16\n"
- "%33 = OpVariable %32 Input\n"
- "%36 = OpVariable %32 Input\n"
- "%39 = OpConstant %15 0\n"
- "%41 = OpTypePointer Output %26\n"
- "%43 = OpConstant %16 1\n"
- "%44 = OpTypeArray %15 %43\n"
- "%45 = OpTypeStruct %26 %15 %44 %44\n"
- "%46 = OpTypeArray %45 %27\n"
- "%47 = OpTypePointer Output %46\n"
- "%48 = OpVariable %47 Output\n"
- "%50 = OpTypeStruct %26 %15 %44 %44\n"
- "%51 = OpConstant %16 32\n"
- "%52 = OpTypeArray %50 %51\n"
- "%53 = OpTypePointer Input %52\n"
- "%54 = OpVariable %53 Input\n"
- "%56 = OpTypePointer Input %26\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "%31 = OpLoad %6 %8\n"
- "%34 = OpLoad %16 %33\n"
- "%35 = OpConvertUToF %15 %34\n"
- "%37 = OpLoad %16 %36\n"
- "%38 = OpConvertUToF %15 %37\n"
- "%40 = OpCompositeConstruct %26 %35 %38 %39 %39\n"
- "%42 = OpAccessChain %41 %30 %31\n"
- "OpStore %42 %40\n"
- "%49 = OpLoad %6 %8\n"
- "%55 = OpLoad %6 %8\n"
- "%57 = OpAccessChain %56 %54 %55 %10\n"
- "%58 = OpLoad %26 %57\n"
- "%59 = OpAccessChain %41 %48 %49 %10\n"
- "OpStore %59 %58\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
-
- /*
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSourceGLSL);
+
+ const string evaluationSourceGLSL =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(isolines, equal_spacing, ccw ) in;\n"
" gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
" out_color = in_color[0];\n"
"}\n";
- */
- const string evaluationSource =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 44\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %13 %20 %29 %38 %41\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpMemberDecorate %11 0 BuiltIn Position\n"
- "OpMemberDecorate %11 1 BuiltIn PointSize\n"
- "OpMemberDecorate %11 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %11 3 BuiltIn CullDistance\n"
- "OpDecorate %11 Block\n"
- "OpMemberDecorate %16 0 BuiltIn Position\n"
- "OpMemberDecorate %16 1 BuiltIn PointSize\n"
- "OpMemberDecorate %16 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %16 3 BuiltIn CullDistance\n"
- "OpDecorate %16 Block\n"
- "OpDecorate %29 BuiltIn TessCoord\n"
- "OpDecorate %38 Location 0\n"
- "OpDecorate %41 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeInt 32 0\n"
- "%9 = OpConstant %8 1\n"
- "%10 = OpTypeArray %6 %9\n"
- "%11 = OpTypeStruct %7 %6 %10 %10\n"
- "%12 = OpTypePointer Output %11\n"
- "%13 = OpVariable %12 Output\n"
- "%14 = OpTypeInt 32 1\n"
- "%15 = OpConstant %14 0\n"
- "%16 = OpTypeStruct %7 %6 %10 %10\n"
- "%17 = OpConstant %8 32\n"
- "%18 = OpTypeArray %16 %17\n"
- "%19 = OpTypePointer Input %18\n"
- "%20 = OpVariable %19 Input\n"
- "%21 = OpTypePointer Input %7\n"
- "%24 = OpConstant %14 1\n"
- "%27 = OpTypeVector %6 3\n"
- "%28 = OpTypePointer Input %27\n"
- "%29 = OpVariable %28 Input\n"
- "%30 = OpConstant %8 0\n"
- "%31 = OpTypePointer Input %6\n"
- "%36 = OpTypePointer Output %7\n"
- "%38 = OpVariable %36 Output\n"
- "%39 = OpTypeArray %7 %17\n"
- "%40 = OpTypePointer Input %39\n"
- "%41 = OpVariable %40 Input\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%22 = OpAccessChain %21 %20 %15 %15\n"
- "%23 = OpLoad %7 %22\n"
- "%25 = OpAccessChain %21 %20 %24 %15\n"
- "%26 = OpLoad %7 %25\n"
- "%32 = OpAccessChain %31 %29 %30\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpCompositeConstruct %7 %33 %33 %33 %33\n"
- "%35 = OpExtInst %7 %1 FMix %23 %26 %34\n"
- "%37 = OpAccessChain %36 %13 %15\n"
- "OpStore %37 %35\n"
- "%42 = OpAccessChain %21 %41 %15\n"
- "%43 = OpLoad %7 %42\n"
- "OpStore %38 %43\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSourceGLSL);
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
- /*
+ const string geometryGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(points) in;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- */
- const string geometry =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 35\n"
- "; Schema: 0\n"
- "OpCapability Geometry\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Geometry %4 \"main\" %9 %12 %15 %24 %30\n"
- "OpExecutionMode %4 InputPoints\n"
- "OpExecutionMode %4 Invocations 1\n"
- "OpExecutionMode %4 OutputPoints\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- "OpDecorate %9 Location 0\n"
- "OpDecorate %12 RelaxedPrecision\n"
- "OpDecorate %12 BuiltIn SubgroupSize\n"
- "OpDecorate %13 RelaxedPrecision\n"
- "OpDecorate %15 RelaxedPrecision\n"
- "OpDecorate %15 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %16 RelaxedPrecision\n"
- "OpMemberDecorate %22 0 BuiltIn Position\n"
- "OpMemberDecorate %22 1 BuiltIn PointSize\n"
- "OpMemberDecorate %22 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %22 3 BuiltIn CullDistance\n"
- "OpDecorate %22 Block\n"
- "OpMemberDecorate %27 0 BuiltIn Position\n"
- "OpMemberDecorate %27 1 BuiltIn PointSize\n"
- "OpMemberDecorate %27 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %27 3 BuiltIn CullDistance\n"
- "OpDecorate %27 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypePointer Output %7\n"
- "%9 = OpVariable %8 Output\n"
- "%10 = OpTypeInt 32 0\n"
- "%11 = OpTypePointer Input %10\n"
- "%12 = OpVariable %11 Input\n"
- "%15 = OpVariable %11 Input\n"
- "%18 = OpConstant %6 0\n"
- "%20 = OpConstant %10 1\n"
- "%21 = OpTypeArray %6 %20\n"
- "%22 = OpTypeStruct %7 %6 %21 %21\n"
- "%23 = OpTypePointer Output %22\n"
- "%24 = OpVariable %23 Output\n"
- "%25 = OpTypeInt 32 1\n"
- "%26 = OpConstant %25 0\n"
- "%27 = OpTypeStruct %7 %6 %21 %21\n"
- "%28 = OpTypeArray %27 %20\n"
- "%29 = OpTypePointer Input %28\n"
- "%30 = OpVariable %29 Input\n"
- "%31 = OpTypePointer Input %7\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%13 = OpLoad %10 %12\n"
- "%14 = OpConvertUToF %6 %13\n"
- "%16 = OpLoad %10 %15\n"
- "%17 = OpConvertUToF %6 %16\n"
- "%19 = OpCompositeConstruct %7 %14 %17 %18 %18\n"
- "OpStore %9 %19\n"
- "%32 = OpAccessChain %31 %30 %26 %26\n"
- "%33 = OpLoad %7 %32\n"
- "%34 = OpAccessChain %8 %24 %26\n"
- "OpStore %34 %33\n"
- "OpEmitVertex\n"
- "OpEndPrimitive\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("geometry") << geometry << buildOptionsSpr;
+ programCollection.add("geometry") << glu::GeometrySource(geometryGLSL);
}
else
{
void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Output\n"
<< "{\n"
<< " uvec4 result[];\n"
<< "};\n"
<< " result[offset] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, gl_NumSubgroups, gl_SubgroupID);\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
{
- /*
+ const string vertexGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
- "layout(set = 0, binding = 0, std430) buffer Output\n"
+ "layout(binding = 0, std430) buffer Output0\n"
"{\n"
" uvec4 result[];\n"
- "};\n"
+ "} b0;\n"
"\n"
"void main (void)\n"
"{\n"
- " result[gl_VertexIndex] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " b0.result[gl_VertexID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- */
- const string vertex =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 1\n"
- "; Bound: 52\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %15 %18 %20 %41\n"
- "OpDecorate %8 ArrayStride 16\n"
- "OpMemberDecorate %9 0 Offset 0\n"
- "OpDecorate %9 BufferBlock\n"
- "OpDecorate %11 DescriptorSet 0\n"
- "OpDecorate %11 Binding 0\n"
- "OpDecorate %15 BuiltIn VertexIndex\n"
- "OpDecorate %18 RelaxedPrecision\n"
- "OpDecorate %18 BuiltIn SubgroupSize\n"
- "OpDecorate %19 RelaxedPrecision\n"
- "OpDecorate %20 RelaxedPrecision\n"
- "OpDecorate %20 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %21 RelaxedPrecision\n"
- "OpMemberDecorate %39 0 BuiltIn Position\n"
- "OpMemberDecorate %39 1 BuiltIn PointSize\n"
- "OpMemberDecorate %39 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %39 3 BuiltIn CullDistance\n"
- "OpDecorate %39 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeRuntimeArray %7\n"
- "%9 = OpTypeStruct %8\n"
- "%10 = OpTypePointer Uniform %9\n"
- "%11 = OpVariable %10 Uniform\n"
- "%12 = OpTypeInt 32 1\n"
- "%13 = OpConstant %12 0\n"
- "%14 = OpTypePointer Input %12\n"
- "%15 = OpVariable %14 Input\n"
- "%17 = OpTypePointer Input %6\n"
- "%18 = OpVariable %17 Input\n"
- "%20 = OpVariable %17 Input\n"
- "%22 = OpConstant %6 0\n"
- "%24 = OpTypePointer Uniform %7\n"
- "%26 = OpTypeFloat 32\n"
- "%27 = OpTypePointer Function %26\n"
- "%29 = OpConstant %26 0.00195313\n"
- "%32 = OpConstant %26 2\n"
- "%34 = OpConstant %26 1\n"
- "%36 = OpTypeVector %26 4\n"
- "%37 = OpConstant %6 1\n"
- "%38 = OpTypeArray %26 %37\n"
- "%39 = OpTypeStruct %36 %26 %38 %38\n"
- "%40 = OpTypePointer Output %39\n"
- "%41 = OpVariable %40 Output\n"
- "%48 = OpConstant %26 0\n"
- "%50 = OpTypePointer Output %36\n"
- "%52 = OpConstant %12 1\n"
- "%53 = OpTypePointer Output %26\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%28 = OpVariable %27 Function\n"
- "%30 = OpVariable %27 Function\n"
- "%16 = OpLoad %12 %15\n"
- "%19 = OpLoad %6 %18\n"
- "%21 = OpLoad %6 %20\n"
- "%23 = OpCompositeConstruct %7 %19 %21 %22 %22\n"
- "%25 = OpAccessChain %24 %11 %13 %16\n"
- "OpStore %25 %23\n"
- "OpStore %28 %29\n"
- "%31 = OpLoad %26 %28\n"
- "%33 = OpFDiv %26 %31 %32\n"
- "%35 = OpFSub %26 %33 %34\n"
- "OpStore %30 %35\n"
- "%42 = OpLoad %12 %15\n"
- "%43 = OpConvertSToF %26 %42\n"
- "%44 = OpLoad %26 %28\n"
- "%45 = OpFMul %26 %43 %44\n"
- "%46 = OpLoad %26 %30\n"
- "%47 = OpFAdd %26 %45 %46\n"
- "%49 = OpCompositeConstruct %36 %47 %48 %48 %34\n"
- "%51 = OpAccessChain %50 %41 %13\n"
- "OpStore %51 %49\n"
- "%54 = OpAccessChain %53 %41 %52\n"
- "OpStore %54 %34\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("vert") << vertex << SpirVAsmBuildOptions(programCollection.usedVulkanVersion, SPIRV_VERSION_1_3);
+ programCollection.add("vert") << glu::VertexSource(vertexGLSL);
}
{
- /*
+ const string tescGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Output\n"
+ "layout(binding = 1, std430) buffer Output1\n"
"{\n"
" uvec4 result[];\n"
- "};\n"
+ "} b1;\n"
"\n"
"void main (void)\n"
"{\n"
- " result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " b1.result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- */
- const string tesc =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 1\n"
- "; Bound: 61\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %15 %18 %20 %26 %36 %48 %54\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- "OpDecorate %8 ArrayStride 16\n"
- "OpMemberDecorate %9 0 Offset 0\n"
- "OpDecorate %9 BufferBlock\n"
- "OpDecorate %11 DescriptorSet 0\n"
- "OpDecorate %11 Binding 1\n"
- "OpDecorate %15 BuiltIn PrimitiveId\n"
- "OpDecorate %18 RelaxedPrecision\n"
- "OpDecorate %18 BuiltIn SubgroupSize\n"
- "OpDecorate %19 RelaxedPrecision\n"
- "OpDecorate %20 RelaxedPrecision\n"
- "OpDecorate %20 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %21 RelaxedPrecision\n"
- "OpDecorate %26 BuiltIn InvocationId\n"
- "OpDecorate %36 Patch\n"
- "OpDecorate %36 BuiltIn TessLevelOuter\n"
- "OpMemberDecorate %45 0 BuiltIn Position\n"
- "OpMemberDecorate %45 1 BuiltIn PointSize\n"
- "OpMemberDecorate %45 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %45 3 BuiltIn CullDistance\n"
- "OpDecorate %45 Block\n"
- "OpMemberDecorate %50 0 BuiltIn Position\n"
- "OpMemberDecorate %50 1 BuiltIn PointSize\n"
- "OpMemberDecorate %50 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %50 3 BuiltIn CullDistance\n"
- "OpDecorate %50 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeRuntimeArray %7\n"
- "%9 = OpTypeStruct %8\n"
- "%10 = OpTypePointer Uniform %9\n"
- "%11 = OpVariable %10 Uniform\n"
- "%12 = OpTypeInt 32 1\n"
- "%13 = OpConstant %12 0\n"
- "%14 = OpTypePointer Input %12\n"
- "%15 = OpVariable %14 Input\n"
- "%17 = OpTypePointer Input %6\n"
- "%18 = OpVariable %17 Input\n"
- "%20 = OpVariable %17 Input\n"
- "%22 = OpConstant %6 0\n"
- "%24 = OpTypePointer Uniform %7\n"
- "%26 = OpVariable %14 Input\n"
- "%28 = OpTypeBool\n"
- "%32 = OpTypeFloat 32\n"
- "%33 = OpConstant %6 4\n"
- "%34 = OpTypeArray %32 %33\n"
- "%35 = OpTypePointer Output %34\n"
- "%36 = OpVariable %35 Output\n"
- "%37 = OpConstant %32 1\n"
- "%38 = OpTypePointer Output %32\n"
- "%40 = OpConstant %12 1\n"
- "%42 = OpTypeVector %32 4\n"
- "%43 = OpConstant %6 1\n"
- "%44 = OpTypeArray %32 %43\n"
- "%45 = OpTypeStruct %42 %32 %44 %44\n"
- "%46 = OpTypeArray %45 %43\n"
- "%47 = OpTypePointer Output %46\n"
- "%48 = OpVariable %47 Output\n"
- "%50 = OpTypeStruct %42 %32 %44 %44\n"
- "%51 = OpConstant %6 32\n"
- "%52 = OpTypeArray %50 %51\n"
- "%53 = OpTypePointer Input %52\n"
- "%54 = OpVariable %53 Input\n"
- "%56 = OpTypePointer Input %42\n"
- "%59 = OpTypePointer Output %42\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%16 = OpLoad %12 %15\n"
- "%19 = OpLoad %6 %18\n"
- "%21 = OpLoad %6 %20\n"
- "%23 = OpCompositeConstruct %7 %19 %21 %22 %22\n"
- "%25 = OpAccessChain %24 %11 %13 %16\n"
- "OpStore %25 %23\n"
- "%27 = OpLoad %12 %26\n"
- "%29 = OpIEqual %28 %27 %13\n"
- "OpSelectionMerge %31 None\n"
- "OpBranchConditional %29 %30 %31\n"
- "%30 = OpLabel\n"
- "%39 = OpAccessChain %38 %36 %13\n"
- "OpStore %39 %37\n"
- "%41 = OpAccessChain %38 %36 %40\n"
- "OpStore %41 %37\n"
- "OpBranch %31\n"
- "%31 = OpLabel\n"
- "%49 = OpLoad %12 %26\n"
- "%55 = OpLoad %12 %26\n"
- "%57 = OpAccessChain %56 %54 %55 %13\n"
- "%58 = OpLoad %42 %57\n"
- "%60 = OpAccessChain %59 %48 %49 %13\n"
- "OpStore %60 %58\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tesc") << tesc << SpirVAsmBuildOptions(programCollection.usedVulkanVersion, SPIRV_VERSION_1_3);
+ programCollection.add("tesc") << glu::TessellationControlSource(tescGLSL);
}
{
- /*
+ const string teseGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Output\n"
+ "layout(binding = 2, std430) buffer Output2\n"
"{\n"
" uvec4 result[];\n"
- "};\n"
+ "} b2;\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"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- */
- const string tese =
- "; SPIR - V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 67\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %15 %23 %33 %35 %48 %53\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpDecorate %8 ArrayStride 16\n"
- "OpMemberDecorate %9 0 Offset 0\n"
- "OpDecorate %9 BufferBlock\n"
- "OpDecorate %11 DescriptorSet 0\n"
- "OpDecorate %11 Binding 2\n"
- "OpDecorate %15 BuiltIn PrimitiveId\n"
- "OpDecorate %23 BuiltIn TessCoord\n"
- "OpDecorate %33 RelaxedPrecision\n"
- "OpDecorate %33 BuiltIn SubgroupSize\n"
- "OpDecorate %34 RelaxedPrecision\n"
- "OpDecorate %35 RelaxedPrecision\n"
- "OpDecorate %35 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %36 RelaxedPrecision\n"
- "OpMemberDecorate %46 0 BuiltIn Position\n"
- "OpMemberDecorate %46 1 BuiltIn PointSize\n"
- "OpMemberDecorate %46 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %46 3 BuiltIn CullDistance\n"
- "OpDecorate %46 Block\n"
- "OpMemberDecorate %49 0 BuiltIn Position\n"
- "OpMemberDecorate %49 1 BuiltIn PointSize\n"
- "OpMemberDecorate %49 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %49 3 BuiltIn CullDistance\n"
- "OpDecorate %49 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeRuntimeArray %7\n"
- "%9 = OpTypeStruct %8\n"
- "%10 = OpTypePointer Uniform %9\n"
- "%11 = OpVariable %10 Uniform\n"
- "%12 = OpTypeInt 32 1\n"
- "%13 = OpConstant %12 0\n"
- "%14 = OpTypePointer Input %12\n"
- "%15 = OpVariable %14 Input\n"
- "%17 = OpConstant %12 2\n"
- "%20 = OpTypeFloat 32\n"
- "%21 = OpTypeVector %20 3\n"
- "%22 = OpTypePointer Input %21\n"
- "%23 = OpVariable %22 Input\n"
- "%24 = OpConstant %6 0\n"
- "%25 = OpTypePointer Input %20\n"
- "%28 = OpConstant %20 0.5\n"
- "%32 = OpTypePointer Input %6\n"
- "%33 = OpVariable %32 Input\n"
- "%35 = OpVariable %32 Input\n"
- "%38 = OpTypePointer Uniform %7\n"
- "%40 = OpTypePointer Function %20\n"
- "%42 = OpConstant %20 0.00195313\n"
- "%43 = OpTypeVector %20 4\n"
- "%44 = OpConstant %6 1\n"
- "%45 = OpTypeArray %20 %44\n"
- "%46 = OpTypeStruct %43 %20 %45 %45\n"
- "%47 = OpTypePointer Output %46\n"
- "%48 = OpVariable %47 Output\n"
- "%49 = OpTypeStruct %43 %20 %45 %45\n"
- "%50 = OpConstant %6 32\n"
- "%51 = OpTypeArray %49 %50\n"
- "%52 = OpTypePointer Input %51\n"
- "%53 = OpVariable %52 Input\n"
- "%54 = OpTypePointer Input %43\n"
- "%61 = OpConstant %20 2\n"
- "%65 = OpTypePointer Output %43\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%41 = OpVariable %40 Function\n"
- "%16 = OpLoad %12 %15\n"
- "%18 = OpIMul %12 %16 %17\n"
- "%19 = OpBitcast %6 %18\n"
- "%26 = OpAccessChain %25 %23 %24\n"
- "%27 = OpLoad %20 %26\n"
- "%29 = OpFAdd %20 %27 %28\n"
- "%30 = OpConvertFToU %6 %29\n"
- "%31 = OpIAdd %6 %19 %30\n"
- "%34 = OpLoad %6 %33\n"
- "%36 = OpLoad %6 %35\n"
- "%37 = OpCompositeConstruct %7 %34 %36 %24 %24\n"
- "%39 = OpAccessChain %38 %11 %13 %31\n"
- "OpStore %39 %37\n"
- "OpStore %41 %42\n"
- "%55 = OpAccessChain %54 %53 %13 %13\n"
- "%56 = OpLoad %43 %55\n"
- "%57 = OpAccessChain %25 %23 %24\n"
- "%58 = OpLoad %20 %57\n"
- "%59 = OpLoad %20 %41\n"
- "%60 = OpFMul %20 %58 %59\n"
- "%62 = OpFDiv %20 %60 %61\n"
- "%63 = OpCompositeConstruct %43 %62 %62 %62 %62\n"
- "%64 = OpFAdd %43 %56 %63\n"
- "%66 = OpAccessChain %65 %48 %13\n"
- "OpStore %66 %64\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tese") << tese << SpirVAsmBuildOptions(programCollection.usedVulkanVersion, SPIRV_VERSION_1_3);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(teseGLSL);
}
{
- /*
+ const string geometryGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
- "// Note: ${TOPOLOGY} variable is substituted manually at SPIR-V ASM level"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Output\n"
+ "layout(binding = 3, std430) buffer Output3\n"
"{\n"
" uvec4 result[];\n"
- "};\n"
+ "} b3;\n"
"\n"
"void main (void)\n"
"{\n"
- " result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
+ " b3.result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- */
- const string geometry =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 1\n"
- "; Bound: 42\n"
- "; Schema: 0\n"
- "OpCapability Geometry\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Geometry %4 \"main\" %15 %18 %20 %32 %36\n"
- "OpExecutionMode %4 ${TOPOLOGY}\n"
- "OpExecutionMode %4 Invocations 1\n"
- "OpExecutionMode %4 OutputPoints\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- "OpDecorate %8 ArrayStride 16\n"
- "OpMemberDecorate %9 0 Offset 0\n"
- "OpDecorate %9 BufferBlock\n"
- "OpDecorate %11 DescriptorSet 0\n"
- "OpDecorate %11 Binding 3\n"
- "OpDecorate %15 BuiltIn PrimitiveId\n"
- "OpDecorate %18 RelaxedPrecision\n"
- "OpDecorate %18 BuiltIn SubgroupSize\n"
- "OpDecorate %19 RelaxedPrecision\n"
- "OpDecorate %20 RelaxedPrecision\n"
- "OpDecorate %20 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %21 RelaxedPrecision\n"
- "OpMemberDecorate %30 0 BuiltIn Position\n"
- "OpMemberDecorate %30 1 BuiltIn PointSize\n"
- "OpMemberDecorate %30 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %30 3 BuiltIn CullDistance\n"
- "OpDecorate %30 Block\n"
- "OpMemberDecorate %33 0 BuiltIn Position\n"
- "OpMemberDecorate %33 1 BuiltIn PointSize\n"
- "OpMemberDecorate %33 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %33 3 BuiltIn CullDistance\n"
- "OpDecorate %33 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeRuntimeArray %7\n"
- "%9 = OpTypeStruct %8\n"
- "%10 = OpTypePointer Uniform %9\n"
- "%11 = OpVariable %10 Uniform\n"
- "%12 = OpTypeInt 32 1\n"
- "%13 = OpConstant %12 0\n"
- "%14 = OpTypePointer Input %12\n"
- "%15 = OpVariable %14 Input\n"
- "%17 = OpTypePointer Input %6\n"
- "%18 = OpVariable %17 Input\n"
- "%20 = OpVariable %17 Input\n"
- "%22 = OpConstant %6 0\n"
- "%24 = OpTypePointer Uniform %7\n"
- "%26 = OpTypeFloat 32\n"
- "%27 = OpTypeVector %26 4\n"
- "%28 = OpConstant %6 1\n"
- "%29 = OpTypeArray %26 %28\n"
- "%30 = OpTypeStruct %27 %26 %29 %29\n"
- "%31 = OpTypePointer Output %30\n"
- "%32 = OpVariable %31 Output\n"
- "%33 = OpTypeStruct %27 %26 %29 %29\n"
- "%34 = OpTypeArray %33 %28\n"
- "%35 = OpTypePointer Input %34\n"
- "%36 = OpVariable %35 Input\n"
- "%37 = OpTypePointer Input %27\n"
- "%40 = OpTypePointer Output %27\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%16 = OpLoad %12 %15\n"
- "%19 = OpLoad %6 %18\n"
- "%21 = OpLoad %6 %20\n"
- "%23 = OpCompositeConstruct %7 %19 %21 %22 %22\n"
- "%25 = OpAccessChain %24 %11 %13 %16\n"
- "OpStore %25 %23\n"
- "%38 = OpAccessChain %37 %36 %13 %13\n"
- "%39 = OpLoad %27 %38\n"
- "%41 = OpAccessChain %40 %32 %13\n"
- "OpStore %41 %39\n"
- "OpEmitVertex\n"
- "OpEndPrimitive\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- addGeometryShadersFromTemplate(geometry, SpirVAsmBuildOptions(programCollection.usedVulkanVersion, SPIRV_VERSION_1_3), programCollection.spirvAsmSources);
+ addGeometryShadersFromTemplate(geometryGLSL, programCollection);
}
{
- /*
+ const string fragmentGLSL =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"layout(location = 0) out uvec4 data;\n"
"{\n"
" data = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\n"
"}\n";
- */
- const string fragment =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 1\n"
- "; Bound: 17\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "OpCapability GroupNonUniform\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Fragment %4 \"main\" %9 %11 %13\n"
- "OpExecutionMode %4 OriginUpperLeft\n"
- "OpDecorate %9 Location 0\n"
- "OpDecorate %11 RelaxedPrecision\n"
- "OpDecorate %11 Flat\n"
- "OpDecorate %11 BuiltIn SubgroupSize\n"
- "OpDecorate %12 RelaxedPrecision\n"
- "OpDecorate %13 RelaxedPrecision\n"
- "OpDecorate %13 Flat\n"
- "OpDecorate %13 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %14 RelaxedPrecision\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypePointer Output %7\n"
- "%9 = OpVariable %8 Output\n"
- "%10 = OpTypePointer Input %6\n"
- "%11 = OpVariable %10 Input\n"
- "%13 = OpVariable %10 Input\n"
- "%15 = OpConstant %6 0\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%12 = OpLoad %6 %11\n"
- "%14 = OpLoad %6 %13\n"
- "%16 = OpCompositeConstruct %7 %12 %14 %15 %15\n"
- "OpStore %9 %16\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
-
- programCollection.spirvAsmSources.add("fragment") << fragment << SpirVAsmBuildOptions(programCollection.usedVulkanVersion, SPIRV_VERSION_1_3);
+ programCollection.add("fragment") << glu::FragmentSource(fragmentGLSL);
}
subgroups::addNoSubgroupShader(programCollection);
}
}
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
if ("gl_SubgroupSize" == caseDef.varName)
{
return makeVertexFrameBufferTest(
- context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
}
else if ("gl_SubgroupInvocationID" == caseDef.varName)
{
return makeVertexFrameBufferTest(
- context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
}
else
{
caseDef.varName + ")!");
}
}
- else if ((VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) & caseDef.shaderStage )
+ else if ((SHADER_STAGE_TESS_EVALUATION_BIT | SHADER_STAGE_TESS_CONTROL_BIT) & caseDef.shaderStage )
{
if ("gl_SubgroupSize" == caseDef.varName)
{
return makeTessellationEvaluationFrameBufferTest(
- context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
}
else if ("gl_SubgroupInvocationID" == caseDef.varName)
{
return makeTessellationEvaluationFrameBufferTest(
- context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
}
else
{
caseDef.varName + ")!");
}
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT & caseDef.shaderStage )
+ else if (SHADER_STAGE_GEOMETRY_BIT & caseDef.shaderStage )
{
if ("gl_SubgroupSize" == caseDef.varName)
{
return makeGeometryFrameBufferTest(
- context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
}
else if ("gl_SubgroupInvocationID" == caseDef.varName)
{
return makeGeometryFrameBufferTest(
- context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+ context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
}
else
{
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
if ("gl_SubgroupSize" == caseDef.varName)
{
- return makeComputeTest(context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupSize);
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupSize);
}
else if ("gl_SubgroupInvocationID" == caseDef.varName)
{
- return makeComputeTest(context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupInvocationID);
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupInvocationID);
}
else if ("gl_NumSubgroups" == caseDef.varName)
{
- return makeComputeTest(context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeNumSubgroups);
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeNumSubgroups);
}
else if ("gl_SubgroupID" == caseDef.varName)
{
- return makeComputeTest(context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupID);
+ return makeComputeTest(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkComputeSubgroupID);
}
else
{
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ subgroups::ShaderStageFlags stages = (subgroups::ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if (VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
if ("gl_SubgroupSize" == caseDef.varName)
{
- return subgroups::allStages(context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize, stages);
+ return subgroups::allStages(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize, stages);
}
else if ("gl_SubgroupInvocationID" == caseDef.varName)
{
- return subgroups::allStages(context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID, stages);
+ return subgroups::allStages(context, FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID, stages);
}
else
{
}
}
-tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsBuiltinVarTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup builtin variable tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup builtin variable tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup builtin variable tests: framebuffer"));
const char* const all_stages_vars[] =
"SubgroupID"
};
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
for (int a = 0; a < DE_LENGTH_OF_ARRAY(all_stages_vars); ++a)
const std::string varLower = de::toLower(var);
{
- const CaseDefinition caseDef = { "gl_" + var, VK_SHADER_STAGE_ALL_GRAPHICS};
+ const CaseDefinition caseDef = { "gl_" + var, SHADER_STAGE_ALL_GRAPHICS};
- addFunctionCaseWithPrograms(graphicGroup.get(),
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
varLower, "",
supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {"gl_" + var, VK_SHADER_STAGE_COMPUTE_BIT};
- addFunctionCaseWithPrograms(computeGroup.get(),
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
varLower + "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {"gl_" + var, stages[stageIndex]};
- addFunctionCaseWithPrograms(framebufferGroup.get(),
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
varLower + "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
{
const std::string var = compute_only_vars[a];
- const CaseDefinition caseDef = {"gl_" + var, VK_SHADER_STAGE_COMPUTE_BIT};
+ const CaseDefinition caseDef = {"gl_" + var, SHADER_STAGE_COMPUTE_BIT};
- addFunctionCaseWithPrograms(computeGroup.get(), de::toLower(var), "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), de::toLower(var), "",
supportedCheck, initPrograms, test, caseDef);
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "builtin_var", "Subgroup builtin variable tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSBUILTINVARTESTS_HPP
-#define _VKTSUBGROUPSBUILTINVARTESTS_HPP
+#ifndef _GLCSUBGROUPSBUILTINVARTESTS_HPP
+#define _GLCSUBGROUPSBUILTINVARTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsBuiltinVarTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSBUILTINVARTESTS_HPP
+#endif // _GLCSUBGROUPSBUILTINVARTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsClusteredTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsClusteredTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
enum OpType
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 1);
+ return glc::subgroups::check(datas, width, 1);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
}
std::string getOpTypeName(int opType)
}
}
-std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+std::string getOpTypeOperation(int opType, Format format, std::string lhs, std::string rhs)
{
switch (opType)
{
{
default:
return "min(" + lhs + ", " + rhs + ")";
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R32_SFLOAT:
+ case 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:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
return "mix(mix(min(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
}
case OPTYPE_CLUSTERED_MAX:
{
default:
return "max(" + lhs + ", " + rhs + ")";
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R32_SFLOAT:
+ case 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:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
return "mix(mix(max(" + lhs + ", " + rhs + "), " + lhs + ", isnan(" + rhs + ")), " + rhs + ", isnan(" + lhs + "))";
}
case OPTYPE_CLUSTERED_AND:
{
default:
return lhs + " & " + rhs;
- case VK_FORMAT_R8_USCALED:
+ case FORMAT_R32_BOOL:
return lhs + " && " + rhs;
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return "bvec2(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y)";
- case VK_FORMAT_R8G8B8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
return "bvec3(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z)";
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32A32_BOOL:
return "bvec4(" + lhs + ".x && " + rhs + ".x, " + lhs + ".y && " + rhs + ".y, " + lhs + ".z && " + rhs + ".z, " + lhs + ".w && " + rhs + ".w)";
}
case OPTYPE_CLUSTERED_OR:
{
default:
return lhs + " | " + rhs;
- case VK_FORMAT_R8_USCALED:
+ case FORMAT_R32_BOOL:
return lhs + " || " + rhs;
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return "bvec2(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y)";
- case VK_FORMAT_R8G8B8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
return "bvec3(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z)";
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32A32_BOOL:
return "bvec4(" + lhs + ".x || " + rhs + ".x, " + lhs + ".y || " + rhs + ".y, " + lhs + ".z || " + rhs + ".z, " + lhs + ".w || " + rhs + ".w)";
}
case OPTYPE_CLUSTERED_XOR:
{
default:
return lhs + " ^ " + rhs;
- case VK_FORMAT_R8_USCALED:
+ case FORMAT_R32_BOOL:
return lhs + " ^^ " + rhs;
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return "bvec2(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y)";
- case VK_FORMAT_R8G8B8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
return "bvec3(" + lhs + ".x ^^ " + rhs + ".x, " + lhs + ".y ^^ " + rhs + ".y, " + lhs + ".z ^^ " + rhs + ".z)";
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32A32_BOOL:
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)
+std::string getIdentity(int opType, Format format)
{
bool isFloat = false;
bool isInt = false;
default:
DE_FATAL("Unhandled format!");
break;
- case VK_FORMAT_R32_SINT:
- case VK_FORMAT_R32G32_SINT:
- case VK_FORMAT_R32G32B32_SINT:
- case VK_FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case 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:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case 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:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
break; // bool types are not anything
}
}
}
-std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+std::string getCompare(int opType, Format 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32_SINT:
return "(" + lhs + " == " + rhs + ")";
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
switch (opType)
{
default:
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:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
switch (opType)
{
default:
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
- VkFormat format;
+ ShaderStageFlags shaderStage;
+ Format format;
};
std::string getBodySource(CaseDefinition caseDef)
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
-
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
std::string bdy = getBodySource(caseDef);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450 )<< "\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertexSrc.str()) <<buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
{
std::string bdy = getBodySource(caseDef);
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
<< "};\n"
<< " result[offset] = tempResult ? 1 : 0;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
"#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"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_VertexIndex] = tempResult ? 1 : 0;\n"
+ " b0.result[gl_VertexID] = tempResult ? 1 : 0;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
"#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 = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveID] = tempResult ? 1 : 0;\n"
+ " b1.result[gl_PrimitiveID] = tempResult ? 1 : 0;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
"#extension GL_KHR_shader_subgroup_clustered: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult ? 1 : 0;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult ? 1 : 0;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveIDIn] = tempResult ? 1 : 0;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult ? 1 : 0;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u), programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
"#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 = 4, std430) readonly buffer Buffer2\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
+ bdy +
" result = tempResult ? 1 : 0;\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_CLUSTERED_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_CLUSTERED_BIT))
TCU_THROW(NotSupportedError, "Device does not support subgroup clustered operations");
if (subgroups::isDoubleFormat(caseDef.format) &&
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
-
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if (VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData;
inputData.binding = 4u;
inputData.stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsClusteredTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup clustered category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup clustered category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup clustered category tests: framebuffer"));
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT
};
- const VkFormat formats[] =
+ const Format 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,
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
};
for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
{
- const VkFormat format = formats[formatIndex];
+ const Format format = formats[formatIndex];
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_CLUSTERED_LAST; ++opTypeIndex)
{
{
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:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
isBool = true;
break;
}
+"_" + subgroups::getFormatNameForGLSL(format);
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format};
- addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format};
- addFunctionCaseWithPrograms(graphicGroup.get(), name,
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name,
"", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
- addFunctionCaseWithPrograms(framebufferGroup.get(), name +"_" + getShaderStageName(caseDef.shaderStage), "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name +"_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "clustered", "Subgroup clustered category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSCLUSTEREDTESTS_HPP
-#define _VKTSUBGROUPSCLUSTEREDTESTS_HPP
+#ifndef _GLCSUBGROUPSCLUSTEREDTESTS_HPP
+#define _GLCSUBGROUPSCLUSTEREDTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsClusteredTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSCLUSTEREDTESTS_HPP
+#endif // _GLCSUBGROUPSCLUSTEREDTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
- * Copyright (c) 2018 NVIDIA Corporation
+ * Copyright (c) 2018-2019 NVIDIA Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsPartitionedTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsPartitionedTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
enum OpType
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 (0xFFFFFF != val)
- {
- return false;
- }
- }
-
- return true;
+ return glc::subgroups::check(datas, width, 0xFFFFFF);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(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 (0xFFFFFF != data[offset])
- {
- return false;
- }
- }
- }
- }
- }
- }
- }
-
- return true;
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0xFFFFFF);
}
std::string getOpTypeName(int opType)
}
}
-std::string getIdentity(int opType, vk::VkFormat format)
+std::string getIdentity(int opType, Format format)
{
bool isFloat = false;
bool isInt = false;
default:
DE_FATAL("Unhandled format!");
return "";
- case VK_FORMAT_R32_SINT:
- case VK_FORMAT_R32G32_SINT:
- case VK_FORMAT_R32G32B32_SINT:
- case VK_FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case 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:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case 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:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
break; // bool types are not anything
}
}
}
-std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::string rhs)
+std::string getCompare(int opType, Format 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32_SINT:
return "(" + lhs + " == " + rhs + ")";
- case VK_FORMAT_R32_SFLOAT:
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
switch (opType)
{
default:
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:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
switch (opType)
{
default:
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
- VkFormat format;
+ ShaderStageFlags shaderStage;
+ Format format;
};
string getTestString(const CaseDefinition &caseDef)
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
std::ostringstream bdy;
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
bdy << getTestString(caseDef);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertexSrc.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
{
const string bdy = getTestString(caseDef);
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
std::ostringstream src;
<< "#extension GL_NV_shader_subgroup_partitioned: enable\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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
<< "};\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
"#extension GL_NV_shader_subgroup_partitioned: enable\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"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy+
- " result[gl_VertexIndex] = tempResult;\n"
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
"#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 = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveID] = tempResult;\n"
+ " b1.result[gl_PrimitiveID] = tempResult;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
"#extension GL_KHR_shader_subgroup_arithmetic: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
"{\n"
" uvec4 mask = subgroupBallot(true);\n"
+ bdy +
- " result[gl_PrimitiveIDIn] = tempResult;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
"#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 = 4, std430) readonly buffer Buffer2\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
+ bdy +
" result = tempResult;\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
}
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_PARTITIONED_BIT_NV))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup partitioned operations");
}
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
-
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if(!checkShaderStages(context,caseDef))
{
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
-
- if ( VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if ( SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData;
inputData.binding = 4u;
inputData.stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, &inputData,
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData,
1, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsPartitionedTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsPartitionedTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
- testCtx, "partitioned", "NV_shader_subgroup_partitioned category tests"));
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
+ testCtx, "graphics", "Subgroup partitioned category tests: graphics"));
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
+ testCtx, "compute", "Subgroup partitioned category tests: compute"));
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
+ testCtx, "framebuffer", "Subgroup partitioned category tests: framebuffer"));
+
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
+ const Format 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,
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
};
for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
{
- const VkFormat format = formats[formatIndex];
+ const Format format = formats[formatIndex];
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
{
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:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
isBool = true;
break;
}
// Skip bool when its not the bitwise category.
continue;
}
- std::string op = getOpTypeName(opTypeIndex);
+ const std::string name = de::toLower(getOpTypeName(opTypeIndex)) + "_" +
+ subgroups::getFormatNameForGLSL(format);
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format};
- addFunctionCaseWithPrograms(group.get(),
- de::toLower(op) + "_" +
- subgroups::getFormatNameForGLSL(format) +
- "_" + getShaderStageName(caseDef.shaderStage),
- "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
+ name, "", supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format};
- addFunctionCaseWithPrograms(group.get(),
- de::toLower(op) + "_" +
- subgroups::getFormatNameForGLSL(format) +
- "_graphic",
- "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
+ name, "", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
- addFunctionCaseWithPrograms(group.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) +
- "_" + getShaderStageName(caseDef.shaderStage) + "_framebuffer", "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
+ name + "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
+ testCtx, "partitioned", "NV_shader_subgroup_partitioned category tests"));
+
+ group->addChild(graphicGroup.release());
+ group->addChild(computeGroup.release());
+ group->addChild(framebufferGroup.release());
return group.release();
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSPARTITIONEDTESTS_HPP
-#define _VKTSUBGROUPSPARTITIONEDTESTS_HPP
+#ifndef _GLCSUBGROUPSPARTITIONEDTESTS_HPP
+#define _GLCSUBGROUPSPARTITIONEDTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
- * Copyright (c) 2018 NVIDIA Corporation
+ * Copyright (c) 2018-2019 NVIDIA Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsPartitionedTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsPartitionedTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSPARTITIONEDTESTS_HPP
+#endif // _GLCSUBGROUPSPARTITIONEDTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsQuadTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsQuadTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
enum OpType
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 1);
+ return glc::subgroups::check(datas, width, 1);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
}
std::string getOpTypeName(int opType)
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
- VkFormat format;
+ ShaderStageFlags shaderStage;
+ Format format;
int direction;
};
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
std::string swapTable[OPTYPE_LAST];
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
swapTable[OPTYPE_QUAD_BROADCAST] = "";
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_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(location = 0) out float result;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertexSrc.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
-
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
ostringstream evaluationSource;
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
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)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "layout(binding = 1, std430) buffer Buffer1\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
<< "};\n"
<< " }\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
"#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"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
+ sourceType +
" if (subgroupBallotBitExtract(mask, otherID))\n"
" {\n"
- " result[gl_VertexIndex] = (op == data[otherID]) ? 1 : 0;\n"
+ " b0.result[gl_VertexID] = (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"
+ " b0.result[gl_VertexID] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
" }\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
"#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 = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
+ sourceType +
" if (subgroupBallotBitExtract(mask, otherID))\n"
" {\n"
- " result[gl_PrimitiveID] = (op == data[otherID]) ? 1 : 0;\n"
+ " b1.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"
+ " b1.result[gl_PrimitiveID] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
" }\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
"#extension GL_KHR_shader_subgroup_quad: enable\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
+ sourceType +
" if (subgroupBallotBitExtract(mask, otherID))\n"
" {\n"
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = (op == data[otherID]) ? 1 : 0;\n"
+ " b2.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"
+ " b2.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"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
+ sourceType +
" if (subgroupBallotBitExtract(mask, otherID))\n"
" {\n"
- " result[gl_PrimitiveIDIn] = (op == data[otherID]) ? 1 : 0;\n"
+ " b3.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"
+ " b3.result[gl_PrimitiveIDIn] = 1; // Invocation we read from was inactive, so we can't verify results!\n"
" }\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
"#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 = 4, std430) readonly buffer Buffer2\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data[];\n"
"};\n"
" result = 1; // Invocation we read from was inactive, so we can't verify results!\n"
" }\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
}
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_QUAD_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_QUAD_BIT))
TCU_THROW(NotSupportedError, "Device does not support subgroup quad operations");
subgroups::SSBOData inputData;
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
- inputData.initializeType = subgroups::SSBOData::InitializeNonZero;;
-
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 0u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData, 1, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if (VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData;
inputData.binding = 4u;
inputData.stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsQuadTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup arithmetic category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup arithmetic category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer"));
- const VkFormat formats[] =
+ const Format 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,
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
};
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
for (int direction = 0; direction < 4; ++direction)
{
for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
{
- const VkFormat format = formats[formatIndex];
+ const Format format = formats[formatIndex];
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
name << "_" << subgroups::getFormatNameForGLSL(format);
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format, direction};
- addFunctionCaseWithPrograms(computeGroup.get(), name.str(), "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format, direction};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name.str(), "", supportedCheck, initPrograms, test, caseDef);
}
{
const CaseDefinition caseDef =
{
opTypeIndex,
- VK_SHADER_STAGE_ALL_GRAPHICS,
+ SHADER_STAGE_ALL_GRAPHICS,
format,
direction
};
- addFunctionCaseWithPrograms(graphicGroup.get(), name.str(), "", supportedCheck, initPrograms, test, caseDef);
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name.str(), "", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format, direction};
- addFunctionCaseWithPrograms(framebufferGroup.get(), name.str()+"_"+ getShaderStageName(caseDef.shaderStage), "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name.str()+"_"+ getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "quad", "Subgroup quad category tests"));
group->addChild(graphicGroup.release());
return group.release();
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSQUADTESTS_HPP
-#define _VKTSUBGROUPSQUADTESTS_HPP
+#ifndef _GLCSUBGROUPSQUADTESTS_HPP
+#define _GLCSUBGROUPSQUADTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsQuadTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSQUADTESTS_HPP
+#endif // _GLCSUBGROUPSQUADTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsShapeTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsShapeTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 1);
+ return glc::subgroups::check(datas, width, 1);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
}
enum OpType
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
+ ShaderStageFlags shaderStage;
};
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
std::ostringstream bdy;
std::string extension = (OPTYPE_CLUSTERED == caseDef.opType) ?
"#extension GL_KHR_shader_subgroup_clustered: enable\n" :
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
extension += "#extension GL_KHR_shader_subgroup_ballot: enable\n";
<< " }\n";
}
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertexSrc.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
<< " }\n";
}
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
<< " result[offset] = tempResult;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
const string vertex =
"#version 450\n"
+ extension +
- "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b0;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy.str() +
- " result[gl_VertexIndex] = tempResult;\n"
+ " b0.result[gl_VertexID] = tempResult;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
"#version 450\n"
+ extension +
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b1;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy.str() +
- " result[gl_PrimitiveID] = 1;\n"
+ " b1.result[gl_PrimitiveID] = 1;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
"#version 450\n"
+ extension +
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b2;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy.str() +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = 1;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = 1;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
+ extension +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b3;\n"
"\n"
"void main (void)\n"
"{\n"
+ bdy.str() +
- " result[gl_PrimitiveIDIn] = tempResult;\n"
+ " b3.result[gl_PrimitiveIDIn] = tempResult;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
" result = tempResult;\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
}
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, 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))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, 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))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_QUAD_BIT))
{
TCU_THROW(NotSupportedError, "Subgroup shape tests require that quad operations are supported!");
}
}
}
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BASIC_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_BASIC_BIT))
{
return tcu::TestStatus::fail(
"Subgroup feature " +
- subgroups::getShaderStageName(VK_SUBGROUP_FEATURE_BASIC_BIT) +
+ subgroups::getSubgroupFeatureName(SUBGROUP_FEATURE_BASIC_BIT) +
" is a required capability!");
}
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
subgroups::getShaderStageName(caseDef.shaderStage) +
" is required to support subgroup operations!");
}
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, DE_NULL, 0, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
-
- if (VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsShapeTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup shape category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup shape category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup shape category tests: framebuffer"));
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
const std::string op = de::toLower(getOpTypeName(opTypeIndex));
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT};
- addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), op, "", supportedCheck, initPrograms, test, caseDef);
}
const CaseDefinition caseDef =
{
opTypeIndex,
- VK_SHADER_STAGE_ALL_GRAPHICS
+ SHADER_STAGE_ALL_GRAPHICS
};
- addFunctionCaseWithPrograms(graphicGroup.get(),
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
op, "",
supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex]};
- addFunctionCaseWithPrograms(framebufferGroup.get(),op + "_" + getShaderStageName(caseDef.shaderStage), "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),op + "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "shape", "Subgroup shape category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSSHAPETESTS_HPP
-#define _VKTSUBGROUPSSHAPETESTS_HPP
+#ifndef _GLCSUBGROUPSSHAPETESTS_HPP
+#define _GLCSUBGROUPSSHAPETESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsShapeTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSSHAPETESTS_HPP
+#endif // _GLCSUBGROUPSSHAPETESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsShuffleTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsShuffleTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+namespace glc
+{
+namespace subgroups
+{
namespace
{
enum OpType
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 1);
+ return glc::subgroups::check(datas, width, 1);
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1);
}
std::string getOpTypeName(int opType)
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
- VkFormat format;
+ ShaderStageFlags shaderStage;
+ Format format;
};
const std::string to_string(int x) {
const std::string DeclSource(CaseDefinition caseDef, int baseBinding)
{
return
- "layout(set = 0, binding = " + to_string(baseBinding) + ", std430) readonly buffer Buffer2\n"
+ "layout(binding = " + to_string(baseBinding) + ", std430) readonly buffer BufferB0\n"
"{\n"
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n"
"};\n"
- "layout(set = 0, binding = " + to_string(baseBinding + 1) + ", std430) readonly buffer Buffer3\n"
+ "layout(binding = " + to_string(baseBinding + 1) + ", std430) readonly buffer BufferB1\n"
"{\n"
" uint data2[];\n"
"};\n";
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
-
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
const std::string extSource =
const std::string testSource = TestSource(caseDef);
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
- << "layout(location = 0) in highp vec4 in_position;\n"
- << "layout(location = 0) out float result;\n"
<< extSource
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(location = 0) in highp vec4 in_position;\n"
+ << "layout(location = 0) out float result;\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer1\n"
<< "{\n"
<< " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertexSrc.str()) << buildOptions;
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< "layout(points) in;\n"
<< "layout(points, max_vertices = 1) out;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer1\n"
<< "{\n"
<< " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(vertices = 2) out;\n"
<< "layout(location = 0) out float out_color[];\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer1\n"
<< "{\n"
<< " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_ballot: enable\n"
<< "layout(isolines, equal_spacing, ccw ) in;\n"
<< "layout(location = 0) out float out_color;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer0\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
- << "layout(set = 0, binding = 1) uniform Buffer2\n"
+ << "layout(binding = 1) uniform Buffer1\n"
<< "{\n"
<< " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
else
{
const std::string testSource = TestSource(caseDef);
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
std::ostringstream src;
- src << extSource
- << "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"
+ src << extSource
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer0\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
<< " result[offset] = temp_res;\n"
<< "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
{
const string vertex =
extSource +
- "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b0;\n"
+ declSource +
"\n"
"void main (void)\n"
"{\n"
+ testSource +
- " result[gl_VertexIndex] = temp_res;\n"
+ " b0.result[gl_VertexID] = temp_res;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
const string tesc =
extSource +
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b1;\n"
+ declSource +
"\n"
"void main (void)\n"
"{\n"
+ testSource +
- " result[gl_PrimitiveID] = temp_res;\n"
+ " b1.result[gl_PrimitiveID] = temp_res;\n"
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
const string tese =
extSource +
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b2;\n"
+ declSource +
"\n"
"void main (void)\n"
"{\n"
+ testSource +
- " result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = temp_res;\n"
+ " b2.result[gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5)] = temp_res;\n"
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
extSource +
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
+ "} b3;\n"
+ declSource +
"\n"
"void main (void)\n"
"{\n"
+ testSource +
- " result[gl_PrimitiveIDIn] = temp_res;\n"
+ " b3.result[gl_PrimitiveIDIn] = temp_res;\n"
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
const string fragment =
" result = temp_res;\n"
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
{
case OPTYPE_SHUFFLE:
case OPTYPE_SHUFFLE_XOR:
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_SHUFFLE_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, 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))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations");
}
inputData[0].format = caseDef.format;
inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 0u;
- inputData[1].format = VK_FORMAT_R32_UINT;
+ inputData[1].format = FORMAT_R32_UINT;
inputData[1].numElements = inputData[0].numElements;
inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
-
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ inputData[1].binding = 1u;
+
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
{
case OPTYPE_SHUFFLE:
case OPTYPE_SHUFFLE_XOR:
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_SHUFFLE_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, 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))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations");
}
TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
}
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
inputData[0].format = caseDef.format;
inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[0].binding = 1u;
- inputData[1].format = VK_FORMAT_R32_UINT;
+ inputData[1].format = FORMAT_R32_UINT;
inputData[1].numElements = inputData[0].numElements;
inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData[1].binding = 2u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, inputData, 2, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, inputData, 2, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- if (VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData[2];
inputData[0].binding = 4u;
inputData[0].stages = stages;
- inputData[1].format = VK_FORMAT_R32_UINT;
+ inputData[1].format = FORMAT_R32_UINT;
inputData[1].numElements = inputData[0].numElements;
inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
inputData[1].binding = 5u;
inputData[1].stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, stages);
}
}
}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx)
+deqp::TestCaseGroup* createSubgroupsShuffleTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup shuffle category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup shuffle category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup shuffle category tests: framebuffer"));
- const VkFormat formats[] =
+ const Format 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,
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
};
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
{
- const VkFormat format = formats[formatIndex];
+ const Format format = formats[formatIndex];
for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
{
const CaseDefinition caseDef =
{
opTypeIndex,
- VK_SHADER_STAGE_ALL_GRAPHICS,
+ SHADER_STAGE_ALL_GRAPHICS,
format
};
- addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format};
- addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
- addFunctionCaseWithPrograms(framebufferGroup.get(), name + "_" + getShaderStageName(caseDef.shaderStage), "",
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name + "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "shuffle", "Subgroup shuffle category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSSHUFFLETESTS_HPP
-#define _VKTSUBGROUPSSHUFFLETESTS_HPP
+#ifndef _GLCSUBGROUPSSHUFFLETESTS_HPP
+#define _GLCSUBGROUPSSHUFFLETESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsShuffleTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSSHUFFLETESTS_HPP
+#endif // _GLCSUBGROUPSSHUFFLETESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \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 "vktSubgroupsPartitionedTests.hpp"
-#include "vktSubgroupsShuffleTests.hpp"
-#include "vktSubgroupsQuadTests.hpp"
-#include "vktSubgroupsShapeTests.hpp"
-#include "vktTestGroupUtil.hpp"
+#include "glcSubgroupsTests.hpp"
+#include "glcSubgroupsBuiltinVarTests.hpp"
+#include "glcSubgroupsBuiltinMaskVarTests.hpp"
+#include "glcSubgroupsBasicTests.hpp"
+#include "glcSubgroupsVoteTests.hpp"
+#include "glcSubgroupsBallotTests.hpp"
+#include "glcSubgroupsBallotBroadcastTests.hpp"
+#include "glcSubgroupsBallotOtherTests.hpp"
+#include "glcSubgroupsArithmeticTests.hpp"
+#include "glcSubgroupsClusteredTests.hpp"
+#include "glcSubgroupsPartitionedTests.hpp"
+#include "glcSubgroupsShuffleTests.hpp"
+#include "glcSubgroupsQuadTests.hpp"
+#include "glcSubgroupsShapeTests.hpp"
+//#include "glcTestGroupUtil.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-namespace
-{
-
-void createChildren(tcu::TestCaseGroup* subgroupsTests)
+/** Constructor.
+ *
+ * @param context Rendering context.
+ */
+GlSubgroupTests::GlSubgroupTests(deqp::Context& context)
+ : TestCaseGroup(context, "subgroups", "Shader Subgroup Operation tests")
{
- 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(createSubgroupsPartitionedTests(testCtx));
- subgroupsTests->addChild(createSubgroupsShuffleTests(testCtx));
- subgroupsTests->addChild(createSubgroupsQuadTests(testCtx));
- subgroupsTests->addChild(createSubgroupsShapeTests(testCtx));
}
-} // anonymous
-
-tcu::TestCaseGroup* createTests(tcu::TestContext& testCtx)
+/** Initializes the test group contents. */
+void GlSubgroupTests::init()
{
- return createTestGroup(
- testCtx, "subgroups", "Subgroups tests", createChildren);
+ addChild(createSubgroupsBuiltinVarTests(m_context));
+ addChild(createSubgroupsBuiltinMaskVarTests(m_context));
+ addChild(createSubgroupsBasicTests(m_context));
+ addChild(createSubgroupsVoteTests(m_context));
+ addChild(createSubgroupsBallotTests(m_context));
+ addChild(createSubgroupsBallotBroadcastTests(m_context));
+ addChild(createSubgroupsBallotOtherTests(m_context));
+ addChild(createSubgroupsArithmeticTests(m_context));
+ addChild(createSubgroupsClusteredTests(m_context));
+ addChild(createSubgroupsPartitionedTests(m_context));
+ addChild(createSubgroupsShuffleTests(m_context));
+ addChild(createSubgroupsQuadTests(m_context));
+ addChild(createSubgroupsShapeTests(m_context));
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSTESTS_HPP
-#define _VKTSUBGROUPSTESTS_HPP
+#ifndef _GLCSUBGROUPSTESTS_HPP
+#define _GLCSUBGROUPSTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "tcuTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createTests(tcu::TestContext& testCtx);
+/** Test group which encapsulates all subgroup conformance tests */
+class GlSubgroupTests : public deqp::TestCaseGroup
+{
+public:
+ /* Public methods */
+ GlSubgroupTests(deqp::Context& context);
+
+ void init();
+
+private:
+ GlSubgroupTests(const GlSubgroupTests& other);
+ GlSubgroupTests& operator=(const GlSubgroupTests& other);
+};
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSTESTS_HPP
+#endif // _GLCSUBGROUPSTESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests Utils
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include "deRandom.hpp"
#include "tcuCommandLine.hpp"
#include "tcuStringTemplate.hpp"
-#include "vkBarrierUtil.hpp"
-#include "vkImageUtil.hpp"
-#include "vkTypeUtil.hpp"
-#include "vkCmdUtil.hpp"
-#include "vkObjUtil.hpp"
+#include "gluContextInfo.hpp"
+#include "gluShaderUtil.hpp"
-using namespace tcu;
+using namespace deqp;
using namespace std;
-using namespace vk;
-using namespace vkt;
+using namespace glc;
+using namespace glw;
namespace
{
-deUint32 getFormatSizeInBytes(const VkFormat format)
+// debug callback function
+// To use:
+// gl.enable(GL_DEBUG_OUTPUT);
+// gl.debugMessageCallback(debugCallback, &context);
+//
+void debugCallback(GLenum source, GLenum type, GLuint id, GLenum severity,
+ GLsizei length, const char * message, const void * userParam)
{
+ glc::Context *context = (glc::Context *)userParam;
+
+ tcu::TestLog& log = context->getDeqpContext().getTestContext().getLog();
+
+ log << tcu::TestLog::Message
+ << "DEBUG: source = " << source << ", type= " << type << ", id = " << id << ", severity = " << severity
+ << ", length = " << length << "\n"
+ << "DEBUG: `" << message << "`"
+ << tcu::TestLog::EndMessage;
+
+}
+
+// getFormatReadInfo
+// returns the stride in bytes
+deUint32 getFormatReadInfo(const subgroups::Format format, GLenum &readFormat, GLenum &readType)
+{
+ using namespace subgroups;
+ switch (format)
+ {
+ default:
+ DE_FATAL("Unhandled format!");
+ // fall-through
+ case FORMAT_R32G32B32A32_SFLOAT:
+ readFormat = GL_RGBA;
+ readType = GL_FLOAT;
+ return 4u;
+ case FORMAT_R32G32_SFLOAT:
+ readFormat = GL_RG;
+ readType = GL_FLOAT;
+ return 2u;
+ case FORMAT_R32_UINT:
+ readFormat = GL_RED_INTEGER;
+ readType = GL_UNSIGNED_INT;
+ return 1u;
+ case FORMAT_R32G32B32A32_UINT:
+ readFormat = GL_RGBA_INTEGER;
+ readType = GL_UNSIGNED_INT;
+ return 4u;
+ }
+}
+deUint32 getFormatSizeInBytes(const subgroups::Format format)
+{
+ using namespace subgroups;
switch (format)
{
default:
DE_FATAL("Unhandled format!");
return 0;
- case VK_FORMAT_R32_SINT:
- case VK_FORMAT_R32_UINT:
+ case FORMAT_R32_SINT:
+ case FORMAT_R32_UINT:
return sizeof(deInt32);
- case VK_FORMAT_R32G32_SINT:
- case VK_FORMAT_R32G32_UINT:
+ case FORMAT_R32G32_SINT:
+ case 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:
+ case FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32G32B32A32_UINT:
return static_cast<deUint32>(sizeof(deInt32) * 4);
- case VK_FORMAT_R32_SFLOAT:
+ case FORMAT_R32_SFLOAT:
return 4;
- case VK_FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
return 8;
- case VK_FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
return 16;
- case VK_FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
return 16;
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R64_SFLOAT:
return 8;
- case VK_FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
return 16;
- case VK_FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
return 32;
- case VK_FORMAT_R64G64B64A64_SFLOAT:
+ case 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:
+ case FORMAT_R32_BOOL:
return sizeof(deInt32);
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return static_cast<deUint32>(sizeof(deInt32) * 2);
- case VK_FORMAT_R8G8B8_USCALED:
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
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 VkVertexInputBindingDescription* vertexInputBindingDescription = DE_NULL,
- const VkVertexInputAttributeDescription* vertexInputAttributeDescriptions = DE_NULL,
- const bool frameBufferTests = false,
- const vk::VkFormat attachmentFormat = VK_FORMAT_R32G32B32A32_SFLOAT)
+de::MovePtr<glu::ShaderProgram> makeGraphicsPipeline(glc::Context& context,
+ const subgroups::ShaderStageFlags stages,
+ const GlslSource * vshader,
+ const GlslSource * fshader,
+ const GlslSource * gshader,
+ const GlslSource * tcshader,
+ const GlslSource * teshader)
{
- std::vector<VkViewport> noViewports;
- std::vector<VkRect2D> noScissors;
-
- const VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo =
- {
- VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- 0u, // VkPipelineVertexInputStateCreateFlags flags;
- vertexInputBindingDescription == DE_NULL ? 0u : 1u, // deUint32 vertexBindingDescriptionCount;
- vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
- vertexInputAttributeDescriptions == DE_NULL ? 0u : 1u, // deUint32 vertexAttributeDescriptionCount;
- vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
- };
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const bool doShaderLog = log.isShaderLoggingEnabled();
+ DE_UNREF(stages); // only used for asserts
- const deUint32 numChannels = getNumUsedChannels(mapVkFormat(attachmentFormat).order);
- const VkColorComponentFlags colorComponent =
- numChannels == 1 ? VK_COLOR_COMPONENT_R_BIT :
- numChannels == 2 ? VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT :
- numChannels == 3 ? VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT :
- VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+ map<string, string> templateArgs;
+// string versionDecl(getGLSLVersionDeclaration(context.getGLSLVersion()));
+// templateArgs.insert(pair<string, string>("VERSION_DECL", versionDecl));
- const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
+ string vertSource, tescSource, teseSource, geomSource, fragSource;
+ if (vshader)
{
- 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,
- colorComponent
- };
-
- const VkPipelineColorBlendStateCreateInfo colorBlendStateCreateInfo =
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_VERTEX_BIT);
+ tcu::StringTemplate shaderTemplate(vshader->sources[glu::SHADERTYPE_VERTEX][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "vertex shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ vertSource = shaderSource;
+ }
+ if (tcshader)
{
- 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 deUint32 patchControlPoints = (VK_SHADER_STAGE_FRAGMENT_BIT & stages && frameBufferTests) ? 2u : 1u;
-
- return vk::makeGraphicsPipeline(context.getDeviceInterface(), // const DeviceInterface& vk
- context.getDevice(), // const VkDevice device
- pipelineLayout, // const VkPipelineLayout pipelineLayout
- vertexShaderModule, // const VkShaderModule vertexShaderModule
- tessellationControlModule, // const VkShaderModule tessellationControlShaderModule
- tessellationEvaluationModule, // const VkShaderModule tessellationEvalShaderModule
- geometryShaderModule, // const VkShaderModule geometryShaderModule
- fragmentShaderModule, // const VkShaderModule fragmentShaderModule
- renderPass, // const VkRenderPass renderPass
- noViewports, // const std::vector<VkViewport>& viewports
- noScissors, // const std::vector<VkRect2D>& scissors
- topology, // const VkPrimitiveTopology topology
- 0u, // const deUint32 subpass
- patchControlPoints, // const deUint32 patchControlPoints
- &vertexInputStateCreateInfo, // const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo
- DE_NULL, // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo
- DE_NULL, // const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo
- DE_NULL, // const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo
- &colorBlendStateCreateInfo); // const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_TESS_CONTROL_BIT);
+ tcu::StringTemplate shaderTemplate(tcshader->sources[glu::SHADERTYPE_TESSELLATION_CONTROL][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "tess control shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ tescSource = shaderSource;
+ }
+ if (teshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_TESS_EVALUATION_BIT);
+ tcu::StringTemplate shaderTemplate(teshader->sources[glu::SHADERTYPE_TESSELLATION_EVALUATION][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "tess eval shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ teseSource = shaderSource;
+ }
+ if (gshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_GEOMETRY_BIT);
+ tcu::StringTemplate shaderTemplate(gshader->sources[glu::SHADERTYPE_GEOMETRY][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "geometry shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ geomSource = shaderSource;
+ }
+ if (fshader)
+ {
+ DE_ASSERT(stages & subgroups::SHADER_STAGE_FRAGMENT_BIT);
+ tcu::StringTemplate shaderTemplate(fshader->sources[glu::SHADERTYPE_FRAGMENT][0]);
+ string shaderSource(shaderTemplate.specialize(templateArgs));
+ if (doShaderLog)
+ {
+ log << tcu::TestLog::Message << "fragment shader:\n"
+ << shaderSource << "\n:end:" << tcu::TestLog::EndMessage;
+ }
+ fragSource = shaderSource;
+ }
+
+ glu::ShaderProgram *program = DE_NULL;
+ if(context.getShaderType() == SHADER_TYPE_GLSL)
+ {
+ glu::ProgramSources sources;
+ if (vshader)
+ sources << glu::VertexSource(vertSource);
+ if (tcshader)
+ sources << glu::TessellationControlSource(tescSource);
+ if (teshader)
+ sources << glu::TessellationEvaluationSource(teseSource);
+ if (gshader)
+ sources << glu::GeometrySource(geomSource);
+ if (fshader)
+ sources << glu::FragmentSource(fragSource);
+
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), sources);
+ } else {
+ DE_ASSERT(context.getShaderType() == SHADER_TYPE_SPIRV);
+
+ glu::ProgramBinaries binaries;
+ if (vshader)
+ binaries << spirvUtils::makeSpirV(log, glu::VertexSource(vertSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (tcshader)
+ binaries << spirvUtils::makeSpirV(log, glu::TessellationControlSource(tescSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (teshader)
+ binaries << spirvUtils::makeSpirV(log, glu::TessellationEvaluationSource(teseSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (gshader)
+ binaries << spirvUtils::makeSpirV(log, glu::GeometrySource(geomSource), spirvUtils::SPIRV_VERSION_1_3);
+ if (fshader)
+ binaries << spirvUtils::makeSpirV(log, glu::FragmentSource(fragSource), spirvUtils::SPIRV_VERSION_1_3);
+
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), binaries);
+ }
+
+ if (!program->isOk())
+ {
+ log << tcu::TestLog::Message << "Shader build failed.\n"
+ << "Vertex: " << (vshader ? program->getShaderInfo(glu::SHADERTYPE_VERTEX).infoLog : "n/a") << "\n"
+ << "Tess Cont: " << (tcshader ? program->getShaderInfo(glu::SHADERTYPE_TESSELLATION_CONTROL).infoLog : "n/a") << "\n"
+ << "Tess Eval: " << (teshader ? program->getShaderInfo(glu::SHADERTYPE_TESSELLATION_EVALUATION).infoLog : "n/a") << "\n"
+ << "Geometry: " << (gshader ? program->getShaderInfo(glu::SHADERTYPE_GEOMETRY).infoLog : "n/a") << "\n"
+ << "Fragment: " << (fshader ? program->getShaderInfo(glu::SHADERTYPE_FRAGMENT).infoLog : "n/a") << "\n"
+ << "Program: " << program->getProgramInfo().infoLog << tcu::TestLog::EndMessage;
+ }
+ return de::MovePtr<glu::ShaderProgram>(program);
}
-Move<VkPipeline> makeComputePipeline(Context& context,
- const VkPipelineLayout pipelineLayout, const VkShaderModule shaderModule,
+de::MovePtr<glu::ShaderProgram> makeComputePipeline(glc::Context& context, const GlslSource &glslTemplate,
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)},
- };
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const bool doShaderLog = log.isShaderLoggingEnabled();
- const vk::VkSpecializationInfo info =
- {
- /* mapEntryCount = */ 3,
- /* pMapEntries = */ entries,
- /* dataSize = */ sizeof(localSize),
- /* pData = */ localSize
- };
+ tcu::StringTemplate computeTemplate(glslTemplate.sources[glu::SHADERTYPE_COMPUTE][0]);
- const vk::VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
+ map<string, string> localSizeParams;
{
- 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 =
+ stringstream localSize;
+ localSize << "local_size_x = " << localSizeX;
+ localSizeParams.insert(pair<string, string>("LOCAL_SIZE_X", localSize.str()));
+ }
{
- 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 =
+ stringstream localSize;
+ localSize << "local_size_y = " << localSizeY;
+ localSizeParams.insert(pair<string, string>("LOCAL_SIZE_Y", localSize.str()));
+ }
{
- 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;
- };
+ stringstream localSize;
+ localSize << "local_size_z = " << localSizeZ;
+ localSizeParams.insert(pair<string, string>("LOCAL_SIZE_Z", localSize.str()));
+ }
- return createCommandPool(
- context.getDeviceInterface(), context.getDevice(), &commandPoolParams);
-}
+ glu::ComputeSource cshader(glu::ComputeSource(computeTemplate.specialize(localSizeParams)));
-Move<VkCommandBuffer> makeCommandBuffer(
- Context& context, const VkCommandPool commandPool)
-{
- const VkCommandBufferAllocateInfo bufferAllocateParams =
+ if (doShaderLog)
{
- 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);
-}
-
-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));
+ log << tcu::TestLog::Message << "compute shader specialized source:\n"
+ << cshader.source << "\n:end:" << tcu::TestLog::EndMessage;
+ }
- const VkSubmitInfo submitInfo =
+ glu::ShaderProgram *program = DE_NULL;
+ if(context.getShaderType() == SHADER_TYPE_GLSL)
{
- 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;
- };
+ glu::ProgramSources sources;
+ sources << cshader;
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), sources);
+ } else {
+ DE_ASSERT(context.getShaderType() == SHADER_TYPE_SPIRV);
- vk::VkResult result = (context.getDeviceInterface().queueSubmit(
- context.getUniversalQueue(), 1u, &submitInfo, *fence));
- VK_CHECK(result);
+ glu::ProgramBinaries binaries;
+ binaries << spirvUtils::makeSpirV(log, cshader, spirvUtils::SPIRV_VERSION_1_3);
- return Move<VkFence>(fence);
-}
+ program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), binaries);
+ }
-void waitFence(Context& context, Move<VkFence> fence)
-{
- VK_CHECK(context.getDeviceInterface().waitForFences(
- context.getDevice(), 1u, &fence.get(), DE_TRUE, ~0ull));
+ if (!program->isOk())
+ {
+ log << tcu::TestLog::Message << "Shader build failed.\n"
+ << "Compute: " << program->getShaderInfo(glu::SHADERTYPE_COMPUTE).infoLog << "\n"
+ << "Program: " << program->getProgramInfo().infoLog << tcu::TestLog::EndMessage;
+ }
+ return de::MovePtr<glu::ShaderProgram>(program);
}
struct Buffer;
return reinterpret_cast<Image*>(this);
}
- virtual VkDescriptorType getType() const
+ virtual subgroups::DescriptorType getType() const
{
if (m_isImage)
{
- return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
+ return subgroups::DESCRIPTOR_TYPE_STORAGE_IMAGE;
}
else
{
- return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ return subgroups::DESCRIPTOR_TYPE_STORAGE_BUFFER;
}
}
- Allocation& getAllocation() const
+ GLuint getId()
{
- return *m_allocation;
+ return m_objectId;
}
virtual ~BufferOrImage() {}
protected:
- explicit BufferOrImage(bool image) : m_isImage(image) {}
-
- bool m_isImage;
- de::details::MovePtr<Allocation> m_allocation;
+ explicit BufferOrImage(glc::Context& context, bool image)
+ : m_gl(context.getDeqpContext().getRenderContext().getFunctions())
+ , m_isImage(image)
+ , m_objectId(0) {}
+
+ const glw::Functions & m_gl;
+ bool m_isImage;
+ GLuint m_objectId;
};
struct Buffer : public BufferOrImage
{
explicit Buffer(
- Context& context, VkDeviceSize sizeInBytes, VkBufferUsageFlags usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
- : BufferOrImage (false)
- , m_sizeInBytes (sizeInBytes)
- , m_usage (usage)
+ glc::Context& context, deUint64 sizeInBytes, GLenum target = GL_SHADER_STORAGE_BUFFER)
+ : BufferOrImage (context, false)
+ // HACK overpad to account for the size for std140 UBOs
+ , m_sizeInBytes (sizeInBytes * 4)
+ , m_target (target)
+ {
+ m_gl.genBuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "genBuffers");
+ m_gl.bindBuffer(m_target, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "bindBuffer");
+ m_gl.bufferData(m_target, m_sizeInBytes, NULL, GL_DYNAMIC_DRAW);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "bufferData");
+ m_gl.bindBuffer(m_target, 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "bindBuffer(0)");
+ }
+
+ virtual ~Buffer()
{
- const vk::VkBufferCreateInfo bufferCreateInfo =
+ if (m_objectId != 0)
{
- VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
- DE_NULL,
- 0u,
- sizeInBytes,
- m_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()));
- }
-
- virtual VkDescriptorType getType() const
- {
- if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT == m_usage)
+ m_gl.deleteBuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDeleteBuffers");
+ }
+ }
+
+ virtual subgroups::DescriptorType getType() const
+ {
+ if (GL_UNIFORM_BUFFER == m_target)
{
- return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ return subgroups::DESCRIPTOR_TYPE_UNIFORM_BUFFER;
}
- return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ return subgroups::DESCRIPTOR_TYPE_STORAGE_BUFFER;
}
- VkBuffer getBuffer() const {
- return *m_buffer;
+ glw::GLvoid* mapBufferPtr() {
+ glw::GLvoid *ptr;
+
+ m_gl.bindBuffer(m_target, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer");
+
+ ptr = m_gl.mapBuffer(m_target, GL_READ_WRITE);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glMapBuffer");
+
+ m_gl.bindBuffer(m_target, 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer(0)");
+
+ return ptr;
}
- const VkBuffer* getBufferPtr() const {
- return &(*m_buffer);
+ void unmapBufferPtr() {
+ m_gl.bindBuffer(m_target, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer");
+
+ m_gl.unmapBuffer(m_target);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glUnmapBuffer");
+
+ m_gl.bindBuffer(m_target, 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindBuffer(0)");
}
- VkDeviceSize getSize() const {
+ deUint64 getSize() const {
return m_sizeInBytes;
}
private:
- Move<VkBuffer> m_buffer;
- VkDeviceSize m_sizeInBytes;
- const VkBufferUsageFlags m_usage;
+ deUint64 m_sizeInBytes;
+ const GLenum m_target;
};
struct Image : public BufferOrImage
{
- explicit Image(Context& context, deUint32 width, deUint32 height,
- VkFormat format, VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT)
- : BufferOrImage(true)
+ explicit Image(glc::Context& context, deUint32 width, deUint32 height,
+ subgroups::Format format)
+ : BufferOrImage(context, 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
- };
+ m_gl.genTextures(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glGenTextures");
+ m_gl.bindTexture(GL_TEXTURE_2D, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindTexture");
+ m_gl.texStorage2D(GL_TEXTURE_2D, 1, format, width, height);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glTexStorage2D");
+ }
- const VkImageViewCreateInfo imageViewCreateInfo =
+ virtual ~Image()
+ {
+ if (m_objectId != 0)
{
- 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_gl.deleteTextures(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDeleteTextures");
+ }
+ }
+
+private:
+};
- m_imageView = createImageView(context.getDeviceInterface(),
- context.getDevice(), &imageViewCreateInfo);
+struct Vao
+{
+ explicit Vao(glc::Context& context)
+ : m_gl(context.getDeqpContext().getRenderContext().getFunctions())
+ , m_objectId(0)
+ {
+ m_gl.genVertexArrays(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glGenVertexArrays");
+ m_gl.bindVertexArray(m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindVertexArray");
+ }
- const struct VkSamplerCreateInfo samplerCreateInfo =
+ ~Vao()
+ {
+ if (m_objectId != 0)
{
- 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);
+ m_gl.deleteVertexArrays(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDeleteVertexArrays");
+ }
}
- VkImage getImage() const {
- return *m_image;
+private:
+ const glw::Functions & m_gl;
+ GLuint m_objectId;
+};
+
+struct Fbo
+{
+ explicit Fbo(glc::Context& context)
+ : m_gl(context.getDeqpContext().getRenderContext().getFunctions())
+ , m_objectId(0)
+ {
+ m_gl.genFramebuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glGenFramebuffers");
+ m_gl.bindFramebuffer(GL_FRAMEBUFFER, m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glBindFramebuffer");
}
- VkImageView getImageView() const {
- return *m_imageView;
+ ~Fbo()
+ {
+ if (m_objectId != 0)
+ {
+ m_gl.deleteFramebuffers(1, &m_objectId);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "deleteFramebuffers");
+ }
}
- VkSampler getSampler() const {
- return *m_sampler;
+ void bind2D(Image &img)
+ {
+ m_gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, img.getId(), 0);
+ GLU_EXPECT_NO_ERROR(m_gl.getError(), "glFramebufferTexture2D");
}
private:
- Move<VkImage> m_image;
- Move<VkImageView> m_imageView;
- Move<VkSampler> m_sampler;
+ const glw::Functions & m_gl;
+ GLuint m_objectId;
+
};
}
-std::string vkt::subgroups::getSharedMemoryBallotHelper()
+std::string glc::subgroups::getSharedMemoryBallotHelper()
{
return "shared uvec4 superSecretComputeShaderHelper[gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z];\n"
"uvec4 sharedMemoryBallot(bool vote)\n"
"}\n";
}
-deUint32 vkt::subgroups::getSubgroupSize(Context& context)
+deUint32 glc::subgroups::getSubgroupSize(Context& context)
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
-
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int subgroupSize = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SIZE_KHR);
- return subgroupProperties.subgroupSize;
+ return subgroupSize;
}
-VkDeviceSize vkt::subgroups::maxSupportedSubgroupSize() {
+deUint32 glc::subgroups::maxSupportedSubgroupSize() {
return 128u;
}
-std::string vkt::subgroups::getShaderStageName(VkShaderStageFlags stage)
+std::string glc::subgroups::getShaderStageName(ShaderStageFlags stage)
{
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
switch (stage)
{
default:
DE_FATAL("Unhandled stage!");
return "";
- case VK_SHADER_STAGE_COMPUTE_BIT:
+ case SHADER_STAGE_COMPUTE_BIT:
return "compute";
- case VK_SHADER_STAGE_FRAGMENT_BIT:
+ case SHADER_STAGE_FRAGMENT_BIT:
return "fragment";
- case VK_SHADER_STAGE_VERTEX_BIT:
+ case SHADER_STAGE_VERTEX_BIT:
return "vertex";
- case VK_SHADER_STAGE_GEOMETRY_BIT:
+ case SHADER_STAGE_GEOMETRY_BIT:
return "geometry";
- case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+ case SHADER_STAGE_TESS_CONTROL_BIT:
return "tess_control";
- case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+ case SHADER_STAGE_TESS_EVALUATION_BIT:
return "tess_eval";
}
}
-std::string vkt::subgroups::getSubgroupFeatureName(vk::VkSubgroupFeatureFlagBits bit)
+std::string glc::subgroups::getSubgroupFeatureName(SubgroupFeatureFlags bit)
{
+ DE_ASSERT(bit & SUBGROUP_FEATURE_ALL_VALID);
switch (bit)
{
default:
DE_FATAL("Unknown subgroup feature category!");
return "";
- 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";
+ case SUBGROUP_FEATURE_BASIC_BIT:
+ return "GL_SUBGROUP_FEATURE_BASIC_BIT_KHR";
+ case SUBGROUP_FEATURE_VOTE_BIT:
+ return "GL_SUBGROUP_FEATURE_VOTE_BIT_KHR";
+ case SUBGROUP_FEATURE_ARITHMETIC_BIT:
+ return "GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR";
+ case SUBGROUP_FEATURE_BALLOT_BIT:
+ return "GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR";
+ case SUBGROUP_FEATURE_SHUFFLE_BIT:
+ return "GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR";
+ case SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT:
+ return "GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR";
+ case SUBGROUP_FEATURE_CLUSTERED_BIT:
+ return "GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR";
+ case SUBGROUP_FEATURE_QUAD_BIT:
+ return "GL_SUBGROUP_FEATURE_QUAD_BIT_KHR";
+ case SUBGROUP_FEATURE_PARTITIONED_BIT_NV:
+ return "GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV";
}
}
-void vkt::subgroups::addNoSubgroupShader (SourceCollections& programCollection)
+void glc::subgroups::addNoSubgroupShader (SourceCollections& programCollection)
{
{
- /*
- "#version 450\n"
- "void main (void)\n"
- "{\n"
- " float pixelSize = 2.0f/1024.0f;\n"
- " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
- " gl_PointSize = 1.0f;\n"
- "}\n"
- */
- const std::string vertNoSubgroup =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 1\n"
- "; Bound: 37\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %22 %26\n"
- "OpMemberDecorate %20 0 BuiltIn Position\n"
- "OpMemberDecorate %20 1 BuiltIn PointSize\n"
- "OpMemberDecorate %20 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %20 3 BuiltIn CullDistance\n"
- "OpDecorate %20 Block\n"
- "OpDecorate %26 BuiltIn VertexIndex\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 0.00195313\n"
- "%12 = OpConstant %6 2\n"
- "%14 = OpConstant %6 1\n"
- "%16 = OpTypeVector %6 4\n"
- "%17 = OpTypeInt 32 0\n"
- "%18 = OpConstant %17 1\n"
- "%19 = OpTypeArray %6 %18\n"
- "%20 = OpTypeStruct %16 %6 %19 %19\n"
- "%21 = OpTypePointer Output %20\n"
- "%22 = OpVariable %21 Output\n"
- "%23 = OpTypeInt 32 1\n"
- "%24 = OpConstant %23 0\n"
- "%25 = OpTypePointer Input %23\n"
- "%26 = OpVariable %25 Input\n"
- "%33 = OpConstant %6 0\n"
- "%35 = OpTypePointer Output %16\n"
- "%37 = OpConstant %23 1\n"
- "%38 = OpTypePointer Output %6\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%10 = OpVariable %7 Function\n"
- "OpStore %8 %9\n"
- "%11 = OpLoad %6 %8\n"
- "%13 = OpFDiv %6 %11 %12\n"
- "%15 = OpFSub %6 %13 %14\n"
- "OpStore %10 %15\n"
- "%27 = OpLoad %23 %26\n"
- "%28 = OpConvertSToF %6 %27\n"
- "%29 = OpLoad %6 %8\n"
- "%30 = OpFMul %6 %28 %29\n"
- "%31 = OpLoad %6 %10\n"
- "%32 = OpFAdd %6 %30 %31\n"
- "%34 = OpCompositeConstruct %16 %32 %33 %33 %14\n"
- "%36 = OpAccessChain %35 %22 %24\n"
- "OpStore %36 %34\n"
- "%39 = OpAccessChain %38 %22 %37\n"
- "OpStore %39 %14\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("vert_noSubgroup") << vertNoSubgroup;
- }
-
- {
- /*
- "#version 450\n"
- "layout(vertices=1) out;\n"
- "\n"
- "void main (void)\n"
- "{\n"
- " if (gl_InvocationID == 0)\n"
- " {\n"
- " gl_TessLevelOuter[0] = 1.0f;\n"
- " gl_TessLevelOuter[1] = 1.0f;\n"
- " }\n"
- " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
- "}\n"
- */
- const std::string tescNoSubgroup =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 1\n"
- "; Bound: 45\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %32 %38\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- "OpMemberDecorate %29 0 BuiltIn Position\n"
- "OpMemberDecorate %29 1 BuiltIn PointSize\n"
- "OpMemberDecorate %29 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %29 3 BuiltIn CullDistance\n"
- "OpDecorate %29 Block\n"
- "OpMemberDecorate %34 0 BuiltIn Position\n"
- "OpMemberDecorate %34 1 BuiltIn PointSize\n"
- "OpMemberDecorate %34 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %34 3 BuiltIn CullDistance\n"
- "OpDecorate %34 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpTypeVector %15 4\n"
- "%27 = OpConstant %16 1\n"
- "%28 = OpTypeArray %15 %27\n"
- "%29 = OpTypeStruct %26 %15 %28 %28\n"
- "%30 = OpTypeArray %29 %27\n"
- "%31 = OpTypePointer Output %30\n"
- "%32 = OpVariable %31 Output\n"
- "%34 = OpTypeStruct %26 %15 %28 %28\n"
- "%35 = OpConstant %16 32\n"
- "%36 = OpTypeArray %34 %35\n"
- "%37 = OpTypePointer Input %36\n"
- "%38 = OpVariable %37 Input\n"
- "%40 = OpTypePointer Input %26\n"
- "%43 = OpTypePointer Output %26\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "%33 = OpLoad %6 %8\n"
- "%39 = OpLoad %6 %8\n"
- "%41 = OpAccessChain %40 %38 %39 %10\n"
- "%42 = OpLoad %26 %41\n"
- "%44 = OpAccessChain %43 %32 %33 %10\n"
- "OpStore %44 %42\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tesc_noSubgroup") << tescNoSubgroup;
- }
-
- {
- /*
- "#version 450\n"
- "layout(isolines) in;\n"
- "\n"
- "void main (void)\n"
- "{\n"
- " float pixelSize = 2.0f/1024.0f;\n"
- " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
- "}\n";
- */
- const std::string teseNoSubgroup =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 42\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %16 %23 %29\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpMemberDecorate %14 0 BuiltIn Position\n"
- "OpMemberDecorate %14 1 BuiltIn PointSize\n"
- "OpMemberDecorate %14 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %14 3 BuiltIn CullDistance\n"
- "OpDecorate %14 Block\n"
- "OpMemberDecorate %19 0 BuiltIn Position\n"
- "OpMemberDecorate %19 1 BuiltIn PointSize\n"
- "OpMemberDecorate %19 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %19 3 BuiltIn CullDistance\n"
- "OpDecorate %19 Block\n"
- "OpDecorate %29 BuiltIn TessCoord\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 0.00195313\n"
- "%10 = OpTypeVector %6 4\n"
- "%11 = OpTypeInt 32 0\n"
- "%12 = OpConstant %11 1\n"
- "%13 = OpTypeArray %6 %12\n"
- "%14 = OpTypeStruct %10 %6 %13 %13\n"
- "%15 = OpTypePointer Output %14\n"
- "%16 = OpVariable %15 Output\n"
- "%17 = OpTypeInt 32 1\n"
- "%18 = OpConstant %17 0\n"
- "%19 = OpTypeStruct %10 %6 %13 %13\n"
- "%20 = OpConstant %11 32\n"
- "%21 = OpTypeArray %19 %20\n"
- "%22 = OpTypePointer Input %21\n"
- "%23 = OpVariable %22 Input\n"
- "%24 = OpTypePointer Input %10\n"
- "%27 = OpTypeVector %6 3\n"
- "%28 = OpTypePointer Input %27\n"
- "%29 = OpVariable %28 Input\n"
- "%30 = OpConstant %11 0\n"
- "%31 = OpTypePointer Input %6\n"
- "%36 = OpConstant %6 2\n"
- "%40 = OpTypePointer Output %10\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "OpStore %8 %9\n"
- "%25 = OpAccessChain %24 %23 %18 %18\n"
- "%26 = OpLoad %10 %25\n"
- "%32 = OpAccessChain %31 %29 %30\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpLoad %6 %8\n"
- "%35 = OpFMul %6 %33 %34\n"
- "%37 = OpFDiv %6 %35 %36\n"
- "%38 = OpCompositeConstruct %10 %37 %37 %37 %37\n"
- "%39 = OpFAdd %10 %26 %38\n"
- "%41 = OpAccessChain %40 %16 %18\n"
- "OpStore %41 %39\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
- programCollection.spirvAsmSources.add("tese_noSubgroup") << teseNoSubgroup;
+ const std::string vertNoSubgroupGLSL =
+ "#version 450\n"
+ "void main (void)\n"
+ "{\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " float pixelPosition = pixelSize/2.0f - 1.0f;\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.add("vert_noSubgroup") << glu::VertexSource(vertNoSubgroupGLSL);
}
-}
+ {
+ const std::string tescNoSubgroupGLSL =
+ "#version 450\n"
+ "layout(vertices=1) out;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " if (gl_InvocationID == 0)\n"
+ " {\n"
+ " gl_TessLevelOuter[0] = 1.0f;\n"
+ " gl_TessLevelOuter[1] = 1.0f;\n"
+ " }\n"
+ " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ "}\n";
+ programCollection.add("tesc_noSubgroup") << glu::TessellationControlSource(tescNoSubgroupGLSL);
+ }
+ {
+ const std::string teseNoSubgroupGLSL =
+ "#version 450\n"
+ "layout(isolines) in;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " float pixelSize = 2.0f/1024.0f;\n"
+ " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
+ "}\n";
+ programCollection.add("tese_noSubgroup") << glu::TessellationEvaluationSource(teseNoSubgroupGLSL);
+ }
-std::string vkt::subgroups::getVertShaderForStage(vk::VkShaderStageFlags stage)
+}
+
+std::string glc::subgroups::getVertShaderForStage(const ShaderStageFlags stage)
{
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
switch (stage)
{
default:
DE_FATAL("Unhandled stage!");
return "";
- case VK_SHADER_STAGE_FRAGMENT_BIT:
+ case SHADER_STAGE_FRAGMENT_BIT:
return
"#version 450\n"
"void main (void)\n"
"{\n"
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
"}\n";
- case VK_SHADER_STAGE_GEOMETRY_BIT:
+ case 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:
+ case SHADER_STAGE_TESS_CONTROL_BIT:
+ case SHADER_STAGE_TESS_EVALUATION_BIT:
return
"#version 450\n"
"void main (void)\n"
}
}
-bool vkt::subgroups::isSubgroupSupported(Context& context)
+bool glc::subgroups::isSubgroupSupported(Context& context)
{
- return context.contextSupports(vk::ApiVersion(1, 1, 0));
+ return context.getDeqpContext().getContextInfo().isExtensionSupported("GL_KHR_shader_subgroup");
}
-bool vkt::subgroups::areSubgroupOperationsSupportedForStage(
- Context& context, const VkShaderStageFlags stage)
+bool glc::subgroups::areSubgroupOperationsSupportedForStage(
+ Context& context, const ShaderStageFlags stage)
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
-
- return (stage & subgroupProperties.supportedStages) ? true : false;
+ return (stage & supportedStages) ? true : false;
}
-bool vkt::subgroups::areSubgroupOperationsRequiredForStage(
- VkShaderStageFlags stage)
+bool glc::subgroups::areSubgroupOperationsRequiredForStage(
+ const ShaderStageFlags stage)
{
+ DE_ASSERT(stage & SHADER_STAGE_ALL_VALID);
switch (stage)
{
default:
return false;
- case VK_SHADER_STAGE_COMPUTE_BIT:
+ case SHADER_STAGE_COMPUTE_BIT:
return true;
}
}
-bool vkt::subgroups::isSubgroupFeatureSupportedForDevice(
+bool glc::subgroups::isSubgroupFeatureSupportedForDevice(
Context& context,
- VkSubgroupFeatureFlagBits bit) {
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
+ const SubgroupFeatureFlags bit)
+{
+ DE_ASSERT(bit & SUBGROUP_FEATURE_ALL_VALID);
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ int supportedOperations = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_FEATURES_KHR);
- return (bit & subgroupProperties.supportedOperations) ? true : false;
+ return (bit & supportedOperations) ? true : false;
}
-bool vkt::subgroups::isFragmentSSBOSupportedForDevice(Context& context)
+bool glc::subgroups::isFragmentSSBOSupportedForDevice(Context& context)
{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(
- context.getInstanceInterface(), context.getPhysicalDevice());
- return features.fragmentStoresAndAtomics ? true : false;
+ int numFragmentSSBOs = context.getDeqpContext().getContextInfo().getInt(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS);
+
+ return (numFragmentSSBOs > 0) ? true : false;
}
-bool vkt::subgroups::isVertexSSBOSupportedForDevice(Context& context)
+bool glc::subgroups::isVertexSSBOSupportedForDevice(Context& context)
{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(
- context.getInstanceInterface(), context.getPhysicalDevice());
- return features.vertexPipelineStoresAndAtomics ? true : false;
+ int numVertexSSBOs = context.getDeqpContext().getContextInfo().getInt(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS);
+
+ return (numVertexSSBOs > 0) ? true : false;
}
-bool vkt::subgroups::isDoubleSupportedForDevice(Context& context)
+bool glc::subgroups::isDoubleSupportedForDevice(Context& context)
{
- const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(
- context.getInstanceInterface(), context.getPhysicalDevice());
- return features.shaderFloat64 ? true : false;
+ glu::ContextType contextType = context.getDeqpContext().getRenderContext().getType();
+ return (glu::contextSupports(contextType, glu::ApiType::core(4, 0)) ||
+ context.getDeqpContext().getContextInfo().isExtensionSupported("GL_ARB_gpu_shader_fp64"));
}
-bool vkt::subgroups::isDoubleFormat(VkFormat format)
+bool glc::subgroups::isDoubleFormat(Format 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:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
return true;
}
}
-std::string vkt::subgroups::getFormatNameForGLSL (VkFormat format)
+std::string glc::subgroups::getFormatNameForGLSL (Format format)
{
switch (format)
{
default:
DE_FATAL("Unhandled format!");
return "";
- case VK_FORMAT_R32_SINT:
+ case FORMAT_R32_SINT:
return "int";
- case VK_FORMAT_R32G32_SINT:
+ case FORMAT_R32G32_SINT:
return "ivec2";
- case VK_FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32_SINT:
return "ivec3";
- case VK_FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32G32B32A32_SINT:
return "ivec4";
- case VK_FORMAT_R32_UINT:
+ case FORMAT_R32_UINT:
return "uint";
- case VK_FORMAT_R32G32_UINT:
+ case FORMAT_R32G32_UINT:
return "uvec2";
- case VK_FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32_UINT:
return "uvec3";
- case VK_FORMAT_R32G32B32A32_UINT:
+ case FORMAT_R32G32B32A32_UINT:
return "uvec4";
- case VK_FORMAT_R32_SFLOAT:
+ case FORMAT_R32_SFLOAT:
return "float";
- case VK_FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
return "vec2";
- case VK_FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
return "vec3";
- case VK_FORMAT_R32G32B32A32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
return "vec4";
- case VK_FORMAT_R64_SFLOAT:
+ case FORMAT_R64_SFLOAT:
return "double";
- case VK_FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
return "dvec2";
- case VK_FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
return "dvec3";
- case VK_FORMAT_R64G64B64A64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
return "dvec4";
- case VK_FORMAT_R8_USCALED:
+ case FORMAT_R32_BOOL:
return "bool";
- case VK_FORMAT_R8G8_USCALED:
+ case FORMAT_R32G32_BOOL:
return "bvec2";
- case VK_FORMAT_R8G8B8_USCALED:
+ case FORMAT_R32G32B32_BOOL:
return "bvec3";
- case VK_FORMAT_R8G8B8A8_USCALED:
+ case FORMAT_R32G32B32A32_BOOL:
return "bvec4";
}
}
-void vkt::subgroups::setVertexShaderFrameBuffer (SourceCollections& programCollection)
+void glc::subgroups::setVertexShaderFrameBuffer (SourceCollections& programCollection)
{
- /*
+ programCollection.add("vert") << glu::VertexSource(
+ "#version 450\n"
"layout(location = 0) in highp vec4 in_position;\n"
"void main (void)\n"
"{\n"
" gl_Position = in_position;\n"
- "}\n";
- */
- programCollection.spirvAsmSources.add("vert") <<
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 21\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %13 %17\n"
- "OpMemberDecorate %11 0 BuiltIn Position\n"
- "OpMemberDecorate %11 1 BuiltIn PointSize\n"
- "OpMemberDecorate %11 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %11 3 BuiltIn CullDistance\n"
- "OpDecorate %11 Block\n"
- "OpDecorate %17 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeInt 32 0\n"
- "%9 = OpConstant %8 1\n"
- "%10 = OpTypeArray %6 %9\n"
- "%11 = OpTypeStruct %7 %6 %10 %10\n"
- "%12 = OpTypePointer Output %11\n"
- "%13 = OpVariable %12 Output\n"
- "%14 = OpTypeInt 32 1\n"
- "%15 = OpConstant %14 0\n"
- "%16 = OpTypePointer Input %7\n"
- "%17 = OpVariable %16 Input\n"
- "%19 = OpTypePointer Output %7\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%18 = OpLoad %7 %17\n"
- "%20 = OpAccessChain %19 %13 %15\n"
- "OpStore %20 %18\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
+ "}\n");
}
-void vkt::subgroups::setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection)
+void glc::subgroups::setFragmentShaderFrameBuffer (SourceCollections& programCollection)
{
- /*
+ programCollection.add("fragment") << glu::FragmentSource(
+ "#version 450\n"
"layout(location = 0) in float in_color;\n"
"layout(location = 0) out uint out_color;\n"
"void main()\n"
- {\n"
+ "{\n"
" out_color = uint(in_color);\n"
- "}\n";
- */
- programCollection.spirvAsmSources.add("fragment") <<
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 14\n"
- "; Schema: 0\n"
- "OpCapability Shader\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Fragment %4 \"main\" %8 %11\n"
- "OpExecutionMode %4 OriginUpperLeft\n"
- "OpDecorate %8 Location 0\n"
- "OpDecorate %11 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Output %6\n"
- "%8 = OpVariable %7 Output\n"
- "%9 = OpTypeFloat 32\n"
- "%10 = OpTypePointer Input %9\n"
- "%11 = OpVariable %10 Input\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%12 = OpLoad %9 %11\n"
- "%13 = OpConvertFToU %6 %12\n"
- "OpStore %8 %13\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
+ "}\n");
}
-void vkt::subgroups::setTesCtrlShaderFrameBuffer (vk::SourceCollections& programCollection)
+void glc::subgroups::setTesCtrlShaderFrameBuffer (SourceCollections& programCollection)
{
- /*
+ programCollection.add("tesc") << glu::TessellationControlSource(
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_basic: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(vertices = 2) out;\n"
"void main (void)\n"
"{\n"
" if (gl_InvocationID == 0)\n"
- {\n"
+ " {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_TessLevelOuter[1] = 1.0f;\n"
" }\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
- "}\n";
- */
- programCollection.spirvAsmSources.add("tesc") <<
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 46\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %33 %39\n"
- "OpExecutionMode %4 OutputVertices 2\n"
- "OpDecorate %8 BuiltIn InvocationId\n"
- "OpDecorate %20 Patch\n"
- "OpDecorate %20 BuiltIn TessLevelOuter\n"
- "OpMemberDecorate %29 0 BuiltIn Position\n"
- "OpMemberDecorate %29 1 BuiltIn PointSize\n"
- "OpMemberDecorate %29 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %29 3 BuiltIn CullDistance\n"
- "OpDecorate %29 Block\n"
- "OpMemberDecorate %35 0 BuiltIn Position\n"
- "OpMemberDecorate %35 1 BuiltIn PointSize\n"
- "OpMemberDecorate %35 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %35 3 BuiltIn CullDistance\n"
- "OpDecorate %35 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 1\n"
- "%7 = OpTypePointer Input %6\n"
- "%8 = OpVariable %7 Input\n"
- "%10 = OpConstant %6 0\n"
- "%11 = OpTypeBool\n"
- "%15 = OpTypeFloat 32\n"
- "%16 = OpTypeInt 32 0\n"
- "%17 = OpConstant %16 4\n"
- "%18 = OpTypeArray %15 %17\n"
- "%19 = OpTypePointer Output %18\n"
- "%20 = OpVariable %19 Output\n"
- "%21 = OpConstant %15 1\n"
- "%22 = OpTypePointer Output %15\n"
- "%24 = OpConstant %6 1\n"
- "%26 = OpTypeVector %15 4\n"
- "%27 = OpConstant %16 1\n"
- "%28 = OpTypeArray %15 %27\n"
- "%29 = OpTypeStruct %26 %15 %28 %28\n"
- "%30 = OpConstant %16 2\n"
- "%31 = OpTypeArray %29 %30\n"
- "%32 = OpTypePointer Output %31\n"
- "%33 = OpVariable %32 Output\n"
- "%35 = OpTypeStruct %26 %15 %28 %28\n"
- "%36 = OpConstant %16 32\n"
- "%37 = OpTypeArray %35 %36\n"
- "%38 = OpTypePointer Input %37\n"
- "%39 = OpVariable %38 Input\n"
- "%41 = OpTypePointer Input %26\n"
- "%44 = OpTypePointer Output %26\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%9 = OpLoad %6 %8\n"
- "%12 = OpIEqual %11 %9 %10\n"
- "OpSelectionMerge %14 None\n"
- "OpBranchConditional %12 %13 %14\n"
- "%13 = OpLabel\n"
- "%23 = OpAccessChain %22 %20 %10\n"
- "OpStore %23 %21\n"
- "%25 = OpAccessChain %22 %20 %24\n"
- "OpStore %25 %21\n"
- "OpBranch %14\n"
- "%14 = OpLabel\n"
- "%34 = OpLoad %6 %8\n"
- "%40 = OpLoad %6 %8\n"
- "%42 = OpAccessChain %41 %39 %40 %10\n"
- "%43 = OpLoad %26 %42\n"
- "%45 = OpAccessChain %44 %33 %34 %10\n"
- "OpStore %45 %43\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
+ "}\n");
}
-void vkt::subgroups::setTesEvalShaderFrameBuffer (vk::SourceCollections& programCollection)
+void glc::subgroups::setTesEvalShaderFrameBuffer (SourceCollections& programCollection)
{
- /*
+ programCollection.add("tese") << glu::TessellationEvaluationSource(
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"#extension GL_EXT_tessellation_shader : require\n"
"layout(isolines, equal_spacing, ccw ) in;\n"
"{\n"
" gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
" out_color = in_color[0];\n"
- "}\n";
- */
- programCollection.spirvAsmSources.add("tese") <<
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 45\n"
- "; Schema: 0\n"
- "OpCapability Tessellation\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %13 %20 %29 %39 %42\n"
- "OpExecutionMode %4 Isolines\n"
- "OpExecutionMode %4 SpacingEqual\n"
- "OpExecutionMode %4 VertexOrderCcw\n"
- "OpMemberDecorate %11 0 BuiltIn Position\n"
- "OpMemberDecorate %11 1 BuiltIn PointSize\n"
- "OpMemberDecorate %11 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %11 3 BuiltIn CullDistance\n"
- "OpDecorate %11 Block\n"
- "OpMemberDecorate %16 0 BuiltIn Position\n"
- "OpMemberDecorate %16 1 BuiltIn PointSize\n"
- "OpMemberDecorate %16 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %16 3 BuiltIn CullDistance\n"
- "OpDecorate %16 Block\n"
- "OpDecorate %29 BuiltIn TessCoord\n"
- "OpDecorate %39 Location 0\n"
- "OpDecorate %42 Location 0\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeFloat 32\n"
- "%7 = OpTypeVector %6 4\n"
- "%8 = OpTypeInt 32 0\n"
- "%9 = OpConstant %8 1\n"
- "%10 = OpTypeArray %6 %9\n"
- "%11 = OpTypeStruct %7 %6 %10 %10\n"
- "%12 = OpTypePointer Output %11\n"
- "%13 = OpVariable %12 Output\n"
- "%14 = OpTypeInt 32 1\n"
- "%15 = OpConstant %14 0\n"
- "%16 = OpTypeStruct %7 %6 %10 %10\n"
- "%17 = OpConstant %8 32\n"
- "%18 = OpTypeArray %16 %17\n"
- "%19 = OpTypePointer Input %18\n"
- "%20 = OpVariable %19 Input\n"
- "%21 = OpTypePointer Input %7\n"
- "%24 = OpConstant %14 1\n"
- "%27 = OpTypeVector %6 3\n"
- "%28 = OpTypePointer Input %27\n"
- "%29 = OpVariable %28 Input\n"
- "%30 = OpConstant %8 0\n"
- "%31 = OpTypePointer Input %6\n"
- "%36 = OpTypePointer Output %7\n"
- "%38 = OpTypePointer Output %6\n"
- "%39 = OpVariable %38 Output\n"
- "%40 = OpTypeArray %6 %17\n"
- "%41 = OpTypePointer Input %40\n"
- "%42 = OpVariable %41 Input\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%22 = OpAccessChain %21 %20 %15 %15\n"
- "%23 = OpLoad %7 %22\n"
- "%25 = OpAccessChain %21 %20 %24 %15\n"
- "%26 = OpLoad %7 %25\n"
- "%32 = OpAccessChain %31 %29 %30\n"
- "%33 = OpLoad %6 %32\n"
- "%34 = OpCompositeConstruct %7 %33 %33 %33 %33\n"
- "%35 = OpExtInst %7 %1 FMix %23 %26 %34\n"
- "%37 = OpAccessChain %36 %13 %15\n"
- "OpStore %37 %35\n"
- "%43 = OpAccessChain %31 %42 %15\n"
- "%44 = OpLoad %6 %43\n"
- "OpStore %39 %44\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
+ "}\n");
}
-void vkt::subgroups::addGeometryShadersFromTemplate (const std::string& glslTemplate, const vk::ShaderBuildOptions& options, vk::GlslSourceCollection& collection)
+void glc::subgroups::addGeometryShadersFromTemplate (const std::string& glslTemplate, SourceCollections& collection)
{
tcu::StringTemplate geometryTemplate(glslTemplate);
map<string, string> pointsParams;
pointsParams.insert(pair<string, string>("TOPOLOGY", "points"));
- collection.add("geometry_lines") << glu::GeometrySource(geometryTemplate.specialize(linesParams)) << options;
- collection.add("geometry_points") << glu::GeometrySource(geometryTemplate.specialize(pointsParams)) << options;
+ collection.add("geometry_lines") << glu::GeometrySource(geometryTemplate.specialize(linesParams));
+ collection.add("geometry_points") << glu::GeometrySource(geometryTemplate.specialize(pointsParams));
}
-void vkt::subgroups::addGeometryShadersFromTemplate (const std::string& spirvTemplate, const vk::SpirVAsmBuildOptions& options, vk::SpirVAsmCollection& collection)
+void initializeMemory(deqp::Context& context, glw::GLvoid *hostPtr, subgroups::SSBOData& data)
{
- tcu::StringTemplate geometryTemplate(spirvTemplate);
-
- map<string, string> linesParams;
- linesParams.insert(pair<string, string>("TOPOLOGY", "InputLines"));
-
- map<string, string> pointsParams;
- pointsParams.insert(pair<string, string>("TOPOLOGY", "InputPoints"));
-
- collection.add("geometry_lines") << geometryTemplate.specialize(linesParams) << options;
- collection.add("geometry_points") << geometryTemplate.specialize(pointsParams) << options;
-}
-
-void initializeMemory(Context& context, const Allocation& alloc, subgroups::SSBOData& data)
-{
- const vk::VkFormat format = data.format;
- const vk::VkDeviceSize size = getFormatSizeInBytes(format) * data.numElements;
+ using namespace subgroups;
+ const Format format = data.format;
+ const deUint64 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");
break;
- 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:
+ case FORMAT_R32_BOOL:
+ case FORMAT_R32G32_BOOL:
+ case FORMAT_R32G32B32_BOOL:
+ case FORMAT_R32G32B32A32_BOOL:
+ case FORMAT_R32_SINT:
+ case FORMAT_R32G32_SINT:
+ case FORMAT_R32G32B32_SINT:
+ case FORMAT_R32G32B32A32_SINT:
+ case FORMAT_R32_UINT:
+ case FORMAT_R32G32_UINT:
+ case FORMAT_R32G32B32_UINT:
+ case FORMAT_R32G32B32A32_UINT:
{
- deUint32* ptr = reinterpret_cast<deUint32*>(alloc.getHostPtr());
+ deUint32* ptr = reinterpret_cast<deUint32*>(hostPtr);
- for (vk::VkDeviceSize k = 0; k < (size / sizeof(deUint32)); k++)
+ for (deUint64 k = 0; k < (size / sizeof(deUint32)); 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:
+ case FORMAT_R32_SFLOAT:
+ case FORMAT_R32G32_SFLOAT:
+ case FORMAT_R32G32B32_SFLOAT:
+ case FORMAT_R32G32B32A32_SFLOAT:
{
- float* ptr = reinterpret_cast<float*>(alloc.getHostPtr());
+ float* ptr = reinterpret_cast<float*>(hostPtr);
- for (vk::VkDeviceSize k = 0; k < (size / sizeof(float)); k++)
+ for (deUint64 k = 0; k < (size / sizeof(float)); 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:
+ case FORMAT_R64_SFLOAT:
+ case FORMAT_R64G64_SFLOAT:
+ case FORMAT_R64G64B64_SFLOAT:
+ case FORMAT_R64G64B64A64_SFLOAT:
{
- double* ptr = reinterpret_cast<double*>(alloc.getHostPtr());
+ double* ptr = reinterpret_cast<double*>(hostPtr);
- for (vk::VkDeviceSize k = 0; k < (size / sizeof(double)); k++)
+ for (deUint64 k = 0; k < (size / sizeof(double)); k++)
{
ptr[k] = rnd.getDouble();
}
}
else if (subgroups::SSBOData::InitializeZero == data.initializeType)
{
- deUint32* ptr = reinterpret_cast<deUint32*>(alloc.getHostPtr());
+ deUint32* ptr = reinterpret_cast<deUint32*>(hostPtr);
- for (vk::VkDeviceSize k = 0; k < size / 4; k++)
+ for (deUint64 k = 0; k < size / 4; k++)
{
ptr[k] = 0;
}
if (subgroups::SSBOData::InitializeNone != data.initializeType)
{
- flushAlloc(context.getDeviceInterface(), context.getDevice(), alloc);
+ // nothing to do for GL
}
}
-deUint32 getResultBinding (const VkShaderStageFlagBits shaderStage)
+deUint32 getResultBinding (const glc::subgroups::ShaderStageFlags shaderStage)
{
+ using namespace glc::subgroups;
switch(shaderStage)
{
- case VK_SHADER_STAGE_VERTEX_BIT:
+ case SHADER_STAGE_VERTEX_BIT:
return 0u;
break;
- case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+ case SHADER_STAGE_TESS_CONTROL_BIT:
return 1u;
break;
- case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+ case SHADER_STAGE_TESS_EVALUATION_BIT:
return 2u;
break;
- case VK_SHADER_STAGE_GEOMETRY_BIT:
+ case SHADER_STAGE_GEOMETRY_BIT:
return 3u;
break;
default:
return -1;
}
-tcu::TestStatus vkt::subgroups::makeTessellationEvaluationFrameBufferTest(
- Context& context, VkFormat format, SSBOData* extraData,
+tcu::TestStatus glc::subgroups::makeTessellationEvaluationFrameBufferTest(
+ Context& context, Format format, SSBOData* extraData,
deUint32 extraDataCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
- const VkShaderStageFlags shaderStage)
+ const ShaderStageFlags shaderStage)
{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
const deUint32 maxWidth = 1024u;
vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
- DescriptorSetLayoutBuilder layoutBuilder;
- DescriptorPoolBuilder poolBuilder;
- DescriptorSetUpdateBuilder updateBuilder;
- Move <VkDescriptorPool> descriptorPool;
- Move <VkDescriptorSet> descriptorSet;
-
- const Unique<VkShaderModule> vertexShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(),
- context.getBinaryCollection().get("vert"), 0u));
- const Unique<VkShaderModule> teCtrlShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(),
- context.getBinaryCollection().get("tesc"), 0u));
- const Unique<VkShaderModule> teEvalShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(),
- context.getBinaryCollection().get("tese"), 0u));
- const Unique<VkShaderModule> fragmentShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(),
- context.getBinaryCollection().get("fragment"), 0u));
- const Unique<VkRenderPass> renderPass (makeRenderPass(context, format));
-
- const VkVertexInputBindingDescription vertexInputBinding =
- {
- 0u, // binding;
- static_cast<deUint32>(sizeof(tcu::Vec4)), // stride;
- VK_VERTEX_INPUT_RATE_VERTEX // inputRate
- };
- const VkVertexInputAttributeDescription vertexInputAttribute =
- {
- 0u,
- 0u,
- VK_FORMAT_R32G32B32A32_SFLOAT,
- 0u
- };
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& tcshader = context.getSourceCollection().get("tesc");
+ const GlslSource& teshader = context.getSourceCollection().get("tese");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
for (deUint32 i = 0u; i < extraDataCount; i++)
{
if (extraData[i].isImage)
{
inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraData[i].numElements), 1u, extraData[i].format));
+ // haven't implemented init for images yet
+ DE_ASSERT(extraData[i].initializeType == subgroups::SSBOData::InitializeNone);
}
else
{
- vk::VkDeviceSize size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements;
- inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT));
+ deUint64 size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
}
- const Allocation& alloc = inputBuffers[i]->getAllocation();
- initializeMemory(context, alloc, extraData[i]);
}
for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
- layoutBuilder.addBinding(inputBuffers[ndx]->getType(), 1u, shaderStage, DE_NULL);
-
- const Unique<VkDescriptorSetLayout> descriptorSetLayout (layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
-
- const Unique<VkPipelineLayout> pipelineLayout (makePipelineLayout(context, *descriptorSetLayout));
-
- const Unique<VkPipeline> pipeline (makeGraphicsPipeline(context, *pipelineLayout,
- VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT |
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- *vertexShaderModule, *fragmentShaderModule, DE_NULL, *teCtrlShaderModule, *teEvalShaderModule,
- *renderPass, VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, &vertexInputBinding, &vertexInputAttribute, true, format));
-
- for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
- poolBuilder.addType(inputBuffers[ndx]->getType());
-
- if (extraDataCount > 0)
{
- descriptorPool = poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
- VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
- descriptorSet = makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout);
- }
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "stage = " << shaderStage << " , binding = " << extraData[ndx].binding << "\n"
+ << tcu::TestLog::EndMessage;
- for (deUint32 buffersNdx = 0u; buffersNdx < inputBuffers.size(); buffersNdx++)
- {
- if (inputBuffers[buffersNdx]->isImage())
+ if (inputBuffers[ndx]->isImage())
{
- VkDescriptorImageInfo info =
- makeDescriptorImageInfo(inputBuffers[buffersNdx]->getAsImage()->getSampler(),
- inputBuffers[buffersNdx]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(buffersNdx),
- inputBuffers[buffersNdx]->getType(), &info);
- }
- else
+ gl.bindImageTexture(extraData[ndx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraData[ndx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
{
- VkDescriptorBufferInfo info =
- makeDescriptorBufferInfo(inputBuffers[buffersNdx]->getAsBuffer()->getBuffer(),
- 0ull, inputBuffers[buffersNdx]->getAsBuffer()->getSize());
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(buffersNdx),
- inputBuffers[buffersNdx]->getType(), &info);
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraData[ndx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
}
}
- updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT | SHADER_STAGE_TESS_CONTROL_BIT | SHADER_STAGE_TESS_EVALUATION_BIT),
+ &vshader, &fshader, DE_NULL, &tcshader, &teshader));
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("tese graphics program build failed");
+ }
- const Unique<VkCommandPool> cmdPool (makeCommandPool(context));
const deUint32 subgroupSize = getSubgroupSize(context);
- const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(context, *cmdPool));
- const vk::VkDeviceSize vertexBufferSize = 2ull * maxWidth * sizeof(tcu::Vec4);
- Buffer vertexBuffer (context, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ const deUint64 vertexBufferSize = 2ull * maxWidth * sizeof(tcu::Vec4);
+ Buffer vertexBuffer (context, vertexBufferSize, GL_ARRAY_BUFFER);
unsigned totalIterations = 0u;
unsigned failedIterations = 0u;
- Image discardableImage (context, maxWidth, 1u, format, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ Image discardableImage (context, maxWidth, 1u, format);
{
- const Allocation& alloc = vertexBuffer.getAllocation();
- std::vector<tcu::Vec4> data (2u * maxWidth, Vec4(1.0f, 0.0f, 1.0f, 1.0f));
+ glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr();
+ std::vector<tcu::Vec4> data (2u * maxWidth, tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f));
const float pixelSize = 2.0f / static_cast<float>(maxWidth);
float leftHandPosition = -1.0f;
data[ndx+1][0] = leftHandPosition;
}
- deMemcpy(alloc.getHostPtr(), &data[0], data.size() * sizeof(tcu::Vec4));
- flushAlloc(context.getDeviceInterface(), context.getDevice(), alloc);
+ deMemcpy(bufferPtr, &data[0], data.size() * sizeof(tcu::Vec4));
+ vertexBuffer.unmapBufferPtr();
}
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(discardableImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
+
for (deUint32 width = 1u; width < maxWidth; ++width)
{
- const Unique<VkFramebuffer> framebuffer (makeFramebuffer(context, *renderPass, discardableImage.getImageView(), maxWidth, 1));
- const VkViewport viewport = makeViewport(maxWidth, 1u);
- const VkRect2D scissor = makeRect2D(maxWidth, 1u);
- const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
- Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
- const VkDeviceSize vertexBufferOffset = 0u;
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+ const deUint64 vertexBufferOffset = 0u;
totalIterations++;
- beginCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
{
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
- context.getDeviceInterface().cmdSetViewport(*cmdBuffer, 0, 1, &viewport);
- context.getDeviceInterface().cmdSetScissor(*cmdBuffer, 0, 1, &scissor);
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
- beginRenderPass(context.getDeviceInterface(), *cmdBuffer, *renderPass, *framebuffer, makeRect2D(0, 0, maxWidth, 1u), tcu::Vec4(0.0f));
+ gl.enableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
- context.getDeviceInterface().cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+ gl.bindBuffer(GL_ARRAY_BUFFER, vertexBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
- if (extraDataCount > 0)
- {
- context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
- VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
- &descriptorSet.get(), 0u, DE_NULL);
- }
+ gl.vertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), vertexBufferOffset);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
+
+ gl.patchParameteri(GL_PATCH_VERTICES, 2u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glPatchParameter(PATCH_VERTICES)");
- context.getDeviceInterface().cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, vertexBuffer.getBufferPtr(), &vertexBufferOffset);
- context.getDeviceInterface().cmdDraw(*cmdBuffer, 2 * width, 1, 0, 0);
+ gl.drawArrays(GL_PATCHES, 0, 2 * width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
- endRenderPass(context.getDeviceInterface(), *cmdBuffer);
+ gl.disableVertexAttribArray(0);
- copyImageToBuffer(context.getDeviceInterface(), *cmdBuffer, discardableImage.getImage(), imageBufferResult.getBuffer(), tcu::IVec2(maxWidth, 1), VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
- endCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
- Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
- waitFence(context, fence);
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
}
{
- const Allocation& allocResult = imageBufferResult.getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), allocResult);
-
std::vector<const void*> datas;
- datas.push_back(allocResult.getHostPtr());
+ datas.push_back(&imageBufferResult[0]);
if (!checkResult(datas, width/2u, subgroupSize))
failedIterations++;
}
if (0 < failedIterations)
{
- context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
}
return tcu::TestStatus::pass("OK");
}
-bool vkt::subgroups::check(std::vector<const void*> datas,
+bool glc::subgroups::check(std::vector<const void*> datas,
deUint32 width, deUint32 ref)
{
const deUint32* data = reinterpret_cast<const deUint32*>(datas[0]);
return true;
}
-bool vkt::subgroups::checkCompute(std::vector<const void*> datas,
+bool glc::subgroups::checkCompute(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32 ref)
{
return check(datas, globalSizeX * globalSizeY * globalSizeZ, ref);
}
-tcu::TestStatus vkt::subgroups::makeGeometryFrameBufferTest(
- Context& context, VkFormat format, SSBOData* extraData,
+
+tcu::TestStatus glc::subgroups::makeGeometryFrameBufferTest(
+ Context& context, Format format, SSBOData* extraData,
deUint32 extraDataCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
const deUint32 maxWidth = 1024u;
vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
- DescriptorSetLayoutBuilder layoutBuilder;
- DescriptorPoolBuilder poolBuilder;
- DescriptorSetUpdateBuilder updateBuilder;
- Move <VkDescriptorPool> descriptorPool;
- Move <VkDescriptorSet> descriptorSet;
-
- 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("geometry"), 0u));
- const Unique<VkShaderModule> fragmentShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(),
- context.getBinaryCollection().get("fragment"), 0u));
- const Unique<VkRenderPass> renderPass (makeRenderPass(context, format));
- const VkVertexInputBindingDescription vertexInputBinding =
- {
- 0u, // binding;
- static_cast<deUint32>(sizeof(tcu::Vec4)), // stride;
- VK_VERTEX_INPUT_RATE_VERTEX // inputRate
- };
- const VkVertexInputAttributeDescription vertexInputAttribute =
- {
- 0u,
- 0u,
- VK_FORMAT_R32G32B32A32_SFLOAT,
- 0u
- };
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& gshader = context.getSourceCollection().get("geometry");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
for (deUint32 i = 0u; i < extraDataCount; i++)
{
if (extraData[i].isImage)
{
inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraData[i].numElements), 1u, extraData[i].format));
+ // haven't implemented init for images yet
+ DE_ASSERT(extraData[i].initializeType == subgroups::SSBOData::InitializeNone);
}
else
{
- vk::VkDeviceSize size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements;
- inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT));
+ deUint64 size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
}
- const Allocation& alloc = inputBuffers[i]->getAllocation();
- initializeMemory(context, alloc, extraData[i]);
}
for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
- layoutBuilder.addBinding(inputBuffers[ndx]->getType(), 1u, 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<VkPipeline> pipeline (makeGraphicsPipeline(context, *pipelineLayout,
- VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT,
- *vertexShaderModule, *fragmentShaderModule, *geometryShaderModule, DE_NULL, DE_NULL,
- *renderPass, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, &vertexInputBinding, &vertexInputAttribute, true, format));
-
- for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
- poolBuilder.addType(inputBuffers[ndx]->getType());
-
- if (extraDataCount > 0)
{
- descriptorPool = poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
- VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
- descriptorSet = makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout);
- }
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "GEOMETRY, binding = " << extraData[ndx].binding << "\n"
+ << tcu::TestLog::EndMessage;
- for (deUint32 buffersNdx = 0u; buffersNdx < inputBuffers.size(); buffersNdx++)
- {
- if (inputBuffers[buffersNdx]->isImage())
+ if (inputBuffers[ndx]->isImage())
{
- VkDescriptorImageInfo info =
- makeDescriptorImageInfo(inputBuffers[buffersNdx]->getAsImage()->getSampler(),
- inputBuffers[buffersNdx]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(buffersNdx),
- inputBuffers[buffersNdx]->getType(), &info);
- }
- else
+ gl.bindImageTexture(extraData[ndx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraData[ndx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
{
- VkDescriptorBufferInfo info =
- makeDescriptorBufferInfo(inputBuffers[buffersNdx]->getAsBuffer()->getBuffer(),
- 0ull, inputBuffers[buffersNdx]->getAsBuffer()->getSize());
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(buffersNdx),
- inputBuffers[buffersNdx]->getType(), &info);
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraData[ndx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
}
}
- updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT | SHADER_STAGE_GEOMETRY_BIT),
+ &vshader, &fshader, &gshader, DE_NULL, DE_NULL));
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("geom graphics program build failed");
+ }
- const Unique<VkCommandPool> cmdPool (makeCommandPool(context));
const deUint32 subgroupSize = getSubgroupSize(context);
- const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(context, *cmdPool));
- const vk::VkDeviceSize vertexBufferSize = maxWidth * sizeof(tcu::Vec4);
- Buffer vertexBuffer (context, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ const deUint64 vertexBufferSize = maxWidth * sizeof(tcu::Vec4);
+ Buffer vertexBuffer (context, vertexBufferSize, GL_ARRAY_BUFFER);
unsigned totalIterations = 0u;
unsigned failedIterations = 0u;
- Image discardableImage (context, maxWidth, 1u, format, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ Image discardableImage (context, maxWidth, 1u, format);
{
- const Allocation& alloc = vertexBuffer.getAllocation();
- std::vector<tcu::Vec4> data (maxWidth, Vec4(1.0f, 1.0f, 1.0f, 1.0f));
+ glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr();
+ std::vector<tcu::Vec4> data (maxWidth, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
const float pixelSize = 2.0f / static_cast<float>(maxWidth);
float leftHandPosition = -1.0f;
leftHandPosition += pixelSize;
}
- deMemcpy(alloc.getHostPtr(), &data[0], maxWidth * sizeof(tcu::Vec4));
- flushAlloc(context.getDeviceInterface(), context.getDevice(), alloc);
+ deMemcpy(bufferPtr, &data[0], maxWidth * sizeof(tcu::Vec4));
+ vertexBuffer.unmapBufferPtr();
}
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(discardableImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
+
for (deUint32 width = 1u; width < maxWidth; width++)
{
totalIterations++;
- const Unique<VkFramebuffer> framebuffer (makeFramebuffer(context, *renderPass, discardableImage.getImageView(), maxWidth, 1));
- const VkViewport viewport = makeViewport(maxWidth, 1u);
- const VkRect2D scissor = makeRect2D(maxWidth, 1u);
- const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
- Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
- const VkDeviceSize vertexBufferOffset = 0u;
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+ const deUint64 vertexBufferOffset = 0u;
for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
{
- const Allocation& alloc = inputBuffers[ndx]->getAllocation();
- initializeMemory(context, alloc, extraData[ndx]);
+ if (inputBuffers[ndx]->isImage())
+ {
+ DE_ASSERT(extraData[ndx].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[ndx]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
}
- beginCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
{
- context.getDeviceInterface().cmdSetViewport(
- *cmdBuffer, 0, 1, &viewport);
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
- context.getDeviceInterface().cmdSetScissor(
- *cmdBuffer, 0, 1, &scissor);
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
- beginRenderPass(context.getDeviceInterface(), *cmdBuffer, *renderPass, *framebuffer, makeRect2D(0, 0, maxWidth, 1u), tcu::Vec4(0.0f));
+ gl.enableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
- context.getDeviceInterface().cmdBindPipeline(
- *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+ gl.bindBuffer(GL_ARRAY_BUFFER, vertexBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
- if (extraDataCount > 0)
- {
- context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
- VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
- &descriptorSet.get(), 0u, DE_NULL);
- }
+ gl.vertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), vertexBufferOffset);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
- context.getDeviceInterface().cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, vertexBuffer.getBufferPtr(), &vertexBufferOffset);
+ gl.drawArrays(GL_POINTS, 0, width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
- context.getDeviceInterface().cmdDraw(*cmdBuffer, width, 1u, 0u, 0u);
+ gl.disableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
- endRenderPass(context.getDeviceInterface(), *cmdBuffer);
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
- copyImageToBuffer(context.getDeviceInterface(), *cmdBuffer, discardableImage.getImage(), imageBufferResult.getBuffer(), tcu::IVec2(maxWidth, 1), VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
-
- endCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
- Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
- waitFence(context, fence);
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
}
{
- const Allocation& allocResult = imageBufferResult.getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), allocResult);
-
std::vector<const void*> datas;
- datas.push_back(allocResult.getHostPtr());
+ datas.push_back(&imageBufferResult[0]);
if (!checkResult(datas, width, subgroupSize))
failedIterations++;
}
if (0 < failedIterations)
{
- context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
}
return tcu::TestStatus::pass("OK");
}
-
-tcu::TestStatus vkt::subgroups::allStages(
- Context& context, VkFormat format, SSBOData* extraDatas,
+tcu::TestStatus glc::subgroups::allStages(
+ Context& context, Format format, SSBOData* extraDatas,
deUint32 extraDatasCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
- const VkShaderStageFlags shaderStageTested)
+ const ShaderStageFlags shaderStageTested)
{
const deUint32 maxWidth = 1024u;
- vector<VkShaderStageFlagBits> stagesVector;
- VkShaderStageFlags shaderStageRequired = (VkShaderStageFlags)0ull;
-
- Move<VkShaderModule> vertexShaderModule;
- Move<VkShaderModule> teCtrlShaderModule;
- Move<VkShaderModule> teEvalShaderModule;
- Move<VkShaderModule> geometryShaderModule;
- Move<VkShaderModule> fragmentShaderModule;
+ vector<ShaderStageFlags> stagesVector;
+ ShaderStageFlags shaderStageRequired = (ShaderStageFlags)0ull;
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
- if (shaderStageTested & VK_SHADER_STAGE_VERTEX_BIT)
+ if (shaderStageTested & SHADER_STAGE_VERTEX_BIT)
{
- stagesVector.push_back(VK_SHADER_STAGE_VERTEX_BIT);
+ stagesVector.push_back(SHADER_STAGE_VERTEX_BIT);
}
- if (shaderStageTested & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)
+ if (shaderStageTested & SHADER_STAGE_TESS_CONTROL_BIT)
{
- stagesVector.push_back(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- shaderStageRequired |= (shaderStageTested & (VkShaderStageFlags)VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) ? (VkShaderStageFlags) 0u : (VkShaderStageFlags)VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
- shaderStageRequired |= (shaderStageTested & (VkShaderStageFlags)VK_SHADER_STAGE_VERTEX_BIT) ? (VkShaderStageFlags) 0u : (VkShaderStageFlags)VK_SHADER_STAGE_VERTEX_BIT;
+ stagesVector.push_back(SHADER_STAGE_TESS_CONTROL_BIT);
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_TESS_EVALUATION_BIT) ? 0u : (deUint32)SHADER_STAGE_TESS_EVALUATION_BIT));
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_VERTEX_BIT) ? 0u : (deUint32)SHADER_STAGE_VERTEX_BIT));
}
- if (shaderStageTested & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
+ if (shaderStageTested & SHADER_STAGE_TESS_EVALUATION_BIT)
{
- stagesVector.push_back(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
- shaderStageRequired |= (shaderStageTested & (VkShaderStageFlags)VK_SHADER_STAGE_VERTEX_BIT) ? (VkShaderStageFlags) 0u : (VkShaderStageFlags)VK_SHADER_STAGE_VERTEX_BIT;
- shaderStageRequired |= (shaderStageTested & (VkShaderStageFlags)VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) ? (VkShaderStageFlags) 0u : (VkShaderStageFlags)VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
+ stagesVector.push_back(SHADER_STAGE_TESS_EVALUATION_BIT);
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_VERTEX_BIT) ? 0u : (deUint32)SHADER_STAGE_VERTEX_BIT));
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & SHADER_STAGE_TESS_CONTROL_BIT) ? 0u : (deUint32)SHADER_STAGE_TESS_CONTROL_BIT));
}
- if (shaderStageTested & VK_SHADER_STAGE_GEOMETRY_BIT)
+ if (shaderStageTested & SHADER_STAGE_GEOMETRY_BIT)
{
- stagesVector.push_back(VK_SHADER_STAGE_GEOMETRY_BIT);
- const VkShaderStageFlags required = VK_SHADER_STAGE_VERTEX_BIT;
- shaderStageRequired |= (shaderStageTested & required) ? (VkShaderStageFlags) 0 : required;
+ stagesVector.push_back(SHADER_STAGE_GEOMETRY_BIT);
+ const ShaderStageFlags required = SHADER_STAGE_VERTEX_BIT;
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & required) ? 0u : (deUint32)required));
}
- if (shaderStageTested & VK_SHADER_STAGE_FRAGMENT_BIT)
+ if (shaderStageTested & SHADER_STAGE_FRAGMENT_BIT)
{
- const VkShaderStageFlags required = VK_SHADER_STAGE_VERTEX_BIT;
- shaderStageRequired |= (shaderStageTested & required) ? (VkShaderStageFlags) 0 : required;
+ const ShaderStageFlags required = SHADER_STAGE_VERTEX_BIT;
+ shaderStageRequired = (ShaderStageFlags)((deUint32)shaderStageRequired | ((deUint32)(shaderStageTested & required) ? 0u : (deUint32)required));
}
const deUint32 stagesCount = static_cast<deUint32>(stagesVector.size());
- const string vert = (shaderStageRequired & VK_SHADER_STAGE_VERTEX_BIT) ? "vert_noSubgroup" : "vert";
- const string tesc = (shaderStageRequired & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) ? "tesc_noSubgroup" : "tesc";
- const string tese = (shaderStageRequired & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) ? "tese_noSubgroup" : "tese";
+ const string vert = (shaderStageRequired & SHADER_STAGE_VERTEX_BIT) ? "vert_noSubgroup" : "vert";
+ const string tesc = (shaderStageRequired & SHADER_STAGE_TESS_CONTROL_BIT) ? "tesc_noSubgroup" : "tesc";
+ const string tese = (shaderStageRequired & SHADER_STAGE_TESS_EVALUATION_BIT) ? "tese_noSubgroup" : "tese";
- shaderStageRequired = shaderStageTested | shaderStageRequired;
+ shaderStageRequired = (ShaderStageFlags)(shaderStageTested | shaderStageRequired);
- vertexShaderModule = createShaderModule(context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get(vert), 0u);
- if (shaderStageRequired & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)
+ const GlslSource *vshader = &context.getSourceCollection().get(vert);
+ const GlslSource *fshader = DE_NULL;
+ const GlslSource *gshader = DE_NULL;
+ const GlslSource *tcshader = DE_NULL;
+ const GlslSource *teshader = DE_NULL;
+
+ if (shaderStageRequired & SHADER_STAGE_TESS_CONTROL_BIT)
{
- teCtrlShaderModule = createShaderModule(context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get(tesc), 0u);
- teEvalShaderModule = createShaderModule(context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get(tese), 0u);
+ tcshader = &context.getSourceCollection().get(tesc);
+ teshader = &context.getSourceCollection().get(tese);
}
- if (shaderStageRequired & VK_SHADER_STAGE_GEOMETRY_BIT)
+ if (shaderStageRequired & SHADER_STAGE_GEOMETRY_BIT)
{
- if (shaderStageRequired & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
+ if (shaderStageRequired & SHADER_STAGE_TESS_EVALUATION_BIT)
{
// tessellation shaders output line primitives
- geometryShaderModule = createShaderModule(context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("geometry_lines"), 0u);
+ gshader = &context.getSourceCollection().get("geometry_lines");
}
else
{
// otherwise points are processed by geometry shader
- geometryShaderModule = createShaderModule(context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("geometry_points"), 0u);
+ gshader = &context.getSourceCollection().get("geometry_points");
}
}
- if (shaderStageRequired & VK_SHADER_STAGE_FRAGMENT_BIT)
- fragmentShaderModule = createShaderModule(context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("fragment"), 0u);
+ if (shaderStageRequired & SHADER_STAGE_FRAGMENT_BIT)
+ {
+ fshader = &context.getSourceCollection().get("fragment");
+ }
std::vector< de::SharedPtr<BufferOrImage> > inputBuffers(stagesCount + extraDatasCount);
- DescriptorSetLayoutBuilder layoutBuilder;
// The implicit result SSBO we use to store our outputs from the shader
for (deUint32 ndx = 0u; ndx < stagesCount; ++ndx)
{
- const VkDeviceSize shaderSize = (stagesVector[ndx] == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) ? maxWidth * 2 : maxWidth;
- const VkDeviceSize size = getFormatSizeInBytes(format) * shaderSize;
+ const deUint64 shaderSize = (stagesVector[ndx] == SHADER_STAGE_TESS_EVALUATION_BIT) ? maxWidth * 2 : maxWidth;
+ const deUint64 size = getFormatSizeInBytes(format) * shaderSize;
inputBuffers[ndx] = de::SharedPtr<BufferOrImage>(new Buffer(context, size));
- layoutBuilder.addIndexedBinding(inputBuffers[ndx]->getType(), 1, stagesVector[ndx], getResultBinding(stagesVector[ndx]), DE_NULL);
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "inputstage[" << ndx << "] = " << stagesVector[ndx] << " binding = " << getResultBinding(stagesVector[ndx])
+ << tcu::TestLog::EndMessage;
+
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), getResultBinding(stagesVector[ndx]), inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(ndx, inputBuffers[ndx])");
}
for (deUint32 ndx = stagesCount; ndx < stagesCount + extraDatasCount; ++ndx)
if (extraDatas[datasNdx].isImage)
{
inputBuffers[ndx] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraDatas[datasNdx].numElements), 1, extraDatas[datasNdx].format));
+
+ // haven't implemented init for images yet
+ DE_ASSERT(extraDatas[datasNdx].initializeType == subgroups::SSBOData::InitializeNone);
}
else
{
- const vk::VkDeviceSize size = getFormatSizeInBytes(extraDatas[datasNdx].format) * extraDatas[datasNdx].numElements;
+ const deUint64 size = getFormatSizeInBytes(extraDatas[datasNdx].format) * extraDatas[datasNdx].numElements;
inputBuffers[ndx] = de::SharedPtr<BufferOrImage>(new Buffer(context, size));
- }
- const Allocation& alloc = inputBuffers[ndx]->getAllocation();
- initializeMemory(context, alloc, extraDatas[datasNdx]);
-
- layoutBuilder.addIndexedBinding(inputBuffers[ndx]->getType(), 1,
- extraDatas[datasNdx].stages, extraDatas[datasNdx].binding, 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,
- shaderStageRequired,
- *vertexShaderModule, *fragmentShaderModule, *geometryShaderModule, *teCtrlShaderModule, *teEvalShaderModule,
- *renderPass,
- (shaderStageRequired & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_POINT_LIST));
-
- DescriptorPoolBuilder poolBuilder;
-
- for (deUint32 ndx = 0u; ndx < static_cast<deUint32>(inputBuffers.size()); ndx++)
- {
- poolBuilder.addType(inputBuffers[ndx]->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));
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[datasNdx]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
- DescriptorSetUpdateBuilder updateBuilder;
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "extrastage[" << datasNdx << "] = " << extraDatas[datasNdx].stages << " binding = " << extraDatas[datasNdx].binding
+ << tcu::TestLog::EndMessage;
- for (deUint32 ndx = 0u; ndx < stagesCount; ndx++)
- {
if (inputBuffers[ndx]->isImage())
{
- VkDescriptorImageInfo info =
- makeDescriptorImageInfo(inputBuffers[ndx]->getAsImage()->getSampler(),
- inputBuffers[ndx]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(getResultBinding(stagesVector[ndx])),
- inputBuffers[ndx]->getType(), &info);
- }
- else
+ gl.bindImageTexture(extraDatas[datasNdx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_WRITE, extraDatas[datasNdx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture(extraDatas[datasNdx])");
+ } else
{
- VkDescriptorBufferInfo info =
- makeDescriptorBufferInfo(inputBuffers[ndx]->getAsBuffer()->getBuffer(),
- 0ull, inputBuffers[ndx]->getAsBuffer()->getSize());
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(getResultBinding(stagesVector[ndx])),
- inputBuffers[ndx]->getType(), &info);
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraDatas[datasNdx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(extraDatas[datasNdx])");
}
}
- for (deUint32 ndx = stagesCount; ndx < stagesCount + extraDatasCount; ndx++)
- {
- if (inputBuffers[ndx]->isImage())
- {
- VkDescriptorImageInfo info =
- makeDescriptorImageInfo(inputBuffers[ndx]->getAsImage()->getSampler(),
- inputBuffers[ndx]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(extraDatas[ndx -stagesCount].binding),
- inputBuffers[ndx]->getType(), &info);
- }
- else
- {
- VkDescriptorBufferInfo info =
- makeDescriptorBufferInfo(inputBuffers[ndx]->getAsBuffer()->getBuffer(),
- 0ull, inputBuffers[ndx]->getAsBuffer()->getSize());
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, shaderStageRequired, vshader, fshader, gshader, tcshader, teshader));
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(extraDatas[ndx - stagesCount].binding),
- inputBuffers[ndx]->getType(), &info);
- }
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("allstages graphics program build failed");
}
- 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 = 0u;
unsigned failedIterations = 0u;
- Image resultImage (context, maxWidth, 1, format, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
- const Unique<VkFramebuffer> framebuffer (makeFramebuffer(context, *renderPass, resultImage.getImageView(), maxWidth, 1));
- const VkViewport viewport = makeViewport(maxWidth, 1u);
- const VkRect2D scissor = makeRect2D(maxWidth, 1u);
- const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
- Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
- const VkImageSubresourceRange subresourceRange =
- {
- VK_IMAGE_ASPECT_COLOR_BIT, //VkImageAspectFlags aspectMask
- 0u, //deUint32 baseMipLevel
- 1u, //deUint32 levelCount
- 0u, //deUint32 baseArrayLayer
- 1u //deUint32 layerCount
- };
-
- const VkImageMemoryBarrier colorAttachmentBarrier = makeImageMemoryBarrier(
- (VkAccessFlags)0u, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- resultImage.getImage(), subresourceRange);
+ Image resultImage (context, maxWidth, 1, format);
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(resultImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "viewport");
for (deUint32 width = 1u; width < maxWidth; width++)
{
for (deUint32 ndx = stagesCount; ndx < stagesCount + extraDatasCount; ++ndx)
{
// re-init the data
- const Allocation& alloc = inputBuffers[ndx]->getAllocation();
- initializeMemory(context, alloc, extraDatas[ndx - stagesCount]);
+ if (extraDatas[ndx - stagesCount].isImage)
+ {
+ // haven't implemented init for images yet
+ DE_ASSERT(extraDatas[ndx - stagesCount].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[ndx - stagesCount]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
}
totalIterations++;
- beginCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
-
- context.getDeviceInterface().cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 0u, (const VkBufferMemoryBarrier*)DE_NULL, 1u, &colorAttachmentBarrier);
-
- context.getDeviceInterface().cmdSetViewport(*cmdBuffer, 0, 1, &viewport);
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
- context.getDeviceInterface().cmdSetScissor(*cmdBuffer, 0, 1, &scissor);
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
- beginRenderPass(context.getDeviceInterface(), *cmdBuffer, *renderPass, *framebuffer, makeRect2D(0, 0, maxWidth, 1u), tcu::Vec4(0.0f));
-
- 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);
-
- endRenderPass(context.getDeviceInterface(), *cmdBuffer);
+ glw::GLenum drawType;
+ if (shaderStageRequired & SHADER_STAGE_TESS_CONTROL_BIT)
+ {
+ drawType = GL_PATCHES;
+ gl.patchParameteri(GL_PATCH_VERTICES, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glPatchParameter(PATCH_VERTICES)");
+ } else
+ {
+ drawType = GL_POINTS;
+ }
- copyImageToBuffer(context.getDeviceInterface(), *cmdBuffer, resultImage.getImage(), imageBufferResult.getBuffer(), tcu::IVec2(width, 1), VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+ gl.drawArrays(drawType, 0, width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
- endCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
- Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
- waitFence(context, fence);
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
for (deUint32 ndx = 0u; ndx < stagesCount; ++ndx)
{
std::vector<const void*> datas;
+ std::vector<Buffer *> buffersToUnmap;
+
if (!inputBuffers[ndx]->isImage())
{
- const Allocation& resultAlloc = inputBuffers[ndx]->getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), resultAlloc);
+ glw::GLvoid * resultData = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ buffersToUnmap.push_back(inputBuffers[ndx]->getAsBuffer());
// we always have our result data first
- datas.push_back(resultAlloc.getHostPtr());
+ datas.push_back(resultData);
}
for (deUint32 index = stagesCount; index < stagesCount + extraDatasCount; ++index)
const deUint32 datasNdx = index - stagesCount;
if ((stagesVector[ndx] & extraDatas[datasNdx].stages) && (!inputBuffers[index]->isImage()))
{
- const Allocation& resultAlloc = inputBuffers[index]->getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), resultAlloc);
+ glw::GLvoid * resultData = inputBuffers[index]->getAsBuffer()->mapBufferPtr();
+ buffersToUnmap.push_back(inputBuffers[index]->getAsBuffer());
// we always have our result data first
- datas.push_back(resultAlloc.getHostPtr());
+ datas.push_back(resultData);
}
}
- if (!checkResult(datas, (stagesVector[ndx] == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) ? width * 2 : width , subgroupSize))
+ if (!checkResult(datas, (stagesVector[ndx] == SHADER_STAGE_TESS_EVALUATION_BIT) ? width * 2 : width , subgroupSize))
failedIterations++;
+
+ while( !buffersToUnmap.empty() )
+ {
+ Buffer * buf = buffersToUnmap.back();
+ buf->unmapBufferPtr();
+ buffersToUnmap.pop_back();
+ }
}
- if (shaderStageTested & VK_SHADER_STAGE_FRAGMENT_BIT)
+ if (shaderStageTested & SHADER_STAGE_FRAGMENT_BIT)
{
std::vector<const void*> datas;
- const Allocation& resultAlloc = imageBufferResult.getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), resultAlloc);
+ std::vector<Buffer *> buffersToUnmap;
// we always have our result data first
- datas.push_back(resultAlloc.getHostPtr());
+ datas.push_back(&imageBufferResult[0]);
for (deUint32 index = stagesCount; index < stagesCount + extraDatasCount; ++index)
{
const deUint32 datasNdx = index - stagesCount;
- if (VK_SHADER_STAGE_FRAGMENT_BIT & extraDatas[datasNdx].stages && (!inputBuffers[index]->isImage()))
+ if (SHADER_STAGE_FRAGMENT_BIT & extraDatas[datasNdx].stages && (!inputBuffers[index]->isImage()))
{
- const Allocation& alloc = inputBuffers[index]->getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), alloc);
+ glw::GLvoid * resultData = inputBuffers[index]->getAsBuffer()->mapBufferPtr();
+ buffersToUnmap.push_back(inputBuffers[index]->getAsBuffer());
// we always have our result data first
- datas.push_back(alloc.getHostPtr());
+ datas.push_back(resultData);
}
}
if (!checkResult(datas, width , subgroupSize))
failedIterations++;
+
+ while( !buffersToUnmap.empty() )
+ {
+ Buffer * buf = buffersToUnmap.back();
+ buf->unmapBufferPtr();
+ buffersToUnmap.pop_back();
+ }
}
- context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
}
if (0 < failedIterations)
{
- context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
}
}
-
return tcu::TestStatus::pass("OK");
}
-tcu::TestStatus vkt::subgroups::makeVertexFrameBufferTest(Context& context, vk::VkFormat format,
+tcu::TestStatus glc::subgroups::makeVertexFrameBufferTest(Context& context, Format format,
SSBOData* extraData, deUint32 extraDataCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
{
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
const deUint32 maxWidth = 1024u;
vector<de::SharedPtr<BufferOrImage> > inputBuffers (extraDataCount);
- DescriptorSetLayoutBuilder layoutBuilder;
- 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("fragment"), 0u));
- const Unique<VkRenderPass> renderPass (makeRenderPass(context, format));
-
- const VkVertexInputBindingDescription vertexInputBinding =
- {
- 0u, // binding;
- static_cast<deUint32>(sizeof(tcu::Vec4)), // stride;
- VK_VERTEX_INPUT_RATE_VERTEX // inputRate
- };
- const VkVertexInputAttributeDescription vertexInputAttribute =
- {
- 0u,
- 0u,
- VK_FORMAT_R32G32B32A32_SFLOAT,
- 0u
- };
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
for (deUint32 i = 0u; i < extraDataCount; i++)
{
if (extraData[i].isImage)
{
inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraData[i].numElements), 1u, extraData[i].format));
+
+ // haven't implemented init for images yet
+ DE_ASSERT(extraData[i].initializeType == subgroups::SSBOData::InitializeNone);
}
else
{
- vk::VkDeviceSize size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements;
- inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT));
- }
- const Allocation& alloc = inputBuffers[i]->getAllocation();
- initializeMemory(context, alloc, extraData[i]);
- }
-
- for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
- layoutBuilder.addBinding(inputBuffers[ndx]->getType(), 1u, VK_SHADER_STAGE_VERTEX_BIT, DE_NULL);
-
- const Unique<VkDescriptorSetLayout> descriptorSetLayout (layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+ deUint64 size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements;
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
- const Unique<VkPipelineLayout> pipelineLayout (makePipelineLayout(context, *descriptorSetLayout));
-
- 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, VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
- &vertexInputBinding, &vertexInputAttribute, true, format));
- DescriptorPoolBuilder poolBuilder;
- DescriptorSetUpdateBuilder updateBuilder;
-
-
- for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
- poolBuilder.addType(inputBuffers[ndx]->getType());
-
- Move <VkDescriptorPool> descriptorPool;
- Move <VkDescriptorSet> descriptorSet;
-
- if (extraDataCount > 0)
- {
- descriptorPool = poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
- VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
- descriptorSet = makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout);
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
}
for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
{
- const Allocation& alloc = inputBuffers[ndx]->getAllocation();
- initializeMemory(context, alloc, extraData[ndx]);
- }
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << ndx << "](" << inputBuffers[ndx]->getType() << ", " << inputBuffers[ndx]->getId() << " ), "
+ << "VERTEX, binding = " << extraData[ndx].binding << "\n"
+ << tcu::TestLog::EndMessage;
- for (deUint32 buffersNdx = 0u; buffersNdx < inputBuffers.size(); buffersNdx++)
- {
- if (inputBuffers[buffersNdx]->isImage())
+ if (inputBuffers[ndx]->isImage())
{
- VkDescriptorImageInfo info =
- makeDescriptorImageInfo(inputBuffers[buffersNdx]->getAsImage()->getSampler(),
- inputBuffers[buffersNdx]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(buffersNdx),
- inputBuffers[buffersNdx]->getType(), &info);
- }
- else
+ gl.bindImageTexture(extraData[ndx].binding, inputBuffers[ndx]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraData[ndx].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
{
- VkDescriptorBufferInfo info =
- makeDescriptorBufferInfo(inputBuffers[buffersNdx]->getAsBuffer()->getBuffer(),
- 0ull, inputBuffers[buffersNdx]->getAsBuffer()->getSize());
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(buffersNdx),
- inputBuffers[buffersNdx]->getType(), &info);
+ gl.bindBufferBase(inputBuffers[ndx]->getType(), extraData[ndx].binding, inputBuffers[ndx]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
}
}
- updateBuilder.update(context.getDeviceInterface(), context.getDevice());
- const Unique<VkCommandPool> cmdPool (makeCommandPool(context));
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT),
+ &vshader, &fshader, DE_NULL, DE_NULL, DE_NULL));
- const deUint32 subgroupSize = getSubgroupSize(context);
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("vert graphics program build failed");
+ }
- const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(context, *cmdPool));
+ const deUint32 subgroupSize = getSubgroupSize(context);
- const vk::VkDeviceSize vertexBufferSize = maxWidth * sizeof(tcu::Vec4);
- Buffer vertexBuffer (context, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ const deUint64 vertexBufferSize = maxWidth * sizeof(tcu::Vec4);
+ Buffer vertexBuffer (context, vertexBufferSize, GL_ARRAY_BUFFER);
unsigned totalIterations = 0u;
unsigned failedIterations = 0u;
- Image discardableImage (context, maxWidth, 1u, format, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ Image discardableImage (context, maxWidth, 1u, format);
{
- const Allocation& alloc = vertexBuffer.getAllocation();
- std::vector<tcu::Vec4> data (maxWidth, Vec4(1.0f, 1.0f, 1.0f, 1.0f));
+ glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr();
+ std::vector<tcu::Vec4> data (maxWidth, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
const float pixelSize = 2.0f / static_cast<float>(maxWidth);
float leftHandPosition = -1.0f;
leftHandPosition += pixelSize;
}
- deMemcpy(alloc.getHostPtr(), &data[0], maxWidth * sizeof(tcu::Vec4));
- flushAlloc(context.getDeviceInterface(), context.getDevice(), alloc);
+ deMemcpy(bufferPtr, &data[0], maxWidth * sizeof(tcu::Vec4));
+ vertexBuffer.unmapBufferPtr();
}
+ Vao vao(context);
+ Fbo fbo(context);
+ fbo.bind2D(discardableImage);
+
+ gl.viewport(0, 0, maxWidth, 1u);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
+
for (deUint32 width = 1u; width < maxWidth; width++)
{
totalIterations++;
- const Unique<VkFramebuffer> framebuffer (makeFramebuffer(context, *renderPass, discardableImage.getImageView(), maxWidth, 1));
- const VkViewport viewport = makeViewport(maxWidth, 1u);
- const VkRect2D scissor = makeRect2D(maxWidth, 1u);
- const vk::VkDeviceSize imageResultSize = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
- Buffer imageBufferResult (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
- const VkDeviceSize vertexBufferOffset = 0u;
+ const deUint64 imageResultSize = getFormatSizeInBytes(format) * maxWidth;
+ vector<glw::GLubyte> imageBufferResult(imageResultSize);
+ const deUint64 vertexBufferOffset = 0u;
for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
{
- const Allocation& alloc = inputBuffers[ndx]->getAllocation();
- initializeMemory(context, alloc, extraData[ndx]);
+ if (inputBuffers[ndx]->isImage())
+ {
+ DE_ASSERT(extraData[ndx].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[ndx]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraData[ndx]);
+ inputBuffers[ndx]->getAsBuffer()->unmapBufferPtr();
+ }
}
- beginCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
{
- context.getDeviceInterface().cmdSetViewport(
- *cmdBuffer, 0, 1, &viewport);
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
- context.getDeviceInterface().cmdSetScissor(
- *cmdBuffer, 0, 1, &scissor);
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
- beginRenderPass(context.getDeviceInterface(), *cmdBuffer, *renderPass, *framebuffer, makeRect2D(0, 0, maxWidth, 1u), tcu::Vec4(0.0f));
+ gl.enableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
- context.getDeviceInterface().cmdBindPipeline(
- *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+ gl.bindBuffer(GL_ARRAY_BUFFER, vertexBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
- if (extraDataCount > 0)
- {
- context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
- VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
- &descriptorSet.get(), 0u, DE_NULL);
- }
-
- context.getDeviceInterface().cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, vertexBuffer.getBufferPtr(), &vertexBufferOffset);
+ gl.vertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), vertexBufferOffset);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
- context.getDeviceInterface().cmdDraw(*cmdBuffer, width, 1u, 0u, 0u);
+ gl.drawArrays(GL_POINTS, 0, width);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
- endRenderPass(context.getDeviceInterface(), *cmdBuffer);
+ gl.disableVertexAttribArray(0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
- copyImageToBuffer(context.getDeviceInterface(), *cmdBuffer, discardableImage.getImage(), imageBufferResult.getBuffer(), tcu::IVec2(maxWidth, 1), VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
- endCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
- Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
- waitFence(context, fence);
+ gl.readPixels(0, 0, width, 1, readFormat, readType, (GLvoid*)&imageBufferResult[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
}
{
- const Allocation& allocResult = imageBufferResult.getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), allocResult);
-
std::vector<const void*> datas;
- datas.push_back(allocResult.getHostPtr());
+ datas.push_back(&imageBufferResult[0]);
if (!checkResult(datas, width, subgroupSize))
failedIterations++;
}
if (0 < failedIterations)
{
- context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
}
return tcu::TestStatus::pass("OK");
}
-tcu::TestStatus vkt::subgroups::makeFragmentFrameBufferTest (Context& context, VkFormat format, SSBOData* extraDatas,
+tcu::TestStatus glc::subgroups::makeFragmentFrameBufferTest (Context& context, Format 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("fragment"), 0u));
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ const glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+
+ const GlslSource& vshader = context.getSourceCollection().get("vert");
+ const GlslSource& fshader = context.getSourceCollection().get("fragment");
std::vector< de::SharedPtr<BufferOrImage> > inputBuffers(extraDatasCount);
{
inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context,
static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format));
+
+ // haven't implemented init for images yet
+ DE_ASSERT(extraDatas[i].initializeType == subgroups::SSBOData::InitializeNone);
}
else
{
- vk::VkDeviceSize size =
+ deUint64 size =
getFormatSizeInBytes(extraDatas[i].format) * extraDatas[i].numElements;
- inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT));
- }
-
- const Allocation& alloc = inputBuffers[i]->getAllocation();
- initializeMemory(context, alloc, extraDatas[i]);
- }
+ inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, GL_UNIFORM_BUFFER));
- DescriptorSetLayoutBuilder layoutBuilder;
-
- for (deUint32 i = 0; i < extraDatasCount; i++)
- {
- layoutBuilder.addBinding(inputBuffers[i]->getType(), 1,
- VK_SHADER_STAGE_FRAGMENT_BIT, DE_NULL);
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
}
- 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, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
- DE_NULL, DE_NULL, true));
-
- 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());
- }
-
- Move<VkDescriptorPool> descriptorPool;
- // Create descriptor set
- Move<VkDescriptorSet> descriptorSet;
-
- if (extraDatasCount > 0)
- {
- descriptorPool = poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
- VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
-
- descriptorSet = makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout);
- }
-
- DescriptorSetUpdateBuilder updateBuilder;
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << i << "](" << inputBuffers[i]->getType() << ", " << inputBuffers[i]->getId() << " ), "
+ << "FRAGMENT, binding = " << extraDatas[i].binding << "\n"
+ << tcu::TestLog::EndMessage;
- 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
+ gl.bindImageTexture(extraDatas[i].binding, inputBuffers[i]->getId(),
+ 0, GL_FALSE, 0, GL_READ_ONLY, extraDatas[i].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture()");
+ } else
{
- VkDescriptorBufferInfo info =
- makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(),
- 0ull, inputBuffers[i]->getAsBuffer()->getSize());
-
- updateBuilder.writeSingle(*descriptorSet,
- DescriptorSetUpdateBuilder::Location::binding(i),
- inputBuffers[i]->getType(), &info);
+ gl.bindBufferBase(inputBuffers[i]->getType(), extraDatas[i].binding, inputBuffers[i]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase()");
}
}
- if (extraDatasCount > 0)
- updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+ de::MovePtr<glu::ShaderProgram> pipeline(
+ makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT),
+ &vshader, &fshader, DE_NULL, DE_NULL, DE_NULL));
- const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+ if (!pipeline->isOk())
+ {
+ return tcu::TestStatus::fail("frag graphics program build failed");
+ }
const deUint32 subgroupSize = getSubgroupSize(context);
- const Unique<VkCommandBuffer> cmdBuffer(
- makeCommandBuffer(context, *cmdPool));
-
unsigned totalIterations = 0;
unsigned failedIterations = 0;
+ Vao vao(context);
+ Fbo fbo(context);
+
for (deUint32 width = 8; width <= subgroupSize; width *= 2)
{
for (deUint32 height = 8; height <= subgroupSize; height *= 2)
// re-init the data
for (deUint32 i = 0; i < extraDatasCount; i++)
{
- const Allocation& alloc = inputBuffers[i]->getAllocation();
- initializeMemory(context, alloc, extraDatas[i]);
+ if (inputBuffers[i]->isImage())
+ {
+ DE_ASSERT(extraDatas[i].initializeType == subgroups::SSBOData::InitializeNone);
+ } else
+ {
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, extraDatas[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
}
- VkDeviceSize formatSize = getFormatSizeInBytes(format);
- const VkDeviceSize resultImageSizeInBytes =
+ deUint64 formatSize = getFormatSizeInBytes(format);
+ const deUint64 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));
-
- beginCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
-
- VkViewport viewport = makeViewport(width, height);
-
- context.getDeviceInterface().cmdSetViewport(
- *cmdBuffer, 0, 1, &viewport);
+ Image resultImage(context, width, height, format);
- VkRect2D scissor = {{0, 0}, {width, height}};
+ vector<glw::GLubyte> resultBuffer(resultImageSizeInBytes);
- context.getDeviceInterface().cmdSetScissor(
- *cmdBuffer, 0, 1, &scissor);
+ fbo.bind2D(resultImage);
- beginRenderPass(context.getDeviceInterface(), *cmdBuffer, *renderPass, *framebuffer, makeRect2D(0, 0, width, height), tcu::Vec4(0.0f));
+ gl.viewport(0, 0, width, height);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport");
- context.getDeviceInterface().cmdBindPipeline(
- *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
+ gl.clear(GL_COLOR_BUFFER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
- if (extraDatasCount > 0)
- {
- context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
- VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
- &descriptorSet.get(), 0u, DE_NULL);
- }
-
- context.getDeviceInterface().cmdDraw(*cmdBuffer, 4, 1, 0, 0);
-
- endRenderPass(context.getDeviceInterface(), *cmdBuffer);
+ gl.useProgram(pipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
- copyImageToBuffer(context.getDeviceInterface(), *cmdBuffer, resultImage.getImage(), resultBuffer.getBuffer(), tcu::IVec2(width, height), VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+ gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
- endCommandBuffer(context.getDeviceInterface(), *cmdBuffer);
+ GLenum readFormat;
+ GLenum readType;
+ getFormatReadInfo(format, readFormat, readType);
- Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
-
- waitFence(context, fence);
+ gl.readPixels(0, 0, width, height, readFormat, readType, (GLvoid*)&resultBuffer[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
std::vector<const void*> datas;
{
- const Allocation& resultAlloc = resultBuffer.getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), resultAlloc);
-
// we always have our result data first
- datas.push_back(resultAlloc.getHostPtr());
+ datas.push_back(&resultBuffer[0]);
}
if (!checkResult(datas, width, height, subgroupSize))
{
failedIterations++;
}
-
- context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
}
}
if (0 < failedIterations)
{
- context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ <<totalIterations << " values passed" << tcu::TestLog::EndMessage;
}
-
return tcu::TestStatus::pass("OK");
}
-tcu::TestStatus vkt::subgroups::makeComputeTest(
- Context& context, VkFormat format, SSBOData* inputs, deUint32 inputsCount,
+tcu::TestStatus glc::subgroups::makeComputeTest(
+ Context& context, Format 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 glw::Functions& gl = context.getDeqpContext().getRenderContext().getFunctions();
+ deUint64 elementSize = getFormatSizeInBytes(format);
- const VkDeviceSize resultBufferSize = maxSupportedSubgroupSize() *
+ const deUint64 resultBufferSize = maxSupportedSubgroupSize() *
maxSupportedSubgroupSize() *
maxSupportedSubgroupSize();
- const VkDeviceSize resultBufferSizeInBytes = resultBufferSize * elementSize;
+ const deUint64 resultBufferSizeInBytes = resultBufferSize * elementSize;
Buffer resultBuffer(
context, resultBufferSizeInBytes);
{
inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context,
static_cast<deUint32>(inputs[i].numElements), 1, inputs[i].format));
+ // haven't implemented init for images yet
+ DE_ASSERT(inputs[i].initializeType == subgroups::SSBOData::InitializeNone);
}
else
{
- vk::VkDeviceSize size =
+ deUint64 size =
getFormatSizeInBytes(inputs[i].format) * inputs[i].numElements;
inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size));
+
+ glw::GLvoid *ptr = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
+ initializeMemory(context.getDeqpContext(), ptr, inputs[i]);
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
}
- 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);
- }
+ tcu::TestLog& log = context.getDeqpContext().getTestContext().getLog();
+ log << tcu::TestLog::Message
+ << "binding resultbuffer(type=" << resultBuffer.getType()
+ << ", id=" << resultBuffer.getId() << ", binding=0), COMPUTE"
+ << tcu::TestLog::EndMessage;
- 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());
+ gl.bindBufferBase(resultBuffer.getType(), 0, resultBuffer.getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(0, resultBuffer)");
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));
+ log << tcu::TestLog::Message
+ << "binding inputBuffers[" << i << "](type=" << inputBuffers[i]->getType()
+ << ", id=" << inputBuffers[i]->getId() << ", binding="
+ << inputs[i].binding << "), 1, COMPUTE"
+ << tcu::TestLog::EndMessage;
- 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
+ gl.bindImageTexture(inputs[i].binding, inputBuffers[i]->getId(),
+ 0, GL_FALSE, 0, GL_READ_WRITE, inputs[i].format);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture(inputBuffer[i]");
+ } 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);
+ gl.bindBufferBase(inputBuffers[i]->getType(), inputs[i].binding, inputBuffers[i]->getId());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase(inputBuffer[i])");
}
}
- updateBuilder.update(context.getDeviceInterface(), context.getDevice());
-
- const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+ const GlslSource &cshader = context.getSourceCollection().get("comp");
unsigned totalIterations = 0;
unsigned failedIterations = 0;
const deUint32 subgroupSize = getSubgroupSize(context);
- const Unique<VkCommandBuffer> cmdBuffer(
- makeCommandBuffer(context, *cmdPool));
-
const deUint32 numWorkgroups[3] = {4, 2, 2};
const deUint32 localSizesToTestCount = 15;
{1, 1, 1} // Isn't used, just here to make double buffering checks easier
};
- Move<VkPipeline> lastPipeline(
- makeComputePipeline(context, *pipelineLayout, *shaderModule,
+
+ de::MovePtr<glu::ShaderProgram> lastPipeline(
+ makeComputePipeline(context, cshader,
localSizesToTest[0][0], localSizesToTest[0][1], localSizesToTest[0][2]));
for (deUint32 index = 0; index < (localSizesToTestCount - 1); index++)
// we are running one test
totalIterations++;
- beginCommandBuffer(context.getDeviceInterface(), *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.getDeviceInterface(), *cmdBuffer);
+ if (!lastPipeline->isOk())
+ {
+ return tcu::TestStatus::fail("compute shaders build failed");
+ }
- Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+ gl.useProgram(lastPipeline->getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
- Move<VkPipeline> nextPipeline(
- makeComputePipeline(context, *pipelineLayout, *shaderModule,
- nextX, nextY, nextZ));
+ gl.dispatchCompute(numWorkgroups[0], numWorkgroups[1], numWorkgroups[2]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDispatchCompute");
- waitFence(context, fence);
+ de::MovePtr<glu::ShaderProgram> nextPipeline(
+ makeComputePipeline(context, cshader, nextX, nextY, nextZ));
std::vector<const void*> datas;
{
- const Allocation& resultAlloc = resultBuffer.getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), resultAlloc);
+ glw::GLvoid * resultData = resultBuffer.mapBufferPtr();
// we always have our result data first
- datas.push_back(resultAlloc.getHostPtr());
+ datas.push_back(resultData);
}
for (deUint32 i = 0; i < inputsCount; i++)
{
if (!inputBuffers[i]->isImage())
{
- const Allocation& resultAlloc = inputBuffers[i]->getAllocation();
- invalidateAlloc(context.getDeviceInterface(), context.getDevice(), resultAlloc);
+ glw::GLvoid *resultData = inputBuffers[i]->getAsBuffer()->mapBufferPtr();
// we always have our result data first
- datas.push_back(resultAlloc.getHostPtr());
+ datas.push_back(resultData);
}
}
failedIterations++;
}
- context.getDeviceInterface().resetCommandBuffer(*cmdBuffer, 0);
+ resultBuffer.unmapBufferPtr();
+ for (deUint32 i = 0; i < inputsCount; i++)
+ {
+ if (!inputBuffers[i]->isImage())
+ {
+ inputBuffers[i]->getAsBuffer()->unmapBufferPtr();
+ }
+ }
lastPipeline = nextPipeline;
}
if (0 < failedIterations)
{
- context.getTestContext().getLog()
- << TestLog::Message << (totalIterations - failedIterations) << " / "
- << totalIterations << " values passed" << TestLog::EndMessage;
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
return tcu::TestStatus::fail("Failed!");
+ } else
+ {
+ log << tcu::TestLog::Message << (totalIterations - failedIterations) << " / "
+ << totalIterations << " values passed" << tcu::TestLog::EndMessage;
}
return tcu::TestStatus::pass("OK");
-#ifndef _VKTSUBGROUPSTESTSUTILS_HPP
-#define _VKTSUBGROUPSTESTSUTILS_HPP
+#ifndef _GLCSUBGROUPSTESTSUTILS_HPP
+#define _GLCSUBGROUPSTESTSUTILS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \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 "deDefs.hpp"
+#include "deSTLUtil.hpp"
+#include "deStringUtil.hpp"
+#include "glwEnums.hpp"
+#include "glwFunctions.hpp"
+#include "glwDefs.hpp"
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+#include "glcTestCase.hpp"
+#include "glcSpirvUtils.hpp"
#include "tcuFormatUtil.hpp"
#include "tcuTestLog.hpp"
#include "tcuVectorUtil.hpp"
#include "gluShaderUtil.hpp"
+#include "gluContextInfo.hpp"
#include "deSharedPtr.hpp"
#include "deUniquePtr.hpp"
#include <string>
-namespace vkt
+namespace glc
{
+
+enum ShaderType
+{
+ SHADER_TYPE_GLSL = 0,
+ SHADER_TYPE_SPIRV,
+
+ SHADER_TYPE_LAST
+};
+
+template<typename Program>
+class ProgramCollection
+{
+public:
+ ProgramCollection (void);
+ ~ProgramCollection (void);
+
+ void clear (void);
+
+ Program& add (const std::string& name);
+ void add (const std::string& name, de::MovePtr<Program>& program);
+
+ bool contains (const std::string& name) const;
+ const Program& get (const std::string& name) const;
+
+ class Iterator
+ {
+ private:
+ typedef typename std::map<std::string, Program*>::const_iterator IteratorImpl;
+
+ public:
+ explicit Iterator (const IteratorImpl& i) : m_impl(i) {}
+
+ Iterator& operator++ (void) { ++m_impl; return *this; }
+ const Program& operator* (void) const { return getProgram(); }
+
+ const std::string& getName (void) const { return m_impl->first; }
+ const Program& getProgram (void) const { return *m_impl->second; }
+
+ bool operator== (const Iterator& other) const { return m_impl == other.m_impl; }
+ bool operator!= (const Iterator& other) const { return m_impl != other.m_impl; }
+
+ private:
+
+ IteratorImpl m_impl;
+ };
+
+ Iterator begin (void) const { return Iterator(m_programs.begin()); }
+ Iterator end (void) const { return Iterator(m_programs.end()); }
+
+ bool empty (void) const { return m_programs.empty(); }
+
+private:
+ typedef std::map<std::string, Program*> ProgramMap;
+
+ ProgramMap m_programs;
+};
+
+template<typename Program>
+ProgramCollection<Program>::ProgramCollection (void)
+{
+}
+
+template<typename Program>
+ProgramCollection<Program>::~ProgramCollection (void)
+{
+ clear();
+}
+
+template<typename Program>
+void ProgramCollection<Program>::clear (void)
+{
+ for (typename ProgramMap::const_iterator i = m_programs.begin(); i != m_programs.end(); ++i)
+ delete i->second;
+ m_programs.clear();
+}
+
+template<typename Program>
+Program& ProgramCollection<Program>::add (const std::string& name)
+{
+ DE_ASSERT(!contains(name));
+ de::MovePtr<Program> prog = de::newMovePtr<Program>();
+ m_programs[name] = prog.get();
+ prog.release();
+ return *m_programs[name];
+}
+
+template<typename Program>
+void ProgramCollection<Program>::add (const std::string& name, de::MovePtr<Program>& program)
+{
+ DE_ASSERT(!contains(name));
+ m_programs[name] = program.get();
+ program.release();
+}
+
+template<typename Program>
+bool ProgramCollection<Program>::contains (const std::string& name) const
+{
+ return de::contains(m_programs, name);
+}
+
+template<typename Program>
+const Program& ProgramCollection<Program>::get (const std::string& name) const
+{
+ DE_ASSERT(contains(name));
+ return *m_programs.find(name)->second;
+}
+
+struct GlslSource
+{
+ std::vector<std::string> sources[glu::SHADERTYPE_LAST];
+
+ GlslSource& operator<< (const glu::ShaderSource& shaderSource)
+ {
+ sources[shaderSource.shaderType].push_back(shaderSource.source);
+ return *this;
+ }
+};
+
+typedef ProgramCollection<GlslSource> SourceCollections;
+
+
+class Context
+{
+public:
+ Context (deqp::Context& deqpCtx)
+ : m_deqpCtx(deqpCtx)
+ , m_sourceCollection()
+ , m_glslVersion(glu::getContextTypeGLSLVersion(m_deqpCtx.getRenderContext().getType()))
+ , m_shaderType(SHADER_TYPE_GLSL)
+ {}
+ ~Context (void) {}
+ deqp::Context& getDeqpContext (void) const { return m_deqpCtx; }
+ SourceCollections& getSourceCollection (void) { return m_sourceCollection; }
+ glu::GLSLVersion getGLSLVersion (void) { return m_glslVersion; }
+ ShaderType getShaderType (void) { return m_shaderType; }
+ void setShaderType (ShaderType type) { m_shaderType = type; }
+
+protected:
+ deqp::Context& m_deqpCtx;
+ SourceCollections m_sourceCollection;
+ glu::GLSLVersion m_glslVersion;
+ ShaderType m_shaderType;
+};
+
namespace subgroups
{
+
+template<typename Arg0>
+class SubgroupFactory : public deqp::TestCase
+{
+public:
+ //void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+ typedef void (*InitFunction)(SourceCollections& programCollection, Arg0 arg0);
+ //void supportedCheck (Context& context, CaseDefinition caseDef)
+ typedef void (*SupportFunction)(Context& context, Arg0 arg0);
+ //tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+ typedef tcu::TestStatus (*TestFunction)(Context& context, const Arg0 arg0);
+
+ /* Public methods */
+ SubgroupFactory(deqp::Context& context, tcu::TestNodeType type, const std::string& name, const std::string& desc,
+ SupportFunction suppFunc, InitFunction initFunc, TestFunction testFunc, Arg0 arg0)
+ : TestCase(context, type, name.c_str(), desc.c_str())
+ , m_supportedFunc(suppFunc)
+ , m_initFunc(initFunc)
+ , m_testFunc(testFunc)
+ , m_arg0(arg0)
+ , m_glcContext(m_context)
+ {}
+
+ void init()
+ {
+ m_supportedFunc(m_glcContext, m_arg0);
+
+ m_initFunc(m_glcContext.getSourceCollection(), m_arg0);
+ }
+
+ void deinit()
+ {
+ // nothing to do
+ }
+
+ tcu::TestNode::IterateResult iterate()
+ {
+ DE_ASSERT(m_testFunc);
+ tcu::TestLog& log = m_testCtx.getLog();
+
+ try {
+ // do SPIRV version of tests if supported
+ log << tcu::TestLog::Message << "SPIRV pass beginning..." << tcu::TestLog::EndMessage;
+ spirvUtils::checkGlSpirvSupported(m_glcContext.getDeqpContext());
+
+ m_glcContext.setShaderType(SHADER_TYPE_SPIRV);
+
+ const tcu::TestStatus result = m_testFunc(m_glcContext, m_arg0);
+ if (result.isComplete())
+ {
+ DE_ASSERT(m_testCtx.getTestResult() == QP_TEST_RESULT_LAST);
+ if (result.getCode() == QP_TEST_RESULT_PASS)
+ {
+ log << tcu::TestLog::Message << "SPIRV pass completed successfully ("
+ << result.getDescription() << ")." << tcu::TestLog::EndMessage;
+ } else {
+ // test failed - log result and stop
+ m_testCtx.setTestResult(result.getCode(), result.getDescription().c_str());
+ return tcu::TestNode::STOP;
+ }
+ }
+ } catch(tcu::NotSupportedError& e)
+ {
+ log << tcu::TestLog::Message << "SPIRV pass skipped ("
+ << e.getMessage() << ")." << tcu::TestLog::EndMessage;
+ }
+
+ // do GLSL version of the tests
+ log << tcu::TestLog::Message << "GLSL pass beginning..." << tcu::TestLog::EndMessage;
+ m_glcContext.setShaderType(SHADER_TYPE_GLSL);
+ const tcu::TestStatus result = m_testFunc(m_glcContext, m_arg0);
+
+ if (result.isComplete())
+ {
+ DE_ASSERT(m_testCtx.getTestResult() == QP_TEST_RESULT_LAST);
+ log << tcu::TestLog::Message << "GLSL pass completed successfully ("
+ << result.getDescription() << ")." << tcu::TestLog::EndMessage;
+ m_testCtx.setTestResult(result.getCode(), result.getDescription().c_str());
+ return tcu::TestNode::STOP;
+ }
+
+ return tcu::TestNode::CONTINUE;
+ }
+
+ static void addFunctionCaseWithPrograms (deqp::TestCaseGroup* group,
+ const std::string& name,
+ const std::string& desc,
+ SupportFunction suppFunc,
+ InitFunction initFunc,
+ TestFunction testFunc,
+ Arg0 arg0)
+ {
+ group->addChild(new SubgroupFactory(group->getContext(), tcu::NODETYPE_SELF_VALIDATE, name, desc, suppFunc, initFunc, testFunc, arg0));
+ }
+
+private:
+ SupportFunction m_supportedFunc;
+ InitFunction m_initFunc;
+ TestFunction m_testFunc;
+ Arg0 m_arg0;
+
+ Context m_glcContext;
+};
+
+
+typedef enum ShaderStageFlags
+{
+ SHADER_STAGE_VERTEX_BIT = GL_VERTEX_SHADER_BIT,
+ SHADER_STAGE_FRAGMENT_BIT = GL_FRAGMENT_SHADER_BIT,
+ SHADER_STAGE_GEOMETRY_BIT = GL_GEOMETRY_SHADER_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT = GL_TESS_CONTROL_SHADER_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT = GL_TESS_EVALUATION_SHADER_BIT,
+ SHADER_STAGE_COMPUTE_BIT = GL_COMPUTE_SHADER_BIT,
+ SHADER_STAGE_ALL_GRAPHICS = (SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT | SHADER_STAGE_GEOMETRY_BIT |
+ SHADER_STAGE_TESS_CONTROL_BIT | SHADER_STAGE_TESS_EVALUATION_BIT ),
+ SHADER_STAGE_ALL_VALID = (SHADER_STAGE_ALL_GRAPHICS | SHADER_STAGE_COMPUTE_BIT),
+} ShaderStageFlags;
+
+typedef enum SubgroupFeatureFlags
+{
+ SUBGROUP_FEATURE_BASIC_BIT = GL_SUBGROUP_FEATURE_BASIC_BIT_KHR,
+ SUBGROUP_FEATURE_VOTE_BIT = GL_SUBGROUP_FEATURE_VOTE_BIT_KHR,
+ SUBGROUP_FEATURE_ARITHMETIC_BIT = GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR,
+ SUBGROUP_FEATURE_BALLOT_BIT = GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR,
+ SUBGROUP_FEATURE_SHUFFLE_BIT = GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR,
+ SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR,
+ SUBGROUP_FEATURE_CLUSTERED_BIT = GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR,
+ SUBGROUP_FEATURE_QUAD_BIT = GL_SUBGROUP_FEATURE_QUAD_BIT_KHR,
+ SUBGROUP_FEATURE_PARTITIONED_BIT_NV = GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV,
+ SUBGROUP_FEATURE_ALL_VALID = (SUBGROUP_FEATURE_BASIC_BIT | SUBGROUP_FEATURE_VOTE_BIT | SUBGROUP_FEATURE_ARITHMETIC_BIT |
+ SUBGROUP_FEATURE_BALLOT_BIT | SUBGROUP_FEATURE_SHUFFLE_BIT | SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT |
+ SUBGROUP_FEATURE_CLUSTERED_BIT | SUBGROUP_FEATURE_QUAD_BIT | SUBGROUP_FEATURE_QUAD_BIT |
+ SUBGROUP_FEATURE_PARTITIONED_BIT_NV),
+} SubgroupFeatureFlags;
+
+typedef enum Format
+{
+ FORMAT_UNDEFINED = 0,
+ FORMAT_R32_SINT = GL_R32I,
+ FORMAT_R32_UINT = GL_R32UI,
+ FORMAT_R32G32_SINT = GL_RG32I,
+ FORMAT_R32G32_UINT = GL_RG32UI,
+ FORMAT_R32G32B32_SINT = GL_RGB32I,
+ FORMAT_R32G32B32_UINT = GL_RGB32UI,
+ FORMAT_R32G32B32A32_SINT = GL_RGBA32I,
+ FORMAT_R32G32B32A32_UINT = GL_RGBA32UI,
+ FORMAT_R32_SFLOAT = GL_R32F,
+ FORMAT_R32G32_SFLOAT = GL_RG32F,
+ FORMAT_R32G32B32_SFLOAT = GL_RGB32F,
+ FORMAT_R32G32B32A32_SFLOAT = GL_RGBA32F,
+ FORMAT_R64_SFLOAT = 0x6000,
+ FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT,
+ FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL = 0x6100,
+ FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL,
+ FORMAT_R32G32B32A32_BOOL,
+} Format;
+
+typedef enum DescriptorType
+{
+ DESCRIPTOR_TYPE_UNIFORM_BUFFER = GL_UNIFORM_BUFFER,
+ DESCRIPTOR_TYPE_STORAGE_BUFFER = GL_SHADER_STORAGE_BUFFER,
+ DESCRIPTOR_TYPE_STORAGE_IMAGE = GL_TEXTURE_2D,
+} DescriptorType;
+
// A struct to represent input data to a shader
struct SSBOData
{
SSBOData() :
initializeType (InitializeNone),
- format (vk::VK_FORMAT_UNDEFINED),
+ format (FORMAT_UNDEFINED),
numElements (0),
isImage (false),
binding (0u),
- stages ((vk::VkShaderStageFlagBits)0u)
+ stages ((ShaderStageFlags)0u)
{}
enum InputDataInitializeType
InitializeZero,
} initializeType;
- vk::VkFormat format;
- vk::VkDeviceSize numElements;
+ Format format;
+ deUint64 numElements;
bool isImage;
deUint32 binding;
- vk::VkShaderStageFlagBits stages;
+ ShaderStageFlags stages;
};
std::string getSharedMemoryBallotHelper();
deUint32 getSubgroupSize(Context& context);
-vk::VkDeviceSize maxSupportedSubgroupSize();
+deUint32 maxSupportedSubgroupSize();
-std::string getShaderStageName(vk::VkShaderStageFlags stage);
+std::string getShaderStageName(ShaderStageFlags stage);
-std::string getSubgroupFeatureName(vk::VkSubgroupFeatureFlagBits bit);
+std::string getSubgroupFeatureName(SubgroupFeatureFlags bit);
-void addNoSubgroupShader (vk::SourceCollections& programCollection);
+void addNoSubgroupShader (SourceCollections& programCollection);
-std::string getVertShaderForStage(vk::VkShaderStageFlags stage);//TODO
+std::string getVertShaderForStage(ShaderStageFlags stage);
bool isSubgroupSupported(Context& context);
bool areSubgroupOperationsSupportedForStage(
- Context& context, vk::VkShaderStageFlags stage);
+ Context& context, ShaderStageFlags stage);
-bool areSubgroupOperationsRequiredForStage(vk::VkShaderStageFlags stage);
+bool areSubgroupOperationsRequiredForStage(ShaderStageFlags stage);
-bool isSubgroupFeatureSupportedForDevice(Context& context, vk::VkSubgroupFeatureFlagBits bit);
+bool isSubgroupFeatureSupportedForDevice(Context& context, SubgroupFeatureFlags bit);
bool isFragmentSSBOSupportedForDevice(Context& context);
bool isDoubleSupportedForDevice(Context& context);
-bool isDoubleFormat(vk::VkFormat format);
+bool isDoubleFormat(Format format);
-std::string getFormatNameForGLSL(vk::VkFormat format);
+std::string getFormatNameForGLSL(Format format);
-void addGeometryShadersFromTemplate (const std::string& glslTemplate, const vk::ShaderBuildOptions& options, vk::GlslSourceCollection& collection);
-void addGeometryShadersFromTemplate (const std::string& spirvTemplate, const vk::SpirVAsmBuildOptions& options, vk::SpirVAsmCollection& collection);
+void addGeometryShadersFromTemplate (const std::string& glslTemplate, SourceCollections& collection);
-void setVertexShaderFrameBuffer (vk::SourceCollections& programCollection);
+void setVertexShaderFrameBuffer (SourceCollections& programCollection);
-void setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection);
+void setFragmentShaderFrameBuffer (SourceCollections& programCollection);
-void setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection);
+void setFragmentShaderFrameBuffer (SourceCollections& programCollection);
-void setTesCtrlShaderFrameBuffer (vk::SourceCollections& programCollection);
+void setTesCtrlShaderFrameBuffer (SourceCollections& programCollection);
-void setTesEvalShaderFrameBuffer (vk::SourceCollections& programCollection);
+void setTesEvalShaderFrameBuffer (SourceCollections& programCollection);
bool check(std::vector<const void*> datas,
deUint32 width, deUint32 ref);
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32 ref);
-tcu::TestStatus makeTessellationEvaluationFrameBufferTest(Context& context, vk::VkFormat format,
+tcu::TestStatus makeTessellationEvaluationFrameBufferTest(Context& context, Format format,
SSBOData* extraData, deUint32 extraDataCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
- const vk::VkShaderStageFlags shaderStage = vk::VK_SHADER_STAGE_ALL_GRAPHICS);
+ const ShaderStageFlags shaderStage = SHADER_STAGE_ALL_GRAPHICS);
-tcu::TestStatus makeGeometryFrameBufferTest(Context& context, vk::VkFormat format, SSBOData* extraData,
+tcu::TestStatus makeGeometryFrameBufferTest(Context& context, Format format, SSBOData* extraData,
deUint32 extraDataCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
-tcu::TestStatus allStages(Context& context, vk::VkFormat format,
+tcu::TestStatus allStages(Context& context, Format format,
SSBOData* extraData, deUint32 extraDataCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
- const vk::VkShaderStageFlags shaderStage);
+ const ShaderStageFlags shaderStage);
-tcu::TestStatus makeVertexFrameBufferTest(Context& context, vk::VkFormat format,
+tcu::TestStatus makeVertexFrameBufferTest(Context& context, Format format,
SSBOData* extraData, deUint32 extraDataCount,
bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
-tcu::TestStatus makeFragmentFrameBufferTest(Context& context, vk::VkFormat format,
+tcu::TestStatus makeFragmentFrameBufferTest(Context& context, Format 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,
+ Context& context, Format format, SSBOData* inputs,
deUint32 inputsCount,
bool (*checkResult)(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32 subgroupSize));
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSTESTSUTILS_HPP
+#endif // _GLCSUBGROUPSTESTSUTILS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* \brief Subgroups Tests
*/ /*--------------------------------------------------------------------*/
-#include "vktSubgroupsVoteTests.hpp"
-#include "vktSubgroupsTestsUtils.hpp"
+#include "glcSubgroupsVoteTests.hpp"
+#include "glcSubgroupsTestsUtils.hpp"
#include <string>
#include <vector>
+#include "tcuStringTemplate.hpp"
using namespace tcu;
using namespace std;
-using namespace vk;
-using namespace vkt;
+
+namespace glc
+{
+namespace subgroups
+{
namespace
{
+
enum OpType
{
OPTYPE_ALL = 0,
static bool checkVertexPipelineStages(std::vector<const void*> datas,
deUint32 width, deUint32)
{
- return vkt::subgroups::check(datas, width, 0x1F);
+ return glc::subgroups::check(datas, width, 0x1F);
}
static bool checkFragmentPipelineStages(std::vector<const void*> datas,
return true;
}
-static bool checkCompute(std::vector<const void*> datas,
+static bool checkComputeStage(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
{
- return vkt::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x1F);
+ return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 0x1F);
}
std::string getOpTypeName(int opType)
struct CaseDefinition
{
int opType;
- VkShaderStageFlags shaderStage;
- VkFormat format;
+ ShaderStageFlags shaderStage;
+ Format format;
};
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
- const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
const bool formatIsBoolean =
- VK_FORMAT_R8_USCALED == caseDef.format || VK_FORMAT_R8G8_USCALED == caseDef.format || VK_FORMAT_R8G8B8_USCALED == caseDef.format || VK_FORMAT_R8G8B8A8_USCALED == caseDef.format;
+ FORMAT_R32_BOOL == caseDef.format || FORMAT_R32G32_BOOL == caseDef.format || FORMAT_R32G32B32_BOOL == caseDef.format || FORMAT_R32G32B32A32_BOOL == caseDef.format;
- if (VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
+ if (SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
{
const string vertex = "#version 450\n"
"void main (void)\n"
"{\n"
- " vec2 uv = vec2(float(gl_VertexIndex & 1), float((gl_VertexIndex >> 1) & 1));\n"
+ " vec2 uv = vec2(float(gl_VertexID & 1), float((gl_VertexID >> 1) & 1));\n"
" gl_Position = vec4(uv * 4.0f -2.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert") << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
- else if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ else if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
const string source =
" if (subgroupElect()) result |= 0x2 | 0x10;\n"
: "";
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_vote: enable\n"
- << "layout(location = 0) out vec4 out_color;\n"
+ << "layout(location = 0) out float out_color;\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
- << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "layout(binding = 0) uniform Buffer1\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
<< "};\n"
<< "{\n"
<< " uint result;\n"
<< source
- << " out_color.r = float(result);\n"
+ << " out_color = float(result);\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertexSrc.str());
}
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
std::ostringstream geometry;
<< " EndPrimitive();\n"
<< "}\n";
- programCollection.glslSources.add("geometry")
- << glu::GeometrySource(geometry.str()) << buildOptions;
+ programCollection.add("geometry") << glu::GeometrySource(geometry.str());
}
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
{
std::ostringstream controlSource;
controlSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(controlSource.str()) << buildOptions;
+ programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str());
subgroups::setTesEvalShaderFrameBuffer(programCollection);
}
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
{
std::ostringstream evaluationSource;
evaluationSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "}\n";
subgroups::setTesCtrlShaderFrameBuffer(programCollection);
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+ programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
}
- else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ else if (SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
{
const string sourceFragment =
(OPTYPE_ALL == caseDef.opType) ?
<< " out_color = result;\n"
<< "}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragmentSource.str())<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragmentSource.str());
}
else
{
void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
{
const bool formatIsBoolean =
- VK_FORMAT_R8_USCALED == caseDef.format || VK_FORMAT_R8G8_USCALED == caseDef.format || VK_FORMAT_R8G8B8_USCALED == caseDef.format || VK_FORMAT_R8G8B8A8_USCALED == caseDef.format;
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ FORMAT_R32_BOOL == caseDef.format || FORMAT_R32G32_BOOL == caseDef.format || FORMAT_R32G32B32_BOOL == caseDef.format || FORMAT_R32G32B32A32_BOOL == caseDef.format;
+ if (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"
+ << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n"
+ << "layout(binding = 0, std430) buffer Buffer1\n"
<< "{\n"
<< " uint result[];\n"
<< "};\n"
- << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+ << "layout(binding = 1, std430) buffer Buffer2\n"
<< "{\n"
<< " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
<< "};\n"
src << "}\n";
- programCollection.glslSources.add("comp")
- << glu::ComputeSource(src.str()) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("comp") << glu::ComputeSource(src.str());
}
else
{
const string source =
(OPTYPE_ALL == caseDef.opType) ?
- " result[offset] = " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] = " + getOpTypeName(caseDef.opType) +
"(true) ? 0x1 : 0;\n"
- " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
"(false) ? 0 : 0x1A;\n"
- " result[offset] |= 0x4;\n"
+ " b${SSBO1}.result[offset] |= 0x4;\n"
: (OPTYPE_ANY == caseDef.opType) ?
- " result[offset] = " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] = " + getOpTypeName(caseDef.opType) +
"(true) ? 0x1 : 0;\n"
- " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
"(false) ? 0 : 0x1A;\n"
- " result[offset] |= 0x4;\n"
+ " b${SSBO1}.result[offset] |= 0x4;\n"
: (OPTYPE_ALLEQUAL == caseDef.opType) ?
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
" " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + (formatIsBoolean ? "(subgroupElect());\n" : "(12.0 * float(data[gl_SubgroupInvocationID]) + gl_SubgroupInvocationID);\n") +
- " result[offset] = " + getOpTypeName(caseDef.opType) + "("
+ " b${SSBO1}.result[offset] = " + getOpTypeName(caseDef.opType) + "("
+ subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
- " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
"(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
"(data[0]) ? 0x4 : 0;\n"
- " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
"(valueEqual) ? 0x8 : 0x0;\n"
- " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ " b${SSBO1}.result[offset] |= " + getOpTypeName(caseDef.opType) +
"(valueNoEqual) ? 0x0 : 0x10;\n"
- " if (subgroupElect()) result[offset] |= 0x2 | 0x10;\n"
+ " if (subgroupElect()) b${SSBO1}.result[offset] |= 0x2 | 0x10;\n"
: "";
+ tcu::StringTemplate sourceTemplate(source);
+
const string formatString = subgroups::getFormatNameForGLSL(caseDef.format);
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "0"));
+
const string vertex =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_vote: enable\n"
- "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+ "layout(binding = 0, std430) buffer Buffer0\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b0;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + formatString + " data[];\n"
"};\n"
"\n"
"void main (void)\n"
"{\n"
- " highp uint offset = gl_VertexIndex;\n"
- + source +
+ " highp uint offset = gl_VertexID;\n"
+ + sourceTemplate.specialize(bufferNameMapping) +
" float pixelSize = 2.0f/1024.0f;\n"
" float pixelPosition = pixelSize/2.0f - 1.0f;\n"
- " gl_Position = vec4(float(gl_VertexIndex) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
+ " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n"
" gl_PointSize = 1.0f;\n"
"}\n";
- programCollection.glslSources.add("vert")
- << glu::VertexSource(vertex) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("vert") << glu::VertexSource(vertex);
}
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "1"));
+
const string tesc =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_vote: enable\n"
"layout(vertices=1) out;\n"
- "layout(set = 0, binding = 1, std430) buffer Buffer1\n"
+ "layout(binding = 1, std430) buffer Buffer1\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b1;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + formatString + " data[];\n"
"};\n"
"void main (void)\n"
"{\n"
" highp uint offset = gl_PrimitiveID;\n"
- + source +
+ + sourceTemplate.specialize(bufferNameMapping) +
" if (gl_InvocationID == 0)\n"
" {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- programCollection.glslSources.add("tesc")
- << glu::TessellationControlSource(tesc) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tesc") << glu::TessellationControlSource(tesc);
}
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "2"));
+
const string tese =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_vote: enable\n"
"layout(isolines) in;\n"
- "layout(set = 0, binding = 2, std430) buffer Buffer1\n"
+ "layout(binding = 2, std430) buffer Buffer2\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b2;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + formatString + " data[];\n"
"};\n"
"void main (void)\n"
"{\n"
" highp uint offset = gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5);\n"
- + source +
+ + sourceTemplate.specialize(bufferNameMapping) +
" float pixelSize = 2.0f/1024.0f;\n"
" gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n"
"}\n";
- programCollection.glslSources.add("tese")
- << glu::TessellationEvaluationSource(tese) << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("tese") << glu::TessellationEvaluationSource(tese);
}
{
+ map<string, string> bufferNameMapping;
+ bufferNameMapping.insert(pair<string, string>("SSBO1", "3"));
+
const string geometry =
"#version 450\n"
"#extension GL_KHR_shader_subgroup_vote: enable\n"
"layout(${TOPOLOGY}) in;\n"
"layout(points, max_vertices = 1) out;\n"
- "layout(set = 0, binding = 3, std430) buffer Buffer1\n"
+ "layout(binding = 3, std430) buffer Buffer3\n"
"{\n"
" uint result[];\n"
- "};\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "} b3;\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + formatString + " data[];\n"
"};\n"
"void main (void)\n"
"{\n"
" highp uint offset = gl_PrimitiveIDIn;\n"
- + source +
+ + sourceTemplate.specialize(bufferNameMapping) +
" gl_Position = gl_in[0].gl_Position;\n"
" EmitVertex();\n"
" EndPrimitive();\n"
"}\n";
- subgroups::addGeometryShadersFromTemplate(geometry, vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u),
- programCollection.glslSources);
+ subgroups::addGeometryShadersFromTemplate(geometry, programCollection);
}
{
"#version 450\n"
"#extension GL_KHR_shader_subgroup_vote: enable\n"
"layout(location = 0) out uint result;\n"
- "layout(set = 0, binding = 4, std430) readonly buffer Buffer2\n"
+ "layout(binding = 4, std430) readonly buffer Buffer4\n"
"{\n"
" " + formatString + " data[];\n"
"};\n"
+ sourceFragment +
"}\n";
- programCollection.glslSources.add("fragment")
- << glu::FragmentSource(fragment)<< vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
+ programCollection.add("fragment") << glu::FragmentSource(fragment);
}
subgroups::addNoSubgroupShader(programCollection);
if (!subgroups::isSubgroupSupported(context))
TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
- if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_VOTE_BIT))
+ if (!subgroups::isSubgroupFeatureSupportedForDevice(context, subgroups::SUBGROUP_FEATURE_VOTE_BIT))
{
TCU_THROW(NotSupportedError, "Device does not support subgroup vote operations");
}
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
- if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
- return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
- return subgroups::makeGeometryFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
- else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
- else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
- else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
- return subgroups::makeFragmentFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkFragmentPipelineStages);
+ if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+ return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
+ return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+ else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT);
+ else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage)
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT);
+ else if (SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ return subgroups::makeFragmentFrameBufferTest(context, FORMAT_R32_UINT, &inputData, 1, checkFragmentPipelineStages);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
{
- if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+ if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
{
if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage))
{
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
+ inputData.binding = 1u;
- return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData,
- 1, checkCompute);
+ return subgroups::makeComputeTest(context, FORMAT_R32_UINT, &inputData,
+ 1, checkComputeStage);
}
else
{
- VkPhysicalDeviceSubgroupProperties subgroupProperties;
- subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
- subgroupProperties.pNext = DE_NULL;
-
- VkPhysicalDeviceProperties2 properties;
- properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
- properties.pNext = &subgroupProperties;
+ int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR);
- context.getInstanceInterface().getPhysicalDeviceProperties2(context.getPhysicalDevice(), &properties);
+ ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages);
- VkShaderStageFlagBits stages = (VkShaderStageFlagBits)(caseDef.shaderStage & subgroupProperties.supportedStages);
-
- if (VK_SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
+ if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context))
{
- if ( (stages & VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
+ if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0)
TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
else
- stages = VK_SHADER_STAGE_FRAGMENT_BIT;
+ stages = SHADER_STAGE_FRAGMENT_BIT;
}
- if ((VkShaderStageFlagBits)0u == stages)
+ if ((ShaderStageFlags)0u == stages)
TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader");
subgroups::SSBOData inputData;
inputData.binding = 4u;
inputData.stages = stages;
- return subgroups::allStages(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
+ return subgroups::allStages(context, FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, stages);
}
}
-}
-namespace vkt
-{
-namespace subgroups
-{
-tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
+} // namespace
+
+deqp::TestCaseGroup* createSubgroupsVoteTests(deqp::Context& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup(
testCtx, "graphics", "Subgroup arithmetic category tests: graphics"));
- de::MovePtr<tcu::TestCaseGroup> computeGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup(
testCtx, "compute", "Subgroup arithmetic category tests: compute"));
- de::MovePtr<tcu::TestCaseGroup> framebufferGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup(
testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer"));
- de::MovePtr<tcu::TestCaseGroup> fragHelperGroup(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> fragHelperGroup(new deqp::TestCaseGroup(
testCtx, "frag_helper", "Subgroup arithmetic category tests: fragment helper invocation"));
- const VkShaderStageFlags stages[] =
+ const ShaderStageFlags stages[] =
{
- VK_SHADER_STAGE_VERTEX_BIT,
- VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
- VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
- VK_SHADER_STAGE_GEOMETRY_BIT,
+ SHADER_STAGE_VERTEX_BIT,
+ SHADER_STAGE_TESS_EVALUATION_BIT,
+ SHADER_STAGE_TESS_CONTROL_BIT,
+ SHADER_STAGE_GEOMETRY_BIT,
};
- const VkFormat formats[] =
+ const Format 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,
+ FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT,
+ FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT,
+ FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT,
+ FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT,
+ FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT,
+ FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT,
+ FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT,
+ FORMAT_R32_BOOL, FORMAT_R32G32_BOOL,
+ FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL,
};
for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex)
{
- const VkFormat format = formats[formatIndex];
+ const Format 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))
+ if ((FORMAT_R32_UINT != format) && (OPTYPE_ALLEQUAL != opTypeIndex))
{
continue;
}
const std::string op = de::toLower(getOpTypeName(opTypeIndex));
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format};
- addFunctionCaseWithPrograms(computeGroup.get(),
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(),
op + "_" + subgroups::getFormatNameForGLSL(format),
"", supportedCheck, initPrograms, test, caseDef);
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format};
- addFunctionCaseWithPrograms(graphicGroup.get(),
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_ALL_GRAPHICS, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(),
op + "_" + subgroups::getFormatNameForGLSL(format),
"", supportedCheck, initPrograms, test, caseDef);
}
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format};
- addFunctionCaseWithPrograms(framebufferGroup.get(),
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(),
op + "_" +
subgroups::getFormatNameForGLSL(format)
+ "_" + getShaderStageName(caseDef.shaderStage), "",
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_FRAGMENT_BIT, format};
- addFunctionCaseWithPrograms(fragHelperGroup.get(),
+ const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_FRAGMENT_BIT, format};
+ SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(fragHelperGroup.get(),
op + "_" +
subgroups::getFormatNameForGLSL(format)
+ "_" + getShaderStageName(caseDef.shaderStage), "",
}
}
- de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(
+ de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup(
testCtx, "vote", "Subgroup vote category tests"));
group->addChild(graphicGroup.release());
}
} // subgroups
-} // vkt
+} // glc
-#ifndef _VKTSUBGROUPSVOTETESTS_HPP
-#define _VKTSUBGROUPSVOTETESTS_HPP
+#ifndef _GLCSUBGROUPSVOTETESTS_HPP
+#define _GLCSUBGROUPSVOTETESTS_HPP
/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
+ * OpenGL Conformance Tests
* ------------------------
*
- * Copyright (c) 2017 The Khronos Group Inc.
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
* Copyright (c) 2017 Codeplay Software Ltd.
+ * Copyright (c) 2019 NVIDIA Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/ /*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "vktTestCase.hpp"
+#include "glcTestCase.hpp"
-namespace vkt
+namespace glc
{
namespace subgroups
{
-tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx);
+deqp::TestCaseGroup* createSubgroupsVoteTests(deqp::Context& testCtx);
} // subgroups
-} // vkt
+} // glc
-#endif // _VKTSUBGROUPSVOTETESTS_HPP
+#endif // _GLCSUBGROUPSVOTETESTS_HPP
#include "glcTextureFilterAnisotropicTests.hpp"
#include "glcViewportArrayTests.hpp"
+#include "../common/subgroups/glcSubgroupsTests.hpp"
+
#include "../gles31/es31cArrayOfArraysTests.hpp"
#include "../gles31/es31cDrawIndirectTests.hpp"
#include "../gles31/es31cExplicitUniformLocationTest.hpp"
addChild(new glcts::LayoutLocationTests(getContext()));
addChild(new gl4cts::SpirvExtensionsTests(getContext()));
addChild(new gl4cts::GlSpirvTests(getContext()));
+ addChild(new glc::subgroups::GlSubgroupTests(getContext()));
}
catch (...)
{