From: Daniel Koch Date: Thu, 28 Mar 2019 14:59:01 +0000 (-0400) Subject: porting changes for OpenGL Subgroup tests X-Git-Tag: upstream/1.3.5~1943^2~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=92cea1adb37de6e1de21e59a2f5bc0f0b35b6ee2;p=platform%2Fupstream%2FVK-GL-CTS.git porting changes for OpenGL Subgroup tests 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 --- diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt index 422df8e..023072b 100644 --- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt +++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt @@ -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 diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt index dee30c3..c1ce15e 100644 --- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt +++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt @@ -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 diff --git a/external/openglcts/modules/common/glcSpirvUtils.cpp b/external/openglcts/modules/common/glcSpirvUtils.cpp index b5aded3..f3b451d 100644 --- a/external/openglcts/modules/common/glcSpirvUtils.cpp +++ b/external/openglcts/modules/common/glcSpirvUtils.cpp @@ -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"; diff --git a/external/openglcts/modules/common/glcSpirvUtils.hpp b/external/openglcts/modules/common/glcSpirvUtils.hpp index 2ed596a..e5d441b 100644 --- a/external/openglcts/modules/common/glcSpirvUtils.hpp +++ b/external/openglcts/modules/common/glcSpirvUtils.hpp @@ -35,9 +35,19 @@ typedef std::map > 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); diff --git a/external/openglcts/modules/common/subgroups/CMakeLists.txt b/external/openglcts/modules/common/subgroups/CMakeLists.txt old mode 100755 new mode 100644 index 6a2663a..dbfa94a --- a/external/openglcts/modules/common/subgroups/CMakeLists.txt +++ b/external/openglcts/modules/common/subgroups/CMakeLists.txt @@ -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) diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp index 6f2f6ba..baa09f2 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.cpp @@ -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. @@ -22,17 +23,19 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsArithmeticTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsArithmeticTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 0x3); + return glc::subgroups::check(datas, width, 0x3); } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup arithmetic category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup arithmetic category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp index 6ae287e..fbd02f4 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsArithmeticTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp index b6503a8..456d015 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.cpp @@ -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. @@ -22,17 +23,19 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsBallotBroadcastTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsBallotBroadcastTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 3); + return glc::subgroups::check(datas, width, 3); } -static bool checkCompute(std::vector datas, +static bool checkComputeStages(std::vector 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[" < graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup ballot broadcast category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup ballot broadcast category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), name + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp index a2352f9..d1deb95 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotBroadcastTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp index c16cbe0..d354fdb 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.cpp @@ -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. @@ -22,17 +23,19 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsBallotOtherTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsBallotOtherTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 0xf); + return glc::subgroups::check(datas, width, 0xf); } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup ballot other category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup ballot other category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), op + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp index 628e82b..e40de7b 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotOtherTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp index bf46772..ac52444 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.cpp @@ -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. @@ -22,57 +23,59 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsBallotTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsBallotTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include using namespace tcu; using namespace std; -using namespace vk; -using namespace vkt; +namespace glc +{ +namespace subgroups +{ namespace { static bool checkVertexPipelineStages(std::vector datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 0x7); + return glc::subgroups::check(datas, width, 0x7); } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup ballot category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup ballot category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp index 9fa927d..957de65 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBallotTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp index d39a19e..db64e48 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.cpp @@ -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. @@ -22,22 +23,27 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsBasicTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsBasicTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" +#include "gluContextInfo.hpp" #include #include +#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 datas, deUint32 width, deUint32 height, deUint32) @@ -184,7 +190,7 @@ static bool checkComputeSubgroupElect(std::vector 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 datas, @@ -193,7 +199,7 @@ static bool checkComputeSubgroupBarriers(std::vector datas, { // We used this SSBO to generate our unique value! const deUint32 ref = *reinterpret_cast(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["< bufferNameMapping; + bufferNameMapping.insert(pair("SSBO1", "1")); + bufferNameMapping.insert(pair("SSBO2", "2")); + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("SSBO1", "4")); + bufferNameMapping.insert(pair("SSBO2", "6")); + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("SSBO1", "7")); + bufferNameMapping.insert(pair("SSBO2", "9")); + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("SSBO1", "10")); + bufferNameMapping.insert(pair("SSBO2", "12")); + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("SSBO1", "13")); + bufferNameMapping.insert(pair("SSBO2", "15")); + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("SSBO1", "16")); + bufferNameMapping.insert(pair("SSBO2", "18")); + bufferNameMapping.insert(pair("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 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup basic category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup basic category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), op + "_" + getShaderStageName(caseDefFrag.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDefFrag); } @@ -2114,7 +1541,7 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx) } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp index 5e3639a..1aac442 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBasicTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp index 9db45d0..901d770 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.cpp @@ -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. @@ -22,17 +23,16 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsBuiltinMaskVarTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsBuiltinMaskVarTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup builtin mask category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup builtin mask category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr framebufferGroup(new deqp::TestCaseGroup( testCtx, "framebuffer", "Subgroup builtin mask category tests: framebuffer")); const char* const all_stages_vars[] = @@ -1435,12 +460,12 @@ de::MovePtr 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 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::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::addFunctionCaseWithPrograms(computeGroup.get(), varLower, "", supportedCheck, initPrograms, test, caseDef); } @@ -1466,14 +491,14 @@ de::MovePtr 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::addFunctionCaseWithPrograms(framebufferGroup.get(), varLower + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr group(new deqp::TestCaseGroup( testCtx, "builtin_mask_var", "Subgroup builtin mask variable tests")); group->addChild(graphicGroup.release()); @@ -1483,4 +508,4 @@ de::MovePtr graphicGroup(new tcu::TestCaseGroup( return group.release(); } } // subgroups -} // vkt +} // glc diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp index 98585ba..cc14961 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinMaskVarTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp index b825a74..9d77480 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.cpp @@ -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. @@ -22,17 +23,16 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsBuiltinVarTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsBuiltinVarTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup builtin variable tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup builtin variable tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::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::addFunctionCaseWithPrograms(computeGroup.get(), de::toLower(var), "", supportedCheck, initPrograms, test, caseDef); } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp index f7a1dc8..e578104 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsBuiltinVarTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp index 718be21..5c3ac2f 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.cpp @@ -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. @@ -22,17 +23,19 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsClusteredTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsClusteredTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 1); + return glc::subgroups::check(datas, width, 1); } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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()) < graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup clustered category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup clustered category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), name +"_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp index d1f518c..f9e3e26 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsClusteredTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp index c1a658a..04e92ec 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.cpp @@ -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. @@ -23,17 +23,19 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsPartitionedTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsPartitionedTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 datas, deUint32 width, deUint32) { - const deUint32* data = - reinterpret_cast(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 datas, +static bool checkComputeStage(std::vector datas, const deUint32 numWorkgroups[3], const deUint32 localSize[3], deUint32) { - const deUint32* data = - reinterpret_cast(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 group(new tcu::TestCaseGroup( - testCtx, "partitioned", "NV_shader_subgroup_partitioned category tests")); + de::MovePtr graphicGroup(new deqp::TestCaseGroup( + testCtx, "graphics", "Subgroup partitioned category tests: graphics")); + de::MovePtr computeGroup(new deqp::TestCaseGroup( + testCtx, "compute", "Subgroup partitioned category tests: compute")); + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), + name + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } } + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp index c5e5dcf..8102d1d 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsPartitionedTests.hpp @@ -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. @@ -26,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp index 1abe256..bdf5d6f 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.cpp @@ -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. @@ -22,17 +23,19 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsQuadTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsQuadTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 1); + return glc::subgroups::check(datas, width, 1); } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup arithmetic category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup arithmetic category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), name.str()+"_"+ getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } @@ -748,7 +728,7 @@ tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx) } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp index 6bc23a6..ec0ab6b 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsQuadTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp index e32862d..b7d4df7 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.cpp @@ -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. @@ -22,30 +23,32 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsShapeTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsShapeTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include using namespace tcu; using namespace std; -using namespace vk; -using namespace vkt; +namespace glc +{ +namespace subgroups +{ namespace { static bool checkVertexPipelineStages(std::vector datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 1); + return glc::subgroups::check(datas, width, 1); } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup shape category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup shape category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(),op + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp index 8626a66..4c63484 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShapeTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp index 749b9b2..33d6692 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.cpp @@ -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. @@ -22,17 +23,19 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsShuffleTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsShuffleTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include 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 datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 1); + return glc::subgroups::check(datas, width, 1); } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup shuffle category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup shuffle category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::addFunctionCaseWithPrograms(framebufferGroup.get(), name + "_" + getShaderStageName(caseDef.shaderStage), "", supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); } } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp index 9b8831b..e425182 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsShuffleTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp index 916f903..5818c54 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.cpp @@ -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. @@ -22,56 +23,53 @@ * \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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp index 37afda0..cc45a51 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTests.hpp @@ -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. @@ -25,16 +26,28 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp old mode 100644 new mode 100755 index b113799..88eaee4 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.cpp @@ -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. @@ -22,347 +23,299 @@ * \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(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(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(sizeof(deInt32) * 2); - case VK_FORMAT_R8G8B8_USCALED: - case VK_FORMAT_R8G8B8A8_USCALED: + case FORMAT_R32G32B32_BOOL: + case FORMAT_R32G32B32A32_BOOL: return static_cast(sizeof(deInt32) * 4); } } -Move 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 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 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 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 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 noViewports; - std::vector 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 templateArgs; +// string versionDecl(getGLSLVersionDeclaration(context.getGLSLVersion())); +// templateArgs.insert(pair("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& viewports - noScissors, // const std::vector& 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(program); } -Move makeComputePipeline(Context& context, - const VkPipelineLayout pipelineLayout, const VkShaderModule shaderModule, +de::MovePtr 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(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 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("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 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 makeCommandPool(Context& context) -{ - const VkCommandPoolCreateInfo commandPoolParams = + stringstream localSize; + localSize << "local_size_y = " << localSizeY; + localSizeParams.insert(pair("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("LOCAL_SIZE_Z", localSize.str())); + } - return createCommandPool( - context.getDeviceInterface(), context.getDevice(), &commandPoolParams); -} + glu::ComputeSource cshader(glu::ComputeSource(computeTemplate.specialize(localSizeParams))); -Move 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 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 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(fence); -} + program = new glu::ShaderProgram(context.getDeqpContext().getRenderContext().getFunctions(), binaries); + } -void waitFence(Context& context, Move 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(program); } struct Buffer; @@ -387,178 +340,195 @@ struct BufferOrImage return reinterpret_cast(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 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 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 m_image; - Move m_imageView; - Move 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 pointsParams; pointsParams.insert(pair("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 linesParams; - linesParams.insert(pair("TOPOLOGY", "InputLines")); - - map pointsParams; - pointsParams.insert(pair("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(alloc.getHostPtr()); + deUint32* ptr = reinterpret_cast(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(alloc.getHostPtr()); + float* ptr = reinterpret_cast(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(alloc.getHostPtr()); + double* ptr = reinterpret_cast(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(alloc.getHostPtr()); + deUint32* ptr = reinterpret_cast(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 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 > inputBuffers (extraDataCount); - DescriptorSetLayoutBuilder layoutBuilder; - DescriptorPoolBuilder poolBuilder; - DescriptorSetUpdateBuilder updateBuilder; - Move descriptorPool; - Move descriptorSet; - - const Unique vertexShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("vert"), 0u)); - const Unique teCtrlShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("tesc"), 0u)); - const Unique teEvalShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("tese"), 0u)); - const Unique fragmentShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("fragment"), 0u)); - const Unique renderPass (makeRenderPass(context, format)); - - const VkVertexInputBindingDescription vertexInputBinding = - { - 0u, // binding; - static_cast(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(new Image(context, static_cast(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(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)); + deUint64 size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements; + inputBuffers[i] = de::SharedPtr(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 descriptorSetLayout (layoutBuilder.build(context.getDeviceInterface(), context.getDevice())); - - const Unique pipelineLayout (makePipelineLayout(context, *descriptorSetLayout)); - - const Unique 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 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 cmdPool (makeCommandPool(context)); const deUint32 subgroupSize = getSubgroupSize(context); - const Unique 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 data (2u * maxWidth, Vec4(1.0f, 0.0f, 1.0f, 1.0f)); + glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr(); + std::vector data (2u * maxWidth, tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f)); const float pixelSize = 2.0f / static_cast(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 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 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 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 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) << " / " + < datas, +bool glc::subgroups::check(std::vector datas, deUint32 width, deUint32 ref) { const deUint32* data = reinterpret_cast(datas[0]); @@ -1684,7 +1172,7 @@ bool vkt::subgroups::check(std::vector datas, return true; } -bool vkt::subgroups::checkCompute(std::vector datas, +bool glc::subgroups::checkCompute(std::vector datas, const deUint32 numWorkgroups[3], const deUint32 localSize[3], deUint32 ref) { @@ -1695,116 +1183,78 @@ bool vkt::subgroups::checkCompute(std::vector 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 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 > inputBuffers (extraDataCount); - DescriptorSetLayoutBuilder layoutBuilder; - DescriptorPoolBuilder poolBuilder; - DescriptorSetUpdateBuilder updateBuilder; - Move descriptorPool; - Move descriptorSet; - - const Unique vertexShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("vert"), 0u)); - const Unique geometryShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("geometry"), 0u)); - const Unique fragmentShaderModule (createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("fragment"), 0u)); - const Unique renderPass (makeRenderPass(context, format)); - const VkVertexInputBindingDescription vertexInputBinding = - { - 0u, // binding; - static_cast(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(new Image(context, static_cast(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(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)); + deUint64 size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements; + inputBuffers[i] = de::SharedPtr(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 descriptorSetLayout (layoutBuilder.build(context.getDeviceInterface(), context.getDevice())); - - const Unique pipelineLayout (makePipelineLayout(context, *descriptorSetLayout)); - - const Unique 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 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 cmdPool (makeCommandPool(context)); const deUint32 subgroupSize = getSubgroupSize(context); - const Unique 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 data (maxWidth, Vec4(1.0f, 1.0f, 1.0f, 1.0f)); + glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr(); + std::vector data (maxWidth, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); const float pixelSize = 2.0f / static_cast(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 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 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 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 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) << " / " + < datas, deUint32 width, deUint32 subgroupSize), - const VkShaderStageFlags shaderStageTested) + const ShaderStageFlags shaderStageTested) { const deUint32 maxWidth = 1024u; - vector stagesVector; - VkShaderStageFlags shaderStageRequired = (VkShaderStageFlags)0ull; - - Move vertexShaderModule; - Move teCtrlShaderModule; - Move teEvalShaderModule; - Move geometryShaderModule; - Move fragmentShaderModule; + vector 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(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 > 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(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(new Image(context, static_cast(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(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 descriptorSetLayout( - layoutBuilder.build(context.getDeviceInterface(), context.getDevice())); - - const Unique pipelineLayout( - makePipelineLayout(context, *descriptorSetLayout)); - - const Unique renderPass(makeRenderPass(context, format)); - const Unique 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(inputBuffers.size()); ndx++) - { - poolBuilder.addType(inputBuffers[ndx]->getType()); - } - - const Unique descriptorPool( - poolBuilder.build(context.getDeviceInterface(), context.getDevice(), - VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u)); - - // Create descriptor set - const Unique 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 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 cmdPool (makeCommandPool(context)); const deUint32 subgroupSize = getSubgroupSize(context); - const Unique 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 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 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 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 datas; + std::vector 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 datas; - const Allocation& resultAlloc = imageBufferResult.getAllocation(); - invalidateAlloc(context.getDeviceInterface(), context.getDevice(), resultAlloc); + std::vector 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 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 > inputBuffers (extraDataCount); - DescriptorSetLayoutBuilder layoutBuilder; - const Unique vertexShaderModule (createShaderModule - (context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("vert"), 0u)); - const Unique fragmentShaderModule (createShaderModule - (context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("fragment"), 0u)); - const Unique renderPass (makeRenderPass(context, format)); - - const VkVertexInputBindingDescription vertexInputBinding = - { - 0u, // binding; - static_cast(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(new Image(context, static_cast(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(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 descriptorSetLayout (layoutBuilder.build(context.getDeviceInterface(), context.getDevice())); + deUint64 size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements; + inputBuffers[i] = de::SharedPtr(new Buffer(context, size, GL_UNIFORM_BUFFER)); - const Unique pipelineLayout (makePipelineLayout(context, *descriptorSetLayout)); - - const Unique 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 descriptorPool; - Move 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 cmdPool (makeCommandPool(context)); + de::MovePtr 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 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 data (maxWidth, Vec4(1.0f, 1.0f, 1.0f, 1.0f)); + glw::GLvoid * bufferPtr = vertexBuffer.mapBufferPtr(); + std::vector data (maxWidth, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); const float pixelSize = 2.0f / static_cast(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 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 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 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 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) << " / " + < datas, deUint32 width, deUint32 height, deUint32 subgroupSize)) { - const Unique vertexShaderModule (createShaderModule - (context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("vert"), 0u)); - const Unique 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 > inputBuffers(extraDatasCount); @@ -2429,98 +1821,58 @@ tcu::TestStatus vkt::subgroups::makeFragmentFrameBufferTest (Context& context, V { inputBuffers[i] = de::SharedPtr(new Image(context, static_cast(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(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(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 descriptorSetLayout( - layoutBuilder.build(context.getDeviceInterface(), context.getDevice())); - - const Unique pipelineLayout( - makePipelineLayout(context, *descriptorSetLayout)); - - const Unique renderPass(makeRenderPass(context, format)); - const Unique 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 descriptorPool; - // Create descriptor set - Move 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 pipeline( + makeGraphicsPipeline(context, (ShaderStageFlags)(SHADER_STAGE_VERTEX_BIT | SHADER_STAGE_FRAGMENT_BIT), + &vshader, &fshader, DE_NULL, DE_NULL, DE_NULL)); - const Unique cmdPool(makeCommandPool(context)); + if (!pipeline->isOk()) + { + return tcu::TestStatus::fail("frag graphics program build failed"); + } const deUint32 subgroupSize = getSubgroupSize(context); - const Unique 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 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 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 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 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) << " / " + < 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(new Image(context, static_cast(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(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 descriptorSetLayout( - layoutBuilder.build(context.getDeviceInterface(), context.getDevice())); - - const Unique shaderModule( - createShaderModule(context.getDeviceInterface(), context.getDevice(), - context.getBinaryCollection().get("comp"), 0u)); - const Unique 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 descriptorPool( - poolBuilder.build(context.getDeviceInterface(), context.getDevice(), - VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u)); - - // Create descriptor set - const Unique 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 cmdPool(makeCommandPool(context)); + const GlslSource &cshader = context.getSourceCollection().get("comp"); unsigned totalIterations = 0; unsigned failedIterations = 0; const deUint32 subgroupSize = getSubgroupSize(context); - const Unique 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 lastPipeline( - makeComputePipeline(context, *pipelineLayout, *shaderModule, + + de::MovePtr 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 fence(submitCommandBuffer(context, *cmdBuffer)); + gl.useProgram(lastPipeline->getProgram()); + GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram"); - Move 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 nextPipeline( + makeComputePipeline(context, cshader, nextX, nextY, nextZ)); std::vector 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"); diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp index d9edae6..9a8ee30 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsTestsUtils.hpp @@ -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. @@ -24,45 +25,354 @@ * \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 -namespace vkt +namespace glc { + +enum ShaderType +{ + SHADER_TYPE_GLSL = 0, + SHADER_TYPE_SPIRV, + + SHADER_TYPE_LAST +}; + +template +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); + + bool contains (const std::string& name) const; + const Program& get (const std::string& name) const; + + class Iterator + { + private: + typedef typename std::map::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 ProgramMap; + + ProgramMap m_programs; +}; + +template +ProgramCollection::ProgramCollection (void) +{ +} + +template +ProgramCollection::~ProgramCollection (void) +{ + clear(); +} + +template +void ProgramCollection::clear (void) +{ + for (typename ProgramMap::const_iterator i = m_programs.begin(); i != m_programs.end(); ++i) + delete i->second; + m_programs.clear(); +} + +template +Program& ProgramCollection::add (const std::string& name) +{ + DE_ASSERT(!contains(name)); + de::MovePtr prog = de::newMovePtr(); + m_programs[name] = prog.get(); + prog.release(); + return *m_programs[name]; +} + +template +void ProgramCollection::add (const std::string& name, de::MovePtr& program) +{ + DE_ASSERT(!contains(name)); + m_programs[name] = program.get(); + program.release(); +} + +template +bool ProgramCollection::contains (const std::string& name) const +{ + return de::contains(m_programs, name); +} + +template +const Program& ProgramCollection::get (const std::string& name) const +{ + DE_ASSERT(contains(name)); + return *m_programs.find(name)->second; +} + +struct GlslSource +{ + std::vector sources[glu::SHADERTYPE_LAST]; + + GlslSource& operator<< (const glu::ShaderSource& shaderSource) + { + sources[shaderSource.shaderType].push_back(shaderSource.source); + return *this; + } +}; + +typedef ProgramCollection 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 +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 datas, deUint32 width, deUint32 ref); @@ -132,36 +441,36 @@ bool checkCompute(std::vector 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 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 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 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 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 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 datas, const deUint32 numWorkgroups[3], const deUint32 localSize[3], deUint32 subgroupSize)); } // subgroups -} // vkt +} // glc -#endif // _VKTSUBGROUPSTESTSUTILS_HPP +#endif // _GLCSUBGROUPSTESTSUTILS_HPP diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp index f201dd2..dbf8d1d 100755 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.cpp @@ -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. @@ -22,19 +23,24 @@ * \brief Subgroups Tests */ /*--------------------------------------------------------------------*/ -#include "vktSubgroupsVoteTests.hpp" -#include "vktSubgroupsTestsUtils.hpp" +#include "glcSubgroupsVoteTests.hpp" +#include "glcSubgroupsTestsUtils.hpp" #include #include +#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 datas, deUint32 width, deUint32) { - return vkt::subgroups::check(datas, width, 0x1F); + return glc::subgroups::check(datas, width, 0x1F); } static bool checkFragmentPipelineStages(std::vector datas, @@ -76,11 +82,11 @@ static bool checkFragmentPipelineStages(std::vector datas, return true; } -static bool checkCompute(std::vector datas, +static bool checkComputeStage(std::vector 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 bufferNameMapping; + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("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 bufferNameMapping; + bufferNameMapping.insert(pair("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 graphicGroup(new tcu::TestCaseGroup( + de::MovePtr graphicGroup(new deqp::TestCaseGroup( testCtx, "graphics", "Subgroup arithmetic category tests: graphics")); - de::MovePtr computeGroup(new tcu::TestCaseGroup( + de::MovePtr computeGroup(new deqp::TestCaseGroup( testCtx, "compute", "Subgroup arithmetic category tests: compute")); - de::MovePtr framebufferGroup(new tcu::TestCaseGroup( + de::MovePtr framebufferGroup(new deqp::TestCaseGroup( testCtx, "framebuffer", "Subgroup arithmetic category tests: framebuffer")); - de::MovePtr fragHelperGroup(new tcu::TestCaseGroup( + de::MovePtr 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::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::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::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::addFunctionCaseWithPrograms(fragHelperGroup.get(), op + "_" + subgroups::getFormatNameForGLSL(format) + "_" + getShaderStageName(caseDef.shaderStage), "", @@ -786,7 +784,7 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx) } } - de::MovePtr group(new tcu::TestCaseGroup( + de::MovePtr 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 diff --git a/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp index 57b795a..ab39d2f 100644 --- a/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp +++ b/external/openglcts/modules/common/subgroups/glcSubgroupsVoteTests.hpp @@ -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. @@ -25,16 +26,16 @@ */ /*--------------------------------------------------------------------*/ #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 diff --git a/external/openglcts/modules/gl/gl4cTestPackages.cpp b/external/openglcts/modules/gl/gl4cTestPackages.cpp index dfb4cd2..65f5fcb 100644 --- a/external/openglcts/modules/gl/gl4cTestPackages.cpp +++ b/external/openglcts/modules/gl/gl4cTestPackages.cpp @@ -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 (...) {