porting changes for OpenGL Subgroup tests
authorDaniel Koch <dkoch@nvidia.com>
Thu, 28 Mar 2019 14:59:01 +0000 (10:59 -0400)
committerDaniel Koch <dkoch@nvidia.com>
Fri, 29 Mar 2019 11:40:49 +0000 (07:40 -0400)
Component: OpenGL
VK-CL-CTS Issue: 1698

Affects:
 - KHR-GL*.gl_spirv.* (touches common infra code)
 - KHR-GL46.subgroup.* (added)
 - KHR-GL45.subgroup.* (added)

Includes both GLSL 450 and SPIRV support

- Also do some refactoring that hadn't been applied to the partioned tests from the VK side

Change-Id: I2f3bb0ca9773b578234c79f2858bb5406ef2dd39

36 files changed:
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt
external/openglcts/modules/common/glcSpirvUtils.cpp
external/openglcts/modules/common/glcSpirvUtils.hpp
external/openglcts/modules/common/subgroups/CMakeLists.txt [changed mode: 0755->0644]
external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp [changed mode: 0644->0755]
external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp
external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp
external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp
external/openglcts/modules/gl/gl4cTestPackages.cpp

index 422df8e..023072b 100644 (file)
@@ -7779,3 +7779,6056 @@ KHR-GL45.gl_spirv.spirv_glsl_to_spirv_builtin_functions_test
 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
index dee30c3..c1ce15e 100644 (file)
@@ -7779,3 +7779,6056 @@ KHR-GL46.gl_spirv.spirv_glsl_to_spirv_builtin_functions_test
 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
index b5aded3..f3b451d 100644 (file)
@@ -56,7 +56,7 @@ void checkGlSpirvSupported(deqp::Context& m_context)
        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
@@ -197,7 +197,25 @@ void getDefaultBuiltInResources(TBuiltInResource* builtin)
        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;
 
@@ -212,6 +230,7 @@ bool compileGlslToSpirV(tcu::TestLog& log, std::string source, glu::ShaderType t
        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);
@@ -335,11 +354,11 @@ bool spirvValidate(ShaderBinaryDataType& dst, bool throwOnError)
 
 #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";
index 2ed596a..e5d441b 100644 (file)
@@ -35,9 +35,19 @@ typedef std::map<std::string, std::vector<std::string> > SpirVMapping;
 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);
old mode 100755 (executable)
new mode 100644 (file)
index 6a2663a..dbfa94a
@@ -1,42 +1,41 @@
 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)
index 6f2f6ba..baa09f2 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -64,14 +67,14 @@ 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)
@@ -126,7 +129,7 @@ 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)
        {
@@ -148,15 +151,15 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -166,15 +169,15 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -184,13 +187,13 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -200,13 +203,13 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -216,19 +219,19 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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;
@@ -239,32 +242,32 @@ std::string getIdentity(int opType, vk::VkFormat format)
                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
        }
 
@@ -336,19 +339,19 @@ std::string getIdentity(int opType, vk::VkFormat format)
        }
 }
 
-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:
@@ -361,12 +364,12 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
                                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:
@@ -385,19 +388,18 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
 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)
@@ -457,7 +459,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                << "    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"
@@ -465,7 +467,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -478,10 +480,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -491,7 +492,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "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"
@@ -506,10 +507,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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"
@@ -517,7 +517,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -536,11 +536,10 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\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;
@@ -549,7 +548,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -563,7 +562,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -630,20 +629,19 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                "    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"
@@ -659,8 +657,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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
        {
@@ -669,11 +666,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -682,14 +679,13 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -698,11 +694,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -711,7 +707,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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"
@@ -719,8 +715,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  }\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);
                }
 
                {
@@ -729,11 +724,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -742,12 +737,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -757,11 +751,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -770,13 +764,12 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -785,7 +778,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -795,8 +788,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
        }
@@ -807,7 +799,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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");
        }
@@ -842,15 +834,16 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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");
 }
@@ -875,7 +868,7 @@ bool checkShaderStages (Context& context, const CaseDefinition& caseDef)
 
 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))
                {
@@ -888,32 +881,25 @@ tcu::TestStatus test(Context& context, const CaseDefinition 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;
@@ -923,49 +909,45 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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)
                {
@@ -976,20 +958,20 @@ tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
                        {
                                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;
                        }
@@ -1027,16 +1009,16 @@ tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
                        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);
@@ -1045,14 +1027,14 @@ tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
                        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());
@@ -1063,4 +1045,4 @@ tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index 6ae287e..fbd02f4 100644 (file)
@@ -1,11 +1,12 @@
-#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
index b6503a8..456d015 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -45,14 +48,14 @@ 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)
@@ -72,8 +75,8 @@ std::string getOpTypeName(int opType)
 struct CaseDefinition
 {
        int                                     opType;
-       VkShaderStageFlags      shaderStage;
-       VkFormat                        format;
+       ShaderStageFlags        shaderStage;
+       Format                          format;
 };
 
 std::string getBodySource(CaseDefinition caseDef)
@@ -138,23 +141,21 @@ 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"
@@ -166,10 +167,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "  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;
 
@@ -178,7 +178,7 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "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"
@@ -192,10 +192,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "  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;
 
@@ -203,7 +202,7 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "#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"
@@ -220,18 +219,17 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "  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"
@@ -244,8 +242,7 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese")
-                       << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -257,19 +254,18 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        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"
@@ -284,19 +280,18 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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"
@@ -304,10 +299,10 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "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";
 
@@ -315,11 +310,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -327,7 +322,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "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"
@@ -340,11 +335,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -352,7 +347,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "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";
@@ -362,11 +357,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -374,7 +369,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "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"
@@ -384,7 +379,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -396,16 +391,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 
                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);
        }
 }
 
@@ -414,7 +404,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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");
        }
@@ -449,14 +439,14 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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");
 }
@@ -464,7 +454,7 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
 
 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))
                {
@@ -484,32 +474,25 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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;
@@ -519,48 +502,44 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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)
                {
@@ -568,25 +547,25 @@ tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCt
                        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());
@@ -596,4 +575,4 @@ tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCt
 }
 
 } // subgroups
-} // vkt
+} // glc
index a2352f9..d1deb95 100644 (file)
@@ -1,11 +1,12 @@
-#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
index c16cbe0..d354fdb 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -50,14 +53,14 @@ 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)
@@ -87,7 +90,7 @@ std::string getOpTypeName(int opType)
 struct CaseDefinition
 {
        int                                     opType;
-       VkShaderStageFlags      shaderStage;
+       ShaderStageFlags        shaderStage;
 };
 
 std::string getBodySource(CaseDefinition caseDef)
@@ -236,16 +239,14 @@ 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"
@@ -260,10 +261,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "  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;
 
@@ -281,10 +281,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "  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;
 
@@ -305,11 +304,10 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "  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"
@@ -324,8 +322,7 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese")
-                       << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -337,15 +334,14 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        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"
@@ -360,26 +356,25 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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";
 
@@ -387,15 +382,15 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -408,15 +403,15 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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";
@@ -426,15 +421,15 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -452,16 +447,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 
                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);
        }
 }
 
@@ -471,7 +461,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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");
        }
@@ -495,19 +485,19 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
                }
        }
 
-       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))
                {
@@ -516,81 +506,69 @@ tcu::TestStatus test (Context& context, const CaseDefinition caseDef)
                                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());
@@ -601,4 +579,4 @@ tcu::TestCaseGroup* createSubgroupsBallotOtherTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index 628e82b..e40de7b 100644 (file)
@@ -1,11 +1,12 @@
-#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
index bf46772..ac52444 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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"
@@ -86,132 +89,19 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "  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"
@@ -226,148 +116,24 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "  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"
@@ -379,170 +145,20 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "  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"
@@ -555,142 +171,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "  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
        {
@@ -701,19 +184,18 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
 
 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"
@@ -733,19 +215,18 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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"
@@ -757,10 +238,10 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "  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";
 
@@ -768,11 +249,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -784,7 +265,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "  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"
@@ -797,11 +278,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -813,7 +294,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "  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";
@@ -823,11 +304,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -839,7 +320,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "  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"
@@ -849,7 +330,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -865,16 +346,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 
                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);
        }
 }
 
@@ -884,7 +360,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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");
        }
@@ -909,25 +385,26 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        }
 
        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))
                {
@@ -937,88 +414,79 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                                                   " 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());
@@ -1029,4 +497,4 @@ tcu::TestCaseGroup* createSubgroupsBallotTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index 9fa927d..957de65 100644 (file)
@@ -1,11 +1,12 @@
-#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
index d39a19e..db64e48 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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)
@@ -184,7 +190,7 @@ static bool checkComputeSubgroupElect(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);
 }
 
 static bool checkComputeSubgroupBarriers(std::vector<const void*> datas,
@@ -193,7 +199,7 @@ 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
@@ -231,133 +237,39 @@ std::string getOpTypeName(int 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)
@@ -367,9 +279,10 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                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"
@@ -378,91 +291,23 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                "{\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"
@@ -472,195 +317,42 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                "{\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"
@@ -670,113 +362,23 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                "{\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"
@@ -784,132 +386,27 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                "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"
@@ -921,81 +418,8 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                "  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
                {
@@ -1005,7 +429,7 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
        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:
@@ -1015,13 +439,13 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        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"
@@ -1029,11 +453,11 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                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"
@@ -1044,7 +468,7 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                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"
@@ -1052,16 +476,16 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "#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"
@@ -1080,10 +504,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "  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"
@@ -1093,22 +516,22 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "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"
@@ -1121,10 +544,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "  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;
 
@@ -1134,16 +556,16 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                        << "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"
@@ -1164,10 +586,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                        << "  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;
@@ -1191,16 +612,16 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "#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"
@@ -1219,12 +640,10 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "  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;
@@ -1235,16 +654,16 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "#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"
@@ -1281,10 +700,8 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                                << "  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
                {
@@ -1297,15 +714,14 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        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"
@@ -1326,8 +742,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                << "  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
                {
@@ -1335,33 +750,32 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                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());
                        }
 
                        {
@@ -1369,25 +783,25 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                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"
@@ -1396,8 +810,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                                << "  }\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());
                        }
 
                        {
@@ -1405,65 +818,62 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                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);
                        }
 
                        {
@@ -1471,25 +881,24 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                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);
                }
@@ -1508,15 +917,15 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        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";
@@ -1524,34 +933,39 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        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"
@@ -1565,93 +979,101 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "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"
@@ -1659,130 +1081,140 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                        "  }\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);
@@ -1816,17 +1248,17 @@ tcu::TestStatus noSSBOtest (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!");
                }
@@ -1835,68 +1267,71 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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))
                {
@@ -1907,26 +1342,29 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
 
                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
@@ -1936,27 +1374,19 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        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)
@@ -1964,47 +1394,47 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        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;
@@ -2013,59 +1443,56 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        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)
@@ -2073,8 +1500,8 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
                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);
                }
 
@@ -2085,8 +1512,8 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
                }
 
                {
-                       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);
                }
@@ -2096,7 +1523,7 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
                        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);
                        }
@@ -2106,7 +1533,7 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
                        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);
                        }
@@ -2114,7 +1541,7 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
 
        }
 
-       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());
@@ -2125,4 +1552,4 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index 5e3639a..1aac442 100644 (file)
@@ -1,11 +1,12 @@
-#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
index 9db45d0..901d770 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
 {
@@ -55,90 +55,10 @@ namespace
 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;
@@ -217,20 +137,15 @@ std::string subgroupMask (const CaseDefinition& caseDef)
 
 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"
@@ -243,215 +158,12 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "  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"
@@ -464,235 +176,13 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "  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"
@@ -709,478 +199,28 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "  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
        {
@@ -1193,15 +233,14 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        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"
@@ -1216,8 +255,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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
        {
@@ -1225,22 +263,21 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        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);
                }
 
                {
@@ -1248,15 +285,15 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -1264,8 +301,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  }\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);
                }
 
                {
@@ -1273,21 +309,20 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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);
                }
 
                {
@@ -1296,22 +331,21 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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);
                }
 
                {
@@ -1325,8 +359,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  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);
@@ -1357,28 +390,28 @@ tcu::TestStatus noSSBOtest(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_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))
                {
@@ -1386,44 +419,36 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                                                   "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[] =
@@ -1435,12 +460,12 @@ de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
                "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,
        };
 
 
@@ -1450,15 +475,15 @@ de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
                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);
                }
@@ -1466,14 +491,14 @@ de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
                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());
@@ -1483,4 +508,4 @@ de::MovePtr<tcu::TestCaseGroup> graphicGroup(new tcu::TestCaseGroup(
        return group.release();
 }
 } // subgroups
-} // vkt
+} // glc
index 98585ba..cc14961 100644 (file)
@@ -1,11 +1,12 @@
-#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
index b825a74..9d77480 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
 {
@@ -315,63 +315,31 @@ namespace
 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"
@@ -382,175 +350,29 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        "  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"
@@ -562,99 +384,12 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        "  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"
@@ -662,116 +397,17 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        "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"
@@ -783,84 +419,11 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        "  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"
@@ -873,79 +436,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        "  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
        {
@@ -955,15 +446,14 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
 
 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"
@@ -977,133 +467,43 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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"
@@ -1111,350 +511,51 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  }\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"
@@ -1462,48 +563,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
@@ -1534,17 +594,17 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
                }
        }
 
-       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
                {
@@ -1553,17 +613,17 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
                                           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
                {
@@ -1572,17 +632,17 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
                                        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
                {
@@ -1600,7 +660,7 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
 
 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))
                {
@@ -1611,19 +671,19 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
 
                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
                {
@@ -1634,36 +694,28 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
        }
        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
                {
@@ -1674,13 +726,13 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
        }
 }
 
-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[] =
@@ -1695,12 +747,12 @@ tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
                "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)
@@ -1709,16 +761,16 @@ tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
                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);
                }
@@ -1726,7 +778,7 @@ tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
                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);
                }
@@ -1736,13 +788,13 @@ tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
        {
                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());
@@ -1753,4 +805,4 @@ tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index f7a1dc8..e578104 100644 (file)
@@ -1,11 +1,12 @@
-#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
index 718be21..5c3ac2f 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -50,14 +53,14 @@ 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)
@@ -84,7 +87,7 @@ 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)
        {
@@ -100,15 +103,15 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -116,15 +119,15 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -132,13 +135,13 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -146,13 +149,13 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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:
@@ -160,19 +163,19 @@ std::string getOpTypeOperation(int opType, vk::VkFormat format, std::string lhs,
                        {
                                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;
@@ -183,32 +186,32 @@ std::string getIdentity(int opType, vk::VkFormat format)
                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
        }
 
@@ -266,19 +269,19 @@ std::string getIdentity(int opType, vk::VkFormat format)
        }
 }
 
-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:
@@ -287,12 +290,12 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
                                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:
@@ -307,8 +310,8 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
 struct CaseDefinition
 {
        int                                     opType;
-       VkShaderStageFlags      shaderStage;
-       VkFormat                        format;
+       ShaderStageFlags        shaderStage;
+       Format                          format;
 };
 
 std::string getBodySource(CaseDefinition caseDef)
@@ -351,16 +354,14 @@ 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"
@@ -368,7 +369,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -381,10 +382,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -394,7 +394,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "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"
@@ -409,10 +409,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -421,7 +420,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -439,11 +438,10 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -452,7 +450,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -466,8 +464,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese")
-                       << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -479,20 +476,19 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        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"
@@ -508,8 +504,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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
        {
@@ -518,11 +513,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -531,14 +526,13 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -547,11 +541,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "#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"
@@ -560,7 +554,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "{\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"
@@ -569,8 +563,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "  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);
                }
 
                {
@@ -579,11 +572,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -592,12 +585,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -607,11 +599,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -620,12 +612,12 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -634,7 +626,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -644,8 +636,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
@@ -657,7 +648,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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) &&
@@ -690,22 +681,23 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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))
                {
@@ -718,32 +710,25 @@ tcu::TestStatus test(Context& context, const CaseDefinition 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;
@@ -753,48 +738,44 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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)
                {
@@ -805,20 +786,20 @@ tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx)
                        {
                                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;
                        }
@@ -852,25 +833,25 @@ tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx)
                                +"_" + 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());
@@ -881,4 +862,4 @@ tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index d1f518c..f9e3e26 100644 (file)
@@ -1,11 +1,12 @@
-#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
index c1a658a..04e92ec 100755 (executable)
@@ -1,10 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -65,72 +67,14 @@ 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)
@@ -237,7 +181,7 @@ std::string getOpTypeNamePartitioned(int opType)
        }
 }
 
-std::string getIdentity(int opType, vk::VkFormat format)
+std::string getIdentity(int opType, Format format)
 {
        bool isFloat = false;
        bool isInt = false;
@@ -248,32 +192,32 @@ std::string getIdentity(int opType, vk::VkFormat format)
                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
        }
 
@@ -345,19 +289,19 @@ std::string getIdentity(int opType, vk::VkFormat format)
        }
 }
 
-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:
@@ -370,12 +314,12 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
                                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:
@@ -394,8 +338,8 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
 struct CaseDefinition
 {
        int                                     opType;
-       VkShaderStageFlags      shaderStage;
-       VkFormat                        format;
+       ShaderStageFlags        shaderStage;
+       Format                          format;
 };
 
 string getTestString(const CaseDefinition &caseDef)
@@ -487,17 +431,16 @@ 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"
@@ -506,7 +449,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -519,10 +462,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -533,7 +475,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "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"
@@ -548,10 +490,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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"
@@ -560,7 +501,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -579,11 +520,10 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\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;
@@ -593,7 +533,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -607,7 +547,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -619,7 +559,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        const string bdy = getTestString(caseDef);
 
-       if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
+       if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
        {
                std::ostringstream src;
 
@@ -627,13 +567,12 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "#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"
@@ -649,8 +588,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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
        {
@@ -660,11 +598,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -673,14 +611,13 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -690,11 +627,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                            "#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"
@@ -703,7 +640,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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"
@@ -711,8 +648,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  }\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);
                }
 
                {
@@ -722,11 +658,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                            "#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"
@@ -735,12 +671,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -751,11 +686,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -764,13 +699,12 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "{\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);
                }
 
                {
@@ -780,7 +714,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                            "#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"
@@ -790,8 +724,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
        }
@@ -802,7 +735,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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");
        }
@@ -837,15 +770,16 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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");
 }
@@ -870,7 +804,7 @@ bool checkShaderStages (Context& context, const CaseDefinition& caseDef)
 
 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))
                {
@@ -883,32 +817,25 @@ tcu::TestStatus test(Context& context, const CaseDefinition 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;
@@ -918,45 +845,46 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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)
                {
@@ -967,20 +895,20 @@ tcu::TestCaseGroup* createSubgroupsPartitionedTests(tcu::TestContext& testCtx)
                        {
                                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;
                        }
@@ -1015,39 +943,40 @@ tcu::TestCaseGroup* createSubgroupsPartitionedTests(tcu::TestContext& testCtx)
                                // 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
 
index c5e5dcf..8102d1d 100755 (executable)
@@ -1,12 +1,12 @@
-#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
index 1abe256..bdf5d6f 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -47,14 +50,14 @@ 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)
@@ -78,19 +81,18 @@ 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] = "";
@@ -98,7 +100,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
        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"
@@ -106,7 +108,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -140,10 +142,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -153,8 +154,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "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"
@@ -190,10 +190,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -202,7 +201,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -241,11 +240,10 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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"
@@ -253,7 +251,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -288,8 +286,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese")
-                               << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -305,20 +302,19 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
        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"
@@ -356,8 +352,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  }\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
        {
@@ -381,11 +376,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -397,18 +392,17 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
                }
 
                {
@@ -417,11 +411,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -433,11 +427,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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"
@@ -446,8 +440,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  }\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);
                }
 
                {
@@ -456,11 +449,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -472,17 +465,16 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
                }
 
                {
@@ -492,11 +484,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -508,18 +500,17 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
                }
 
                {
@@ -528,7 +519,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -546,8 +537,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "    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);
        }
@@ -558,7 +548,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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");
 
 
@@ -591,16 +581,17 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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");
 }
@@ -608,7 +599,7 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
 
 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))
                {
@@ -621,32 +612,25 @@ tcu::TestStatus test(Context& context, const CaseDefinition 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;
@@ -656,50 +640,46 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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)
                        {
@@ -723,24 +703,24 @@ tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx)
                                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);
                                }
 
@@ -748,7 +728,7 @@ tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx)
                }
        }
 
-       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());
@@ -758,4 +738,4 @@ tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx)
        return group.release();
 }
 } // subgroups
-} // vkt
+} // glc
index 6bc23a6..ec0ab6b 100644 (file)
@@ -1,11 +1,12 @@
-#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
index e32862d..b7d4df7 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -72,12 +75,11 @@ std::string getOpTypeName(int 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" :
@@ -85,7 +87,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
 
        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";
@@ -141,7 +143,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  }\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"
@@ -156,10 +158,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -178,10 +179,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -202,11 +202,10 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -222,8 +221,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese")
-                               << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -292,15 +290,14 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  }\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"
@@ -315,8 +312,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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
        {
@@ -324,22 +320,21 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        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);
                }
 
                {
@@ -347,15 +342,15 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -364,8 +359,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  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);
                }
 
                {
@@ -373,21 +367,20 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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);
                }
 
                {
@@ -396,22 +389,21 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
                }
 
                {
@@ -425,8 +417,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  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);
        }
@@ -437,14 +428,14 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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!");
                }
@@ -452,7 +443,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
 
        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!");
                }
@@ -478,14 +469,14 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
                }
        }
 
-       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");
 }
@@ -493,15 +484,15 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
 
 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))
                {
@@ -510,57 +501,45 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                                           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)
@@ -568,8 +547,8 @@ tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx)
                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);
 
                }
 
@@ -577,9 +556,9 @@ tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx)
                        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);
                }
@@ -587,12 +566,12 @@ tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx)
                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());
@@ -603,4 +582,4 @@ tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index 8626a66..4c63484 100644 (file)
@@ -1,11 +1,12 @@
-#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
index 749b9b2..33d6692 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
@@ -47,14 +50,14 @@ 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)
@@ -78,8 +81,8 @@ std::string getOpTypeName(int opType)
 struct CaseDefinition
 {
        int                                     opType;
-       VkShaderStageFlags      shaderStage;
-       VkFormat                        format;
+       ShaderStageFlags        shaderStage;
+       Format                          format;
 };
 
 const std::string to_string(int x) {
@@ -91,11 +94,11 @@ 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";
@@ -130,11 +133,9 @@ const std::string TestSource(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);
 
        const std::string extSource =
@@ -144,19 +145,19 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
 
        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"
@@ -168,10 +169,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -181,11 +181,11 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "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"
@@ -199,10 +199,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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;
 
@@ -211,11 +210,11 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -232,12 +231,11 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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"
@@ -245,11 +243,11 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "#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"
@@ -262,8 +260,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\n";
 
                subgroups::setTesCtrlShaderFrameBuffer(programCollection);
-               programCollection.glslSources.add("tese")
-                               << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
+               programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str());
        }
        else
        {
@@ -284,13 +281,13 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 
        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"
@@ -306,8 +303,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        << "  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
        {
@@ -316,40 +312,39 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                {
                        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"
@@ -358,30 +353,28 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  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);
                }
 
                {
@@ -389,23 +382,22 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                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 =
@@ -418,8 +410,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  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);
@@ -435,13 +426,13 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        {
                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");
                        }
@@ -476,19 +467,21 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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");
 }
@@ -500,13 +493,13 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
        {
                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");
                        }
@@ -518,7 +511,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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))
                {
@@ -531,37 +524,31 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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];
@@ -571,55 +558,51 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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)
                {
@@ -632,27 +615,27 @@ tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx)
                                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());
@@ -663,4 +646,4 @@ tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index 9b8831b..e425182 100644 (file)
@@ -1,11 +1,12 @@
-#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
index 916f903..5818c54 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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
index 37afda0..cc45a51 100644 (file)
@@ -1,11 +1,12 @@
-#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
old mode 100644 (file)
new mode 100755 (executable)
index b113799..88eaee4
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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;
@@ -387,178 +340,195 @@ struct BufferOrImage
                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"
@@ -587,351 +557,141 @@ std::string vkt::subgroups::getSharedMemoryBallotHelper()
                        "}\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"
@@ -940,326 +700,174 @@ std::string vkt::subgroups::getVertShaderForStage(vk::VkShaderStageFlags stage)
        }
 }
 
-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"
@@ -1270,84 +878,10 @@ void vkt::subgroups::setTesEvalShaderFrameBuffer (vk::SourceCollections& program
                "{\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);
 
@@ -1357,79 +891,65 @@ void vkt::subgroups::addGeometryShadersFromTemplate (const std::string& glslTemp
        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();
                                }
@@ -1439,9 +959,9 @@ void initializeMemory(Context& context, const Allocation& alloc, subgroups::SSBO
        }
        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;
                }
@@ -1449,24 +969,25 @@ void initializeMemory(Context& context, const Allocation& alloc, subgroups::SSBO
 
        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:
@@ -1477,121 +998,79 @@ deUint32 getResultBinding (const VkShaderStageFlagBits shaderStage)
        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;
 
@@ -1602,56 +1081,62 @@ tcu::TestStatus vkt::subgroups::makeTessellationEvaluationFrameBufferTest(
                        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++;
                }
@@ -1659,16 +1144,19 @@ tcu::TestStatus vkt::subgroups::makeTessellationEvaluationFrameBufferTest(
 
        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]);
@@ -1684,7 +1172,7 @@ bool vkt::subgroups::check(std::vector<const void*> datas,
        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)
 {
@@ -1695,116 +1183,78 @@ bool vkt::subgroups::checkCompute(std::vector<const void*> datas,
        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;
 
@@ -1814,65 +1264,72 @@ tcu::TestStatus vkt::subgroups::makeGeometryFrameBufferTest(
                        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++;
                }
@@ -1880,100 +1337,110 @@ tcu::TestStatus vkt::subgroups::makeGeometryFrameBufferTest(
 
        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)
@@ -1982,172 +1449,119 @@ tcu::TestStatus vkt::subgroups::allStages(
                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)
@@ -2155,177 +1569,144 @@ tcu::TestStatus vkt::subgroups::allStages(
                                        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;
 
@@ -2335,65 +1716,72 @@ tcu::TestStatus vkt::subgroups::makeVertexFrameBufferTest(Context& context, vk::
                        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++;
                }
@@ -2401,25 +1789,29 @@ tcu::TestStatus vkt::subgroups::makeVertexFrameBufferTest(Context& context, vk::
 
        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);
 
@@ -2429,98 +1821,58 @@ tcu::TestStatus vkt::subgroups::makeFragmentFrameBufferTest     (Context& context, V
                {
                        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)
@@ -2530,101 +1882,87 @@ tcu::TestStatus vkt::subgroups::makeFragmentFrameBufferTest    (Context& context, V
                        // 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);
@@ -2637,101 +1975,58 @@ tcu::TestStatus vkt::subgroups::makeComputeTest(
                {
                        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;
@@ -2754,8 +2049,9 @@ tcu::TestStatus vkt::subgroups::makeComputeTest(
                {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++)
@@ -2767,47 +2063,37 @@ tcu::TestStatus vkt::subgroups::makeComputeTest(
                // 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);
                        }
                }
 
@@ -2816,17 +2102,27 @@ tcu::TestStatus vkt::subgroups::makeComputeTest(
                        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");
index d9edae6..9a8ee30 100644 (file)
@@ -1,11 +1,12 @@
-#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
@@ -72,35 +382,35 @@ struct SSBOData
                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);
 
@@ -108,22 +418,21 @@ bool isVertexSSBOSupportedForDevice(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);
@@ -132,36 +441,36 @@ bool checkCompute(std::vector<const void*> datas,
        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
index f201dd2..dbf8d1d 100755 (executable)
@@ -1,9 +1,10 @@
 /*------------------------------------------------------------------------
- * 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,
@@ -46,7 +52,7 @@ enum OpType
 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,
@@ -76,11 +82,11 @@ 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)
@@ -102,31 +108,30 @@ 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 =
@@ -158,14 +163,14 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                                "  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"
@@ -174,14 +179,14 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "{\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;
 
@@ -205,10 +210,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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"
@@ -233,11 +237,10 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "  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"
@@ -260,10 +263,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "}\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) ?
@@ -319,8 +321,7 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                << "  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
        {
@@ -331,20 +332,19 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
 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"
@@ -393,78 +393,84 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 
                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"
@@ -472,7 +478,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "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"
@@ -481,20 +487,22 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  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"
@@ -502,26 +510,28 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "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"
@@ -529,14 +539,13 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "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);
                }
 
                {
@@ -572,7 +581,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "#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"
@@ -581,8 +590,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                + 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);
@@ -594,7 +602,7 @@ void supportedCheck (Context& context, CaseDefinition caseDef)
        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");
        }
@@ -630,16 +638,16 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        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");
 }
@@ -647,7 +655,7 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
 
 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))
                {
@@ -661,33 +669,26 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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;
@@ -697,56 +698,53 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                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;
                        }
@@ -754,15 +752,15 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
                        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);
                        }
@@ -770,15 +768,15 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
                        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), "",
@@ -786,7 +784,7 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
                }
        }
 
-       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());
@@ -798,4 +796,4 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
 }
 
 } // subgroups
-} // vkt
+} // glc
index 57b795a..ab39d2f 100644 (file)
@@ -1,11 +1,12 @@
-#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
index dfb4cd2..65f5fcb 100644 (file)
@@ -85,6 +85,8 @@
 #include "glcTextureFilterAnisotropicTests.hpp"
 #include "glcViewportArrayTests.hpp"
 
+#include "../common/subgroups/glcSubgroupsTests.hpp"
+
 #include "../gles31/es31cArrayOfArraysTests.hpp"
 #include "../gles31/es31cDrawIndirectTests.hpp"
 #include "../gles31/es31cExplicitUniformLocationTest.hpp"
@@ -390,6 +392,7 @@ void GL45TestPackage::init(void)
                addChild(new glcts::LayoutLocationTests(getContext()));
                addChild(new gl4cts::SpirvExtensionsTests(getContext()));
                addChild(new gl4cts::GlSpirvTests(getContext()));
+               addChild(new glc::subgroups::GlSubgroupTests(getContext()));
        }
        catch (...)
        {