Subgroup Tests: Using framebuffer instead of SSBO
authorArkadiusz Sarwa <arkadiusz.sarwa@mobica.com>
Fri, 8 Sep 2017 09:31:39 +0000 (11:31 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Tue, 26 Sep 2017 10:58:44 +0000 (06:58 -0400)
Vulkan 1.1 has subgroup functionality that these tests verify.

Affects:
dEQP-VK.subgroups.*fragment*
dEQP-VK.subgroups.*framebuffer

Components: Vulkan

VK-GL-CTS issue: 546

Change-Id: Ifec1127a78e7286bda3a6842b110222d09a6fcbe
(cherry picked from commit c88a2dc7da012de77325f0df5c67637640f0144e)

16 files changed:
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
external/vulkancts/mustpass/1.0.3/vk-default.txt

index 23de19a..908a1b1 100755 (executable)
@@ -247077,7 +247077,9 @@ dEQP-VK.subgroups.builtin_var.subgroupinvocationid_tess_control
 dEQP-VK.subgroups.builtin_var.subgroupsize_geometry
 dEQP-VK.subgroups.builtin_var.subgroupinvocationid_geometry
 dEQP-VK.subgroups.builtin_var.subgroupsize_vertex
+dEQP-VK.subgroups.builtin_var.subgroupsize_vertex_framebuffer
 dEQP-VK.subgroups.builtin_var.subgroupinvocationid_vertex
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_vertex_framebuffer
 dEQP-VK.subgroups.builtin_var.subgroupsize_fragment
 dEQP-VK.subgroups.builtin_var.subgroupinvocationid_fragment
 dEQP-VK.subgroups.builtin_var.subgroupsize_compute
@@ -247100,10 +247102,15 @@ dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_geometry
 dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_geometry
 dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_geometry
 dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_fragment
 dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_fragment
 dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_fragment
@@ -247130,15 +247137,24 @@ dEQP-VK.subgroups.basic.subgroupmemorybarrier_geometry
 dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_geometry
 dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_geometry
 dEQP-VK.subgroups.basic.subgroupelect_vertex
+dEQP-VK.subgroups.basic.subgroupelect_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupbarrier_vertex
+dEQP-VK.subgroups.basic.subgroupbarrier_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrier_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupelect_fragment
 dEQP-VK.subgroups.basic.subgroupbarrier_fragment
+dEQP-VK.subgroups.basic.subgroupbarrier_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrier_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupelect_compute
 dEQP-VK.subgroups.basic.subgroupbarrier_compute
 dEQP-VK.subgroups.basic.subgroupmemorybarrier_compute
@@ -247212,27 +247228,49 @@ dEQP-VK.subgroups.vote.subgroupallequal_bvec2_geometry
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_geometry
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_geometry
 dEQP-VK.subgroups.vote.subgroupallequal_int_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_int_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_vertex
+dEQP-VK.subgroups.vote.subgroupall_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_vertex
+dEQP-VK.subgroups.vote.subgroupany_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_float_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_double_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_fragment
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_fragment
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_fragment
@@ -247281,6 +247319,7 @@ dEQP-VK.subgroups.ballot.tess_eval
 dEQP-VK.subgroups.ballot.tess_control
 dEQP-VK.subgroups.ballot.geometry
 dEQP-VK.subgroups.ballot.vertex
+dEQP-VK.subgroups.ballot.vertex_framebuffer
 dEQP-VK.subgroups.ballot.fragment
 dEQP-VK.subgroups.ballot.compute
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_tess_eval
@@ -247404,45 +247443,85 @@ dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_geometry
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_geometry
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_geometry
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_fragment
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_fragment
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_fragment
@@ -247545,12 +247624,19 @@ dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_geometry
 dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_geometry
 dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_geometry
 dEQP-VK.subgroups.ballot_other.subgroupinverseballot_vertex
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupinverseballot_fragment
 dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_fragment
 dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_fragment
@@ -248466,305 +248552,605 @@ dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_geometry
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_geometry
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_geometry
 dEQP-VK.subgroups.arithmetic.subgroupadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_int_fragment
 dEQP-VK.subgroups.arithmetic.subgroupmul_int_fragment
 dEQP-VK.subgroups.arithmetic.subgroupmin_int_fragment
@@ -249666,105 +250052,205 @@ dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_geometry
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_geometry
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_geometry
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_fragment
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_fragment
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_fragment
@@ -250206,85 +250692,165 @@ dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_geometry
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_geometry
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_geometry
 dEQP-VK.subgroups.shuffle.subgroupshuffle_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_int_fragment
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_fragment
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_fragment
@@ -250686,85 +251252,165 @@ dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_fragment
@@ -250986,25 +251632,45 @@ dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_fragment
@@ -251106,25 +251772,45 @@ dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_fragment
@@ -251226,25 +251912,45 @@ dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_fragment
@@ -251292,7 +251998,9 @@ dEQP-VK.subgroups.shape.quad_tess_control
 dEQP-VK.subgroups.shape.clustered_geometry
 dEQP-VK.subgroups.shape.quad_geometry
 dEQP-VK.subgroups.shape.clustered_vertex
+dEQP-VK.subgroups.shape.clustered_vertex_framebuffer
 dEQP-VK.subgroups.shape.quad_vertex
+dEQP-VK.subgroups.shape.quad_vertex_framebuffer
 dEQP-VK.subgroups.shape.clustered_fragment
 dEQP-VK.subgroups.shape.quad_fragment
 dEQP-VK.subgroups.shape.clustered_compute
index 8c6be83..67829d2 100644 (file)
@@ -457,11 +457,113 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
-       VkFormat format;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       VkFormat                        format;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string indexVars;
+       switch (caseDef.opType)
+       {
+               default:
+                       indexVars = "  uint start = 0, end = gl_SubgroupSize;\n";
+                       break;
+               case OPTYPE_INCLUSIVE_ADD:
+               case OPTYPE_INCLUSIVE_MUL:
+               case OPTYPE_INCLUSIVE_MIN:
+               case OPTYPE_INCLUSIVE_MAX:
+               case OPTYPE_INCLUSIVE_AND:
+               case OPTYPE_INCLUSIVE_OR:
+               case OPTYPE_INCLUSIVE_XOR:
+                       indexVars = "  uint start = 0, end = gl_SubgroupInvocationID + 1;\n";
+                       break;
+               case OPTYPE_EXCLUSIVE_ADD:
+               case OPTYPE_EXCLUSIVE_MUL:
+               case OPTYPE_EXCLUSIVE_MIN:
+               case OPTYPE_EXCLUSIVE_MAX:
+               case OPTYPE_EXCLUSIVE_AND:
+               case OPTYPE_EXCLUSIVE_OR:
+               case OPTYPE_EXCLUSIVE_XOR:
+                       indexVars = "  uint start = 0, end = gl_SubgroupInvocationID;\n";
+                       break;
+       }
+
+       std::ostringstream bdy;
+
+       bdy << indexVars
+               << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " ref = "
+               << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+               << "  uint tempResult = 0;\n"
+               << "  for (uint index = start; index < end; index++)\n"
+               << "  {\n"
+               << "    if (subgroupBallotBitExtract(mask, index))\n"
+               << "    {\n"
+               << "      ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+               << "    }\n"
+               << "  }\n"
+               << "  tempResult = " << getCompare(caseDef.opType, caseDef.format, "ref",
+                                                                                       getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") << " ? 0x1 : 0;\n"
+               << "  if (1 == (gl_SubgroupInvocationID % 2))\n"
+               << "  {\n"
+               << "    mask = subgroupBallot(true);\n"
+               << "    ref = " << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+               << "    for (uint index = start; index < end; index++)\n"
+               << "    {\n"
+               << "      if (subgroupBallotBitExtract(mask, index))\n"
+               << "      {\n"
+               << "        ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+               << "      }\n"
+               << "    }\n"
+               << "    tempResult |= " << getCompare(caseDef.opType, caseDef.format, "ref",
+                               getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID])") << " ? 0x2 : 0;\n"
+               << "  }\n"
+               << "  else\n"
+               << "  {\n"
+               << "    tempResult |= 0x2;\n"
+               << "  }\n";
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream      src;
+               std::ostringstream      fragmentSrc;
+
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "#extension GL_KHR_shader_subgroup_arithmetic: enable\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"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  out_color = float(tempResult);\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float in_color;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(in_color);\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        std::string indexVars;
@@ -567,7 +669,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 = 0, std430) buffer Buffer2\n"
+                        << "layout(set = 0, binding = 0, std430) readonly buffer Buffer2\n"
                         << "{\n"
                         << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
                         << "};\n"
@@ -743,6 +845,17 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -917,7 +1030,7 @@ tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
                                        continue;
                                }
 
-                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+                               CaseDefinition caseDef = {opTypeIndex, stage, format, false};
 
                                std::string op = getOpTypeName(opTypeIndex);
 
@@ -926,6 +1039,14 @@ tcu::TestCaseGroup* createSubgroupsArithmeticTests(tcu::TestContext& testCtx)
                                                                                        subgroups::getFormatNameForGLSL(format) +
                                                                                        "_" + getShaderStageName(stage),
                                                                                        "", initPrograms, test, caseDef);
+
+                               if (VK_SHADER_STAGE_VERTEX_BIT == stage)
+                               {
+                                       caseDef.noSSBO = true;
+                                       addFunctionCaseWithPrograms(group.get(), de::toLower(op) + "_" + subgroups::getFormatNameForGLSL(format) +
+                                                                                               "_" + getShaderStageName(stage) + "_framebuffer", "",
+                                                                                               initFrameBufferPrograms, test, caseDef);
+                               }
                        }
                }
        }
index a38bc03..6960dcb 100644 (file)
@@ -151,11 +151,110 @@ std::string getOpTypeName(int opType)
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
-       VkFormat format;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       VkFormat                        format;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+
+       bdy << "  uint tempResult = 0;\n";
+
+       if (OPTYPE_BROADCAST == caseDef.opType)
+       {
+               bdy << "  tempResult = 0x3;\n";
+
+               for (deUint32 i = 0; i < subgroups::maxSupportedSubgroupSize(); i++)
+               {
+                       bdy     << "  {\n"
+                               << "    const uint id = " << i << ";\n"
+                               << "    " << subgroups::getFormatNameForGLSL(caseDef.format)
+                               << " op = subgroupBroadcast(data1[gl_SubgroupInvocationID], id);\n"
+                               << "    if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                               << "    {\n"
+                               << "      if (op != data1[id])\n"
+                               << "      {\n"
+                               << "        tempResult = 0;\n"
+                               << "      }\n"
+                               << "    }\n"
+                               << "  }\n";
+               }
+       }
+       else
+       {
+               bdy     << "  uint firstActive = 0;\n"
+                       << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                       << "  {\n"
+                       << "    if (subgroupBallotBitExtract(mask, i))\n"
+                       << "    {\n"
+                       << "      firstActive = i;\n"
+                       << "      break;\n"
+                       << "    }\n"
+                       << "  }\n"
+                       << "  tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x1 : 0;\n"
+                       << "  // make the firstActive invocation inactive now\n"
+                       << "  if (firstActive == gl_SubgroupInvocationID)\n"
+                       << "  {\n"
+                       << "    for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                       << "    {\n"
+                       << "      if (subgroupBallotBitExtract(mask, i))\n"
+                       << "      {\n"
+                       << "        firstActive = i;\n"
+                       << "        break;\n"
+                       << "      }\n"
+                       << "    }\n"
+                       << "    tempResult |= (subgroupBroadcastFirst(data1[gl_SubgroupInvocationID]) == data1[firstActive]) ? 0x2 : 0;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    // the firstActive invocation didn't partake in the second result so set it to true\n"
+                       << "    tempResult |= 0x2;\n"
+                       << "  }\n";
+       }
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+               std::ostringstream      fragmentSrc;
+
+               src << 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"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  out_color = float(tempResult);\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert")
+                               << glu::VertexSource(src.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float in_color;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(in_color);\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        std::ostringstream bdy;
@@ -255,7 +354,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                frag << "#version 450\n"
                         << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
                         << "layout(location = 0) out uint result;\n"
-                        << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                        << "layout(set = 0, binding = 0, std430) readonly buffer Buffer1\n"
                         << "{\n"
                         << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
                         << "};\n"
@@ -427,6 +526,17 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -545,7 +655,7 @@ tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCt
 
                        for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
                        {
-                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+                               CaseDefinition caseDef = {opTypeIndex, stage, format, false};
 
                                std::ostringstream name;
 
@@ -556,6 +666,13 @@ tcu::TestCaseGroup* createSubgroupsBallotBroadcastTests(tcu::TestContext& testCt
 
                                addFunctionCaseWithPrograms(group.get(), name.str(),
                                                                                        "", initPrograms, test, caseDef);
+
+                               if (VK_SHADER_STAGE_VERTEX_BIT == stage )
+                               {
+                                       caseDef.noSSBO = true;
+                                       addFunctionCaseWithPrograms(group.get(), name.str()+"_framebuffer", "",
+                                                               initFrameBufferPrograms, test, caseDef);
+                               }
                        }
                }
        }
index 6381c69..106cad2 100644 (file)
@@ -164,11 +164,187 @@ std::string getOpTypeName(int opType)
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       bool                            noSSBO;
 };
 
-void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+
+       bdy << "  uvec4 allOnes = uvec4(0xFFFFFFFF);\n"
+               << "  uvec4 allZeros = uvec4(0);\n"
+               << "  uint tempResult = 0;\n"
+               << "#define MAKE_HIGH_BALLOT_RESULT(i) uvec4("
+               << "i >= 32 ? 0 : (0xFFFFFFFF << i), "
+               << "i >= 64 ? 0 : (0xFFFFFFFF << ((i < 32) ? 0 : (i - 32))), "
+               << "i >= 96 ? 0 : (0xFFFFFFFF << ((i < 64) ? 0 : (i - 64))), "
+               << " 0xFFFFFFFF << ((i < 96) ? 0 : (i - 96)))\n"
+               << "#define MAKE_SINGLE_BIT_BALLOT_RESULT(i) uvec4("
+               << "i >= 32 ? 0 : 0x1 << i, "
+               << "i < 32 || i >= 64 ? 0 : 0x1 << (i - 32), "
+               << "i < 64 || i >= 96 ? 0 : 0x1 << (i - 64), "
+               << "i < 96 ? 0 : 0x1 << (i - 96))\n";
+
+       switch (caseDef.opType)
+       {
+               default:
+                       DE_FATAL("Unknown op type!");
+               case OPTYPE_INVERSE_BALLOT:
+                       bdy << "  tempResult |= subgroupInverseBallot(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= subgroupInverseBallot(allZeros) ? 0 : 0x2;\n"
+                               << "  tempResult |= subgroupInverseBallot(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n";
+                       break;
+               case OPTYPE_BALLOT_BIT_EXTRACT:
+                       bdy << "  tempResult |= subgroupBallotBitExtract(allOnes, gl_SubgroupInvocationID) ? 0x1 : 0;\n"
+                               << "  tempResult |= subgroupBallotBitExtract(allZeros, gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  tempResult |= subgroupBallotBitExtract(subgroupBallot(true), gl_SubgroupInvocationID) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                               << "  {\n"
+                               << "    if (!subgroupBallotBitExtract(allOnes, gl_SubgroupInvocationID))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_BIT_COUNT:
+                       bdy << "  tempResult |= gl_SubgroupSize == subgroupBallotBitCount(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotBitCount(allZeros) ? 0x2 : 0;\n"
+                               << "  tempResult |= 0 < subgroupBallotBitCount(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotBitCount(MAKE_HIGH_BALLOT_RESULT(gl_SubgroupSize)) ? 0x8 : 0;\n";
+                       break;
+               case OPTYPE_BALLOT_INCLUSIVE_BIT_COUNT:
+                       bdy << "  uint inclusiveOffset = gl_SubgroupInvocationID + 1;\n"
+                               << "  tempResult |= inclusiveOffset == subgroupBallotInclusiveBitCount(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotInclusiveBitCount(allZeros) ? 0x2 : 0;\n"
+                               << "  tempResult |= 0 < subgroupBallotInclusiveBitCount(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  uvec4 inclusiveUndef = MAKE_HIGH_BALLOT_RESULT(inclusiveOffset);\n"
+                               << "  bool undefTerritory = false;\n"
+                               << "  for (uint i = 0; i <= 128; i++)\n"
+                               << "  {\n"
+                               << "    uvec4 iUndef = MAKE_HIGH_BALLOT_RESULT(i);\n"
+                               << "    if (iUndef == inclusiveUndef)"
+                               << "    {\n"
+                               << "      undefTerritory = true;\n"
+                               << "    }\n"
+                               << "    uint inclusiveBitCount = subgroupBallotInclusiveBitCount(iUndef);\n"
+                               << "    if (undefTerritory && (0 != inclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "    else if (!undefTerritory && (0 == inclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_EXCLUSIVE_BIT_COUNT:
+                       bdy << "  uint exclusiveOffset = gl_SubgroupInvocationID;\n"
+                               << "  tempResult |= exclusiveOffset == subgroupBallotExclusiveBitCount(allOnes) ? 0x1 : 0;\n"
+                               << "  tempResult |= 0 == subgroupBallotExclusiveBitCount(allZeros) ? 0x2 : 0;\n"
+                               << "  tempResult |= 0x4;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  uvec4 exclusiveUndef = MAKE_HIGH_BALLOT_RESULT(exclusiveOffset);\n"
+                               << "  bool undefTerritory = false;\n"
+                               << "  for (uint i = 0; i <= 128; i++)\n"
+                               << "  {\n"
+                               << "    uvec4 iUndef = MAKE_HIGH_BALLOT_RESULT(i);\n"
+                               << "    if (iUndef == exclusiveUndef)"
+                               << "    {\n"
+                               << "      undefTerritory = true;\n"
+                               << "    }\n"
+                               << "    uint exclusiveBitCount = subgroupBallotExclusiveBitCount(iUndef);\n"
+                               << "    if (undefTerritory && (0 != exclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x4;\n"
+                               << "    }\n"
+                               << "    else if (!undefTerritory && (0 == exclusiveBitCount))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_FIND_LSB:
+                       bdy << "  tempResult |= 0 == subgroupBallotFindLSB(allOnes) ? 0x1 : 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    tempResult |= 0x2;\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    tempResult |= 0 < subgroupBallotFindLSB(subgroupBallot(true)) ? 0x2 : 0;\n"
+                               << "  }\n"
+                               << "  tempResult |= gl_SubgroupSize > subgroupBallotFindLSB(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                               << "  {\n"
+                               << "    if (i != subgroupBallotFindLSB(MAKE_HIGH_BALLOT_RESULT(i)))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+               case OPTYPE_BALLOT_FIND_MSB:
+                       bdy << "  tempResult |= (gl_SubgroupSize - 1) == subgroupBallotFindMSB(allOnes) ? 0x1 : 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    tempResult |= 0x2;\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    tempResult |= 0 < subgroupBallotFindMSB(subgroupBallot(true)) ? 0x2 : 0;\n"
+                               << "  }\n"
+                               << "  tempResult |= gl_SubgroupSize > subgroupBallotFindMSB(subgroupBallot(true)) ? 0x4 : 0;\n"
+                               << "  tempResult |= 0x8;\n"
+                               << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
+                               << "  {\n"
+                               << "    if (i != subgroupBallotFindMSB(MAKE_SINGLE_BIT_BALLOT_RESULT(i)))\n"
+                               << "    {\n"
+                               << "      tempResult &= ~0x8;\n"
+                               << "    }\n"
+                               << "  }\n";
+                       break;
+       }
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+               std::ostringstream      fragmentSrc;
+
+               src << "#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"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  out_color = float(tempResult);\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float in_color;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(in_color);\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+void initPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
 {
        std::ostringstream bdy;
 
@@ -459,7 +635,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
        }
 }
 
-tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
+tcu::TestStatus test (Context& context, const CaseDefinition caseDef)
 {
        if (!subgroups::isSubgroupSupported(context))
                TCU_THROW(NotSupportedError, "Subgroup operations are not supported");
@@ -486,6 +662,13 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
        }
 
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT,
+                                                                                DE_NULL, 0, checkVertexPipelineStages);
+       }
+
+       //Tests which don't use the SSBO
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -554,7 +737,7 @@ tcu::TestCaseGroup* createSubgroupsBallotOtherTests(tcu::TestContext& testCtx)
 
                for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
                {
-                       CaseDefinition caseDef = {opTypeIndex, stage};
+                       CaseDefinition caseDef = {opTypeIndex, stage, false};
 
                        std::ostringstream name;
 
@@ -564,6 +747,14 @@ tcu::TestCaseGroup* createSubgroupsBallotOtherTests(tcu::TestContext& testCtx)
 
                        addFunctionCaseWithPrograms(group.get(), name.str(),
                                                                                "", initPrograms, test, caseDef);
+
+                       if (VK_SHADER_STAGE_VERTEX_BIT & stage )
+                       {
+                               caseDef.noSSBO = true;
+                               addFunctionCaseWithPrograms(group.get(), name.str() + "_framebuffer", "",
+                                                               initFrameBufferPrograms, test, caseDef);
+                       }
+
                }
        }
 
index 448aff4..9c37a47 100644 (file)
@@ -129,9 +129,55 @@ static bool checkCompute(std::vector<const void*> datas,
 
 struct CaseDefinition
 {
-       VkShaderStageFlags shaderStage;
+       VkShaderStageFlags      shaderStage;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream      fragmentSrc;
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream      vertexSrc;
+
+               vertexSrc << "#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"
+                       << "{\n"
+                       << "  uint data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uint tempResult = 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(true)) ? 0x1 : 0;\n"
+                       << "  bool bData = data[gl_SubgroupInvocationID] != 0;\n"
+                       << "  tempResult |= !bool(uvec4(0) == subgroupBallot(bData)) ? 0x2 : 0;\n"
+                       << "  tempResult |= uvec4(0) == subgroupBallot(false) ? 0x4 : 0;\n"
+                       << "  out_color = float(tempResult);\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float in_color;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(in_color);\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
@@ -179,7 +225,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                frag << "#version 450\n"
                         << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
                         << "layout(location = 0) out uint result;\n"
-                        << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                        << "layout(set = 0, binding = 0, std430) readonly buffer Buffer1\n"
                         << "{\n"
                         << "  uint data[];\n"
                         << "};\n"
@@ -360,6 +406,17 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[1];
+               inputData[0].format = VK_FORMAT_R32_UINT;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, inputData, 1, checkVertexPipelineStages);
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -459,7 +516,7 @@ tcu::TestCaseGroup* createSubgroupsBallotTests(tcu::TestContext& testCtx)
        {
                const VkShaderStageFlags stage = stages[stageIndex];
 
-               CaseDefinition caseDef = {stage};
+               CaseDefinition caseDef = {stage, false};
 
                std::ostringstream name;
 
@@ -467,6 +524,13 @@ tcu::TestCaseGroup* createSubgroupsBallotTests(tcu::TestContext& testCtx)
 
                addFunctionCaseWithPrograms(group.get(), name.str(),
                                                                        "", initPrograms, test, caseDef);
+
+               if (VK_SHADER_STAGE_VERTEX_BIT == stage )
+               {
+                       caseDef.noSSBO = true;
+                       addFunctionCaseWithPrograms(group.get(), name.str()+"_framebuffer", "",
+                                               initFrameBufferPrograms, test, caseDef);
+               }
        }
 
        return group.release();
index ab5f9eb..ba540fe 100644 (file)
@@ -35,8 +35,9 @@ using namespace vkt;
 
 namespace
 {
-static const deUint32 ELECTED_VALUE = 42;
-static const deUint32 UNELECTED_VALUE = 13;
+static const deUint32                  ELECTED_VALUE           = 42u;
+static const deUint32                  UNELECTED_VALUE         = 13u;
+static const vk::VkDeviceSize  SHADER_BUFFER_SIZE      = 16384ull; //maxUniformBufferRange 128*128
 
 static bool checkFragmentSubgroupElect(std::vector<const void*> datas,
                                                                           deUint32 width, deUint32 height, deUint32)
@@ -96,6 +97,60 @@ static bool checkFragmentSubgroupBarriers(std::vector<const void*> datas,
        return true;
 }
 
+static bool checkFragmentSubgroupBarriersNoSSBO(std::vector<const void*> datas,
+               deUint32 width, deUint32 height, deUint32)
+{
+       const float* const      resultData      = reinterpret_cast<const float*>(datas[0]);
+
+       for (deUint32 x = 0u; x < width; ++x)
+       {
+               for (deUint32 y = 0u; y < height; ++y)
+               {
+                       const deUint32 ndx = (x * height + y) * 4u;
+                       if (1.0f == resultData[ndx +2])
+                       {
+                               if(resultData[ndx] != resultData[ndx +1])
+                               {
+                                       return false;
+                               }
+                       }
+                       else if (resultData[ndx] != resultData[ndx +3])
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+static bool checkVertexPipelineStagesSubgroupElectNoSSBO(std::vector<const void*> datas,
+               deUint32 width, deUint32)
+{
+       const float* const      resultData                      = reinterpret_cast<const float*>(datas[0]);
+       float                           poisonValuesFound       = 0.0f;
+       float                           numSubgroupsUsed        = 0.0f;
+
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = static_cast<deUint32>(resultData[x * 2]);
+               numSubgroupsUsed += resultData[x * 2 + 1];
+
+               switch (val)
+               {
+                       default:
+                               // some garbage value was found!
+                               return false;
+                       case UNELECTED_VALUE:
+                               break;
+                       case ELECTED_VALUE:
+                               poisonValuesFound += 1.0f;
+                               break;
+               }
+       }
+       return numSubgroupsUsed == poisonValuesFound;
+}
+
 static bool checkVertexPipelineStagesSubgroupElect(std::vector<const void*> datas,
                deUint32 width, deUint32)
 {
@@ -148,6 +203,31 @@ static bool checkVertexPipelineStagesSubgroupBarriers(std::vector<const void*> d
        return true;
 }
 
+static bool checkVertexPipelineStagesSubgroupBarriersNoSSBO(std::vector<const void*> datas,
+               deUint32 width, deUint32)
+{
+       const float* const      resultData      = reinterpret_cast<const float*>(datas[0]);
+
+       for (deUint32 x = 0u; x < width; ++x)
+       {
+               const deUint32 ndx = x*4u;
+               if (1.0f == resultData[ndx +2])
+               {
+                       if(resultData[ndx] != resultData[ndx +1])
+                       {
+                               return false;
+                       }
+               }
+               else if (resultData[ndx] != resultData[ndx +3])
+               {
+                       return false;
+               }
+
+       }
+
+       return true;
+}
+
 static bool checkComputeSubgroupElect(std::vector<const void*> datas,
                                                                          const deUint32 numWorkgroups[3], const deUint32 localSize[3],
                                                                          deUint32)
@@ -288,10 +368,184 @@ std::string getOpTypeName(int opType)
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream                      vertexSrc;
+       std::ostringstream                      fragmentSrc;
+       if(VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               fragmentSrc     << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in vec4 in_color;\n"
+                       << "layout(location = 0) out vec4 out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = in_color;\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               programCollection.glslSources.add("vert") << glu::VertexSource(subgroups::getVertShaderForStage(caseDef.shaderStage));
+       }
+
+       if (OPTYPE_ELECT == caseDef.opType)
+       {
+               if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+               {
+                       vertexSrc       << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "layout(location = 0) out vec4 out_color;\n"
+                               << "layout(location = 0) in highp vec4 in_position;\n"
+                               << "\n"
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    out_color.r = " << ELECTED_VALUE << ";\n"
+                               << "    out_color.g = 1.0f;\n"
+                               << "  }\n"
+                               << "  else\n"
+                               << "  {\n"
+                               << "    out_color.r = " << UNELECTED_VALUE << ";\n"
+                               << "    out_color.g = 0.0f;\n"
+                               << "  }\n"
+                               << "  gl_Position = in_position;\n"
+                               << "}\n";
+                       programCollection.glslSources.add("vert")
+                                       << glu::VertexSource(vertexSrc.str());
+               }
+               else
+               {
+                       DE_FATAL("Unsupported shader stage");
+               }
+       }
+       else
+       {
+               std::ostringstream bdy;
+               switch (caseDef.opType)
+               {
+                       default:
+                               DE_FATAL("Unhandled op type!");
+                       case OPTYPE_SUBGROUP_BARRIER:
+                       case OPTYPE_SUBGROUP_MEMORY_BARRIER:
+                       case OPTYPE_SUBGROUP_MEMORY_BARRIER_BUFFER:
+                               bdy << " tempResult2 = tempBuffer[id];\n"
+                                       << "  if (subgroupElect())\n"
+                                       << "  {\n"
+                                       << "    tempResult = value;\n"
+                                       << "    out_color.b = 1.0f;\n"
+                                       << "  }\n"
+                                        << "  else\n"
+                                       << "  {\n"
+                                       << "    tempResult = tempBuffer[id];\n"
+                                       << "  }\n"
+                                       << "  " << getOpTypeName(caseDef.opType) << "();\n";
+                               break;
+                       case OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE:
+                               bdy <<"tempResult2 = imageLoad(tempImage, ivec2(id, 0)).x;\n"
+                                       << "  if (subgroupElect())\n"
+                                       << "  {\n"
+                                       << "    tempResult = value;\n"
+                                       << "    out_color.b = 1.0f;\n"
+                                       << "  }\n"
+                                       << "  else\n"
+                                       << "  {\n"
+                                       << "    tempResult = imageLoad(tempImage, ivec2(id, 0)).x;\n"
+                                       << "  }\n"
+                                       << "  subgroupMemoryBarrierImage();\n";
+
+                               break;
+               }
+
+               if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+               {
+                       fragmentSrc     << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                               << "layout(location = 0) out vec4 out_color;\n"
+                               << "\n"
+                               << "layout(set = 0, binding = 0) uniform Buffer1\n"
+                               << "{\n"
+                               << "  uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
+                               << "};\n"
+                               << "\n"
+                               << "layout(set = 0, binding = 1) uniform Buffer2\n"
+                               << "{\n"
+                               << "  uint value;\n"
+                               << "};\n"
+                               << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(set = 0, binding = 2, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  if (gl_HelperInvocation) return;\n"
+                               << "  uint id = 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    id = uint(gl_FragCoord.x*100.0f);\n"
+                               << "  }\n"
+                               << "  id = subgroupBroadcastFirst(id);\n"
+                               << "  uint localId = id;\n"
+                               << "  uint tempResult = 0u;\n"
+                               << "  uint tempResult2 = 0u;\n"
+                               << "  out_color.b = 0.0f;\n"
+                               << bdy.str()
+                               << "  out_color.r = float(tempResult);\n"
+                               << "  out_color.g = float(value);\n"
+                               << "  out_color.a = float(tempResult2);\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+               }
+               else if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+               {
+                       vertexSrc       << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                               << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                               << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                               <<"\n"
+                               << "layout(location = 0) out vec4 out_color;\n"
+                               << "layout(location = 0) in highp vec4 in_position;\n"
+                               << "\n"
+                               << "layout(set = 0, binding = 0) uniform Buffer1\n"
+                               << "{\n"
+                               << "  uint tempBuffer["<<SHADER_BUFFER_SIZE/4ull<<"];\n"
+                               << "};\n"
+                               << "\n"
+                               << "layout(set = 0, binding = 1) uniform Buffer2\n"
+                               << "{\n"
+                               << "  uint value;\n"
+                               << "};\n"
+                               << (OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? "layout(set = 0, binding = 2, r32ui) readonly uniform highp uimage2D tempImage;\n" : "\n")
+                               << "void main (void)\n"
+                               << "{\n"
+                               << "  uint id = 0;\n"
+                               << "  if (subgroupElect())\n"
+                               << "  {\n"
+                               << "    id = gl_VertexIndex;\n"
+                               << "  }\n"
+                               << "  id = subgroupBroadcastFirst(id);\n"
+                               << "  uint tempResult = 0u;\n"
+                               << "  uint tempResult2 = 0u;\n"
+                               << "  out_color.b = 0.0f;\n"
+                               << bdy.str()
+                               << "  out_color.r = float(tempResult);\n"
+                               << "  out_color.g = float(value);\n"
+                               << "  out_color.a = float(tempResult2);\n"
+                               << "  gl_Position = in_position;\n"
+                               << "}\n";
+
+                       programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str());
+               }
+               else
+               {
+                       DE_FATAL("Unsupported shader stage");
+               }
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        if (OPTYPE_ELECT == caseDef.opType)
@@ -846,6 +1100,68 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                                   " is a required capability!");
        }
 
+       //Tests which don't use the SSBO
+       if(caseDef.noSSBO)
+       {
+               if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+               {
+                       if (OPTYPE_ELECT == caseDef.opType)
+                       {
+                               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32G32_SFLOAT,
+                                                                                                DE_NULL, 0u, checkVertexPipelineStagesSubgroupElectNoSSBO);
+                       }
+                       else
+                       {
+                               const deUint32                                          inputDatasCount = OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? 3u : 2u;
+                               std::vector<subgroups::SSBOData>        inputDatas              (inputDatasCount);
+
+                               inputDatas[0].format = VK_FORMAT_R32_UINT;
+                               inputDatas[0].numElements = SHADER_BUFFER_SIZE/4ull;
+                               inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                               inputDatas[1].format = VK_FORMAT_R32_UINT;
+                               inputDatas[1].numElements = 1ull;
+                               inputDatas[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                               if(OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType )
+                               {
+                                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                                       inputDatas[2].numElements = SHADER_BUFFER_SIZE;
+                                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNone;
+                                       inputDatas[2].isImage = true;
+                               }
+
+                               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32G32B32A32_SFLOAT,
+                                                                                                &inputDatas[0], inputDatasCount, checkVertexPipelineStagesSubgroupBarriersNoSSBO);
+                       }
+               }
+
+               if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+               {
+                               const deUint32                                          inputDatasCount = OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType ? 3u : 2u;
+                               std::vector<subgroups::SSBOData>        inputDatas              (inputDatasCount);
+
+                               inputDatas[0].format = VK_FORMAT_R32_UINT;
+                               inputDatas[0].numElements = SHADER_BUFFER_SIZE/4ull;
+                               inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                               inputDatas[1].format = VK_FORMAT_R32_UINT;
+                               inputDatas[1].numElements = 1ull;
+                               inputDatas[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                               if(OPTYPE_SUBGROUP_MEMORY_BARRIER_IMAGE == caseDef.opType )
+                               {
+                                       inputDatas[2].format = VK_FORMAT_R32_UINT;
+                                       inputDatas[2].numElements = SHADER_BUFFER_SIZE;
+                                       inputDatas[2].initializeType = subgroups::SSBOData::InitializeNone;
+                                       inputDatas[2].isImage = true;
+                               }
+
+                       return subgroups::makeFragmentFrameBufferTest(context, VK_FORMAT_R32G32B32A32_SFLOAT,
+                                                                                          &inputDatas[0], inputDatasCount, checkFragmentSubgroupBarriersNoSSBO);
+               }
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -885,7 +1201,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        const deUint32 inputDatasCount = 4;
                        subgroups::SSBOData inputDatas[inputDatasCount];
                        inputDatas[0].format = VK_FORMAT_R32_UINT;
-                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[1].format = VK_FORMAT_R32_UINT;
@@ -897,7 +1213,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[3].format = VK_FORMAT_R32_UINT;
-                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
                        inputDatas[3].isImage = true;
 
@@ -918,7 +1234,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        const deUint32 inputDatasCount = 3;
                        subgroups::SSBOData inputDatas[inputDatasCount];
                        inputDatas[0].format = VK_FORMAT_R32_UINT;
-                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[0].initializeType = subgroups::SSBOData::InitializeNone;
 
                        inputDatas[1].format = VK_FORMAT_R32_UINT;
@@ -926,7 +1242,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        inputDatas[1].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[2].format = VK_FORMAT_R32_UINT;
-                       inputDatas[2].numElements = 128 * 128;
+                       inputDatas[2].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[2].initializeType = subgroups::SSBOData::InitializeNone;
                        inputDatas[2].isImage = true;
 
@@ -951,7 +1267,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        const deUint32 inputDatasCount = 4;
                        subgroups::SSBOData inputDatas[inputDatasCount];
                        inputDatas[0].format = VK_FORMAT_R32_UINT;
-                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[1].format = VK_FORMAT_R32_UINT;
@@ -963,7 +1279,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[3].format = VK_FORMAT_R32_UINT;
-                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
                        inputDatas[3].isImage = true;
 
@@ -988,7 +1304,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        const deUint32 inputDatasCount = 4;
                        subgroups::SSBOData inputDatas[inputDatasCount];
                        inputDatas[0].format = VK_FORMAT_R32_UINT;
-                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[1].format = VK_FORMAT_R32_UINT;
@@ -1000,7 +1316,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[3].format = VK_FORMAT_R32_UINT;
-                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
                        inputDatas[3].isImage = true;
 
@@ -1025,7 +1341,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        const deUint32 inputDatasCount = 4;
                        subgroups::SSBOData inputDatas[inputDatasCount];
                        inputDatas[0].format = VK_FORMAT_R32_UINT;
-                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[1].format = VK_FORMAT_R32_UINT;
@@ -1037,7 +1353,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[3].format = VK_FORMAT_R32_UINT;
-                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
                        inputDatas[3].isImage = true;
 
@@ -1062,7 +1378,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        const deUint32 inputDatasCount = 4;
                        subgroups::SSBOData inputDatas[inputDatasCount];
                        inputDatas[0].format = VK_FORMAT_R32_UINT;
-                       inputDatas[0].numElements = 128 * 128;
+                       inputDatas[0].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[0].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[1].format = VK_FORMAT_R32_UINT;
@@ -1074,7 +1390,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                        inputDatas[2].initializeType = subgroups::SSBOData::InitializeNonZero;
 
                        inputDatas[3].format = VK_FORMAT_R32_UINT;
-                       inputDatas[3].numElements = 128 * 128;
+                       inputDatas[3].numElements = SHADER_BUFFER_SIZE;
                        inputDatas[3].initializeType = subgroups::SSBOData::InitializeNone;
                        inputDatas[3].isImage = true;
 
@@ -1121,7 +1437,7 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
                                continue;
                        }
 
-                       CaseDefinition caseDef = {opTypeIndex, stage};
+                       CaseDefinition caseDef = {opTypeIndex, stage, false};
 
                        std::string op = getOpTypeName(opTypeIndex);
 
@@ -1129,6 +1445,18 @@ tcu::TestCaseGroup* createSubgroupsBasicTests(tcu::TestContext& testCtx)
                                                                                de::toLower(op) +
                                                                                "_" + getShaderStageName(stage), "",
                                                                                initPrograms, test, caseDef);
+
+                       if ((VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) & stage )
+                       {
+                               if (OPTYPE_ELECT != caseDef.opType || VK_SHADER_STAGE_FRAGMENT_BIT != stage)
+                               {
+                                       caseDef.noSSBO = true;
+                                       addFunctionCaseWithPrograms(group.get(),
+                                                               de::toLower(op) + "_" +
+                                                               getShaderStageName(stage)+"_framebuffer", "",
+                                                               initFrameBufferPrograms, test, caseDef);
+                               }
+                       }
                }
        }
 
index 009c679..50fcdb2 100644 (file)
@@ -36,6 +36,7 @@ namespace vkt
 {
 namespace subgroups
 {
+
 static bool checkVertexPipelineStages(std::vector<const void*> datas,
                                                                          deUint32 width, deUint32)
 {
@@ -131,12 +132,13 @@ namespace
 {
 struct CaseDefinition
 {
-       std::string varName;
-       VkShaderStageFlags shaderStage;
+       std::string                     varName;
+       VkShaderStageFlags      shaderStage;
+       bool                            noSSBO;
 };
 }
 
-void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+std::string subgroupMask (const CaseDefinition& caseDef)
 {
        std::ostringstream bdy;
 
@@ -183,6 +185,50 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
        }
 
        bdy << "  }\n";
+       return bdy.str();
+}
+
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream      vertexSrc;
+       std::ostringstream      fragmentSrc;
+       std::ostringstream      bdy;
+       bdy << subgroupMask(caseDef);
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               vertexSrc       << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                                       << "layout(location = 0) out float out_color;\n"
+                                       << "layout(location = 0) in highp vec4 in_position;\n"
+                                       << "\n"
+                                       << "void main (void)\n"
+                                       << "{\n"
+                                       << bdy.str()
+                                       << "  out_color = float(tempResult);\n"
+                                       << "  gl_Position = in_position;\n"
+                                       << "}\n";
+               programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str());
+
+               fragmentSrc     << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                                       << "layout(location = 0) in highp float in_color;\n"
+                                       << "layout(location = 0) out uint out_color;\n"
+                                       << "void main()\n"
+                                       <<"{\n"
+                                       << "    out_color = uint(in_color);\n"
+                                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
+void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+       bdy << subgroupMask(caseDef);
 
        if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
        {
@@ -359,6 +405,12 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               return makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -436,12 +488,21 @@ tcu::TestCaseGroup* createSubgroupsBuiltinMaskVarTests(tcu::TestContext& testCtx
                {
                        const std::string var = all_stages_vars[a];
 
-                       CaseDefinition caseDef = {"gl_" + var, stage};
+                       CaseDefinition caseDef = {"gl_" + var, stage, false};
 
                        addFunctionCaseWithPrograms(group.get(),
                                                                                de::toLower(var) + "_" +
                                                                                getShaderStageName(stage), "",
                                                                                initPrograms, test, caseDef);
+
+                       if (VK_SHADER_STAGE_VERTEX_BIT == stage)
+                       {
+                               caseDef.noSSBO = true;
+                               addFunctionCaseWithPrograms(group.get(),
+                                                       de::toLower(var) + "_" +
+                                                       getShaderStageName(stage)+"_framebuffer", "",
+                                                       initFrameBufferPrograms, test, caseDef);
+                       }
                }
        }
 
index 5070097..5b5b86c 100644 (file)
@@ -36,7 +36,8 @@ namespace vkt
 {
 namespace subgroups
 {
-static bool checkVertexPipelineStagesSubgroupSize(std::vector<const void*> datas,
+
+bool checkVertexPipelineStagesSubgroupSize(std::vector<const void*> datas,
                deUint32 width, deUint32 subgroupSize)
 {
        const deUint32* data =
@@ -54,8 +55,8 @@ static bool checkVertexPipelineStagesSubgroupSize(std::vector<const void*> datas
        return true;
 }
 
-static bool checkVertexPipelineStagesSubgroupInvocationID(
-       std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize)
+bool checkVertexPipelineStagesSubgroupInvocationID(std::vector<const void*> datas,
+               deUint32 width, deUint32 subgroupSize)
 {
        const deUint32* data =
                reinterpret_cast<const deUint32*>(datas[0]);
@@ -390,9 +391,44 @@ struct CaseDefinition
 {
        std::string varName;
        VkShaderStageFlags shaderStage;
+       bool noSSBO;
 };
 }
 
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream src;
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_basic: enable\n"
+                       << "layout(location = 0) out vec4 out_color;\n"
+                       << "layout(location = 0) in highp vec4 in_position;\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  out_color = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 1.0f, 1.0f);\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+
+               std::ostringstream source;
+               source  << glu::getGLSLVersionDeclaration(glu::GLSL_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";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(source.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
@@ -559,6 +595,21 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                }
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               if ("gl_SubgroupSize" == caseDef.varName)
+               {
+                       return makeVertexFrameBufferTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupSize);
+               }
+               else if ("gl_SubgroupInvocationID" == caseDef.varName)
+               {
+                       return makeVertexFrameBufferTest(
+                                          context, VK_FORMAT_R32G32B32A32_UINT, DE_NULL, 0, checkVertexPipelineStagesSubgroupInvocationID);
+               }
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -733,12 +784,21 @@ tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
                {
                        const std::string var = all_stages_vars[a];
 
-                       CaseDefinition caseDef = {"gl_" + var, stage};
+                       CaseDefinition caseDef = {"gl_" + var, stage, false};
 
                        addFunctionCaseWithPrograms(group.get(),
                                                                                de::toLower(var) + "_" +
                                                                                getShaderStageName(stage), "",
                                                                                initPrograms, test, caseDef);
+
+                       if (VK_SHADER_STAGE_VERTEX_BIT == stage)
+                       {
+                               caseDef.noSSBO = true;
+                               addFunctionCaseWithPrograms(group.get(),
+                                                       de::toLower(var) + "_" +
+                                                       getShaderStageName(stage)+"_framebuffer", "",
+                                                       initFrameBufferPrograms, test, caseDef);
+                       }
                }
        }
 
@@ -747,7 +807,7 @@ tcu::TestCaseGroup* createSubgroupsBuiltinVarTests(tcu::TestContext& testCtx)
                const VkShaderStageFlags stage = VK_SHADER_STAGE_COMPUTE_BIT;
                const std::string var = compute_only_vars[a];
 
-               CaseDefinition caseDef = {"gl_" + var, stage};
+               CaseDefinition caseDef = {"gl_" + var, stage, false};
 
                addFunctionCaseWithPrograms(group.get(), de::toLower(var) +
                                                                        "_" + getShaderStageName(stage), "",
index 8c8b388..0362dfe 100644 (file)
@@ -380,11 +380,89 @@ std::string getCompare(int opType, vk::VkFormat format, std::string lhs, std::st
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
-       VkFormat format;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       VkFormat                        format;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream bdy;
+
+       bdy << "  bool tempResult = true;\n";
+
+       for (deUint32 i = 1; i <= subgroups::maxSupportedSubgroupSize(); i *= 2)
+       {
+               bdy     << "  {\n"
+                       << "    const uint clusterSize = " << i << ";\n"
+                       << "    if (clusterSize <= gl_SubgroupSize)\n"
+                       << "    {\n"
+                       << "      " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) + "(data[gl_SubgroupInvocationID], clusterSize);\n"
+                       << "      for (uint clusterOffset = 0; clusterOffset < gl_SubgroupSize; clusterOffset += clusterSize)\n"
+                       << "      {\n"
+                       << "        " << subgroups::getFormatNameForGLSL(caseDef.format) << " ref = "
+                       << getIdentity(caseDef.opType, caseDef.format) << ";\n"
+                       << "        for (uint index = clusterOffset; index < (clusterOffset + clusterSize); index++)\n"
+                       << "        {\n"
+                       << "          if (subgroupBallotBitExtract(mask, index))\n"
+                       << "          {\n"
+                       << "            ref = " << getOpTypeOperation(caseDef.opType, caseDef.format, "ref", "data[index]") << ";\n"
+                       << "          }\n"
+                       << "        }\n"
+                       << "        if ((clusterOffset <= gl_SubgroupInvocationID) && (gl_SubgroupInvocationID < (clusterOffset + clusterSize)))\n"
+                       << "        {\n"
+                       << "          if (!" << getCompare(caseDef.opType, caseDef.format, "ref", "op") << ")\n"
+                       << "          {\n"
+                       << "            tempResult = false;\n"
+                       << "          }\n"
+                       << "        }\n"
+                       << "      }\n"
+                       << "    }\n"
+                       << "  }\n";
+       }
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream src;
+               std::ostringstream      fragmentSrc;
+
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450 )<< "\n"
+                       << "#extension GL_KHR_shader_subgroup_clustered: enable\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"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << bdy.str()
+                       << "  out_color = float(tempResult ? 1 : 0);\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float in_color;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(in_color);\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        std::ostringstream bdy;
@@ -465,7 +543,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                         << "#extension GL_KHR_shader_subgroup_clustered: enable\n"
                         << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
                         << "layout(location = 0) out uint result;\n"
-                        << "layout(set = 0, binding = 0, std430) buffer Buffer2\n"
+                        << "layout(set = 0, binding = 0, std430) readonly buffer Buffer2\n"
                         << "{\n"
                         << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
                         << "};\n"
@@ -641,6 +719,17 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData;
+               inputData.format = caseDef.format;
+               inputData.numElements = subgroups::maxSupportedSubgroupSize();
+               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -809,7 +898,7 @@ tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx)
                                        continue;
                                }
 
-                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+                               CaseDefinition caseDef = {opTypeIndex, stage, format, false};
 
                                std::ostringstream name;
 
@@ -821,6 +910,13 @@ tcu::TestCaseGroup* createSubgroupsClusteredTests(tcu::TestContext& testCtx)
 
                                addFunctionCaseWithPrograms(group.get(), name.str(),
                                                                                        "", initPrograms, test, caseDef);
+
+                               if (VK_SHADER_STAGE_VERTEX_BIT == stage)
+                               {
+                                       caseDef.noSSBO = true;
+                                       addFunctionCaseWithPrograms(group.get(), name.str()+"_framebuffer", "",
+                                                                                               initFrameBufferPrograms, test, caseDef);
+                               }
                        }
                }
        }
index 60c1c12..3725b8d 100644 (file)
@@ -155,12 +155,83 @@ std::string getOpTypeName(int opType)
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
-       VkFormat format;
-       int direction;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       VkFormat                        format;
+       int                                     direction;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string swapTable[OPTYPE_LAST];
+       swapTable[OPTYPE_QUAD_BROADCAST] = "";
+       swapTable[OPTYPE_QUAD_SWAP_HORIZONTAL] = "  const uint swapTable[4] = {1, 0, 3, 2};\n";
+       swapTable[OPTYPE_QUAD_SWAP_VERTICAL] = "  const uint swapTable[4] = {2, 3, 0, 1};\n";
+       swapTable[OPTYPE_QUAD_SWAP_DIAGONAL] = "  const uint swapTable[4] = {3, 2, 1, 0};\n";
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream      src;
+               std::ostringstream      fragmentSrc;
+
+               src << "#version 450\n"
+                       << "#extension GL_KHR_shader_subgroup_quad: enable\n"
+                       << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(location = 0) in highp vec4 in_position;\n"
+                       << "layout(location = 0) out float result;\n"
+                       << "layout(set = 0, binding = 0) uniform Buffer1\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << swapTable[caseDef.opType];
+
+               if (OPTYPE_QUAD_BROADCAST == caseDef.opType)
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID], " << caseDef.direction << ");\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + " << caseDef.direction << ";\n";
+               }
+               else
+               {
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                               << getOpTypeName(caseDef.opType) << "(data[gl_SubgroupInvocationID]);\n"
+                               << "  uint otherID = (gl_SubgroupInvocationID & ~0x3) + swapTable[gl_SubgroupInvocationID & 0x3];\n";
+               }
+
+               src << "  if (subgroupBallotBitExtract(mask, otherID))\n"
+                       << "  {\n"
+                       << "    result = (op == data[otherID]) ? 1.0f : 0.0f;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result = 1.0f; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float result;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(result);\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        std::string swapTable[OPTYPE_LAST];
@@ -234,7 +305,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 = 0, std430) buffer Buffer2\n"
+                        << "layout(set = 0, binding = 0, std430) readonly buffer Buffer2\n"
                         << "{\n"
                         << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
                         << "};\n"
@@ -516,6 +587,17 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+                       subgroups::SSBOData inputData;
+                       inputData.format = caseDef.format;
+                       inputData.numElements = subgroups::maxSupportedSubgroupSize();
+                       inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -636,7 +718,7 @@ tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx)
 
                                for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
                                {
-                                       CaseDefinition caseDef = {opTypeIndex, stage, format, direction};
+                                       CaseDefinition caseDef = {opTypeIndex, stage, format, direction, false};
 
                                        std::ostringstream name;
 
@@ -662,6 +744,14 @@ tcu::TestCaseGroup* createSubgroupsQuadTests(tcu::TestContext& testCtx)
 
                                        addFunctionCaseWithPrograms(group.get(), name.str(),
                                                                                                "", initPrograms, test, caseDef);
+
+                                       if (VK_SHADER_STAGE_VERTEX_BIT == stage )
+                                       {
+                                               caseDef.noSSBO = true;
+                                               addFunctionCaseWithPrograms(group.get(), name.str()+"_framebuffer", "",
+                                                                                                       initFrameBufferPrograms, test, caseDef);
+                                       }
+
                                }
                        }
                }
index e1e7fe9..0ab03d1 100644 (file)
@@ -148,10 +148,107 @@ std::string getOpTypeName(int opType)
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string extension = (OPTYPE_CLUSTERED == caseDef.opType) ?
+                                                       "#extension GL_KHR_shader_subgroup_clustered: enable\n" :
+                                                       "#extension GL_KHR_shader_subgroup_quad: enable\n";
+
+       extension += "#extension GL_KHR_shader_subgroup_ballot: enable\n";
+
+       std::ostringstream bdy;
+
+       bdy << "  uint tempResult = 0x1;\n"
+               << "  uvec4 mask = subgroupBallot(true);\n";
+
+       if (OPTYPE_CLUSTERED == caseDef.opType)
+       {
+               for (deUint32 i = 1; i <= subgroups::maxSupportedSubgroupSize(); i *= 2)
+               {
+                       bdy << "  if (gl_SubgroupSize >= " << i << ")\n"
+                               << "  {\n"
+                               << "    uvec4 contribution = uvec4(0);\n"
+                               << "    const uint modID = gl_SubgroupInvocationID % 32;\n"
+                               << "    switch (gl_SubgroupInvocationID / 32)\n"
+                               << "    {\n"
+                               << "    case 0: contribution.x = 1 << modID; break;\n"
+                               << "    case 1: contribution.y = 1 << modID; break;\n"
+                               << "    case 2: contribution.z = 1 << modID; break;\n"
+                               << "    case 3: contribution.w = 1 << modID; break;\n"
+                               << "    }\n"
+                               << "    uvec4 result = subgroupClusteredOr(contribution, " << i << ");\n"
+                               << "    uint rootID = gl_SubgroupInvocationID & ~(" << i - 1 << ");\n"
+                               << "    for (uint i = 0; i < " << i << "; i++)\n"
+                               << "    {\n"
+                               << "      uint nextID = rootID + i;\n"
+                               << "      if (subgroupBallotBitExtract(mask, nextID) ^^ subgroupBallotBitExtract(result, nextID))\n"
+                               << "      {\n"
+                               << "        tempResult = 0;\n"
+                               << "      }\n"
+                               << "    }\n"
+                               << "  }\n";
+               }
+       }
+       else
+       {
+               bdy << "  uint cluster[4] =\n"
+                       << "  {\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 0),\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 1),\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 2),\n"
+                       << "    subgroupQuadBroadcast(gl_SubgroupInvocationID, 3)\n"
+                       << "  };\n"
+                       << "  uint rootID = gl_SubgroupInvocationID & ~0x3;\n"
+                       << "  for (uint i = 0; i < 4; i++)\n"
+                       << "  {\n"
+                       << "    uint nextID = rootID + i;\n"
+                       << "    if (subgroupBallotBitExtract(mask, nextID) && (cluster[i] != nextID))\n"
+                       << "    {\n"
+                       << "      tempResult = mask.x;\n"
+                       << "    }\n"
+                       << "  }\n";
+       }
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream      src;
+               std::ostringstream      fragmentSrc;
+
+               src << "#version 450\n"
+                       << extension
+                       << "layout(location = 0) in highp vec4 in_position;\n"
+                       << "layout(location = 0) out float result;\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << bdy.str()
+                       << "  result = float(tempResult);\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float result;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(result);\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        std::string extension = (OPTYPE_CLUSTERED == caseDef.opType) ?
@@ -393,15 +490,6 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                                   " is a required capability!");
        }
 
-       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
-                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
-       {
-               if (!subgroups::isVertexSSBOSupportedForDevice(context))
-               {
-                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
-               }
-       }
-
        if (!subgroups::isSubgroupFeatureSupportedForDevice(context, VK_SUBGROUP_FEATURE_BALLOT_BIT))
        {
                TCU_THROW(NotSupportedError, "Device does not support subgroup ballot operations");
@@ -423,6 +511,21 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                }
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+                       return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, DE_NULL, 0, checkVertexPipelineStages);
+       }
+
+       if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
+                       (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
+       {
+               if (!subgroups::isVertexSSBOSupportedForDevice(context))
+               {
+                       TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes");
+               }
+       }
+
        if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
        {
                return subgroups::makeFragmentTest(context, VK_FORMAT_R32_UINT,
@@ -485,13 +588,20 @@ tcu::TestCaseGroup* createSubgroupsShapeTests(tcu::TestContext& testCtx)
 
                for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
                {
-                       CaseDefinition caseDef = {opTypeIndex, stage};
+                       CaseDefinition caseDef = {opTypeIndex, stage, false};
 
                        std::string op = getOpTypeName(opTypeIndex);
 
                        addFunctionCaseWithPrograms(group.get(),
                                                                                de::toLower(op) + "_" + getShaderStageName(stage), "",
                                                                                initPrograms, test, caseDef);
+
+                       if (VK_SHADER_STAGE_VERTEX_BIT & stage )
+                       {
+                               caseDef.noSSBO = true;
+                               addFunctionCaseWithPrograms(group.get(), de::toLower(op) + "_" + getShaderStageName(stage) + "_framebuffer", "",
+                                                                                       initFrameBufferPrograms, test, caseDef);
+                       }
                }
        }
 
index 0030895..ada18f5 100644 (file)
@@ -155,11 +155,84 @@ std::string getOpTypeName(int opType)
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
-       VkFormat format;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       VkFormat                        format;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::string idTable[OPTYPE_LAST];
+       idTable[OPTYPE_SHUFFLE]                 = "data2[gl_SubgroupInvocationID]";
+       idTable[OPTYPE_SHUFFLE_XOR]             = "gl_SubgroupInvocationID ^ data2[gl_SubgroupInvocationID]";
+       idTable[OPTYPE_SHUFFLE_UP]              = "gl_SubgroupInvocationID - data2[gl_SubgroupInvocationID]";
+       idTable[OPTYPE_SHUFFLE_DOWN]    = "gl_SubgroupInvocationID + data2[gl_SubgroupInvocationID]";
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               std::ostringstream      src;
+               std::ostringstream      fragmentSrc;
+
+               src << "#version 450\n"
+                       << "layout(location = 0) in highp vec4 in_position;\n"
+                       << "layout(location = 0) out float result;\n";
+
+               switch (caseDef.opType)
+               {
+                       case OPTYPE_SHUFFLE:
+                       case OPTYPE_SHUFFLE_XOR:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle: enable\n";
+                               break;
+                       default:
+                               src << "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n";
+                               break;
+               }
+
+               src     << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       << "layout(set = 0, binding = 0) uniform Buffer1\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "layout(set = 0, binding = 1) uniform Buffer2\n"
+                       << "{\n"
+                       << "  uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uvec4 mask = subgroupBallot(true);\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " op = "
+                       << getOpTypeName(caseDef.opType) << "(data1[gl_SubgroupInvocationID], data2[gl_SubgroupInvocationID]);\n"
+                       << "  uint id = " << idTable[caseDef.opType] << ";\n"
+                       << "  if ((0 <= id) && (id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n"
+                       << "  {\n"
+                       << "    result = (op == data1[id]) ? 1.0f : 0.0f;\n"
+                       << "  }\n"
+                       << "  else\n"
+                       << "  {\n"
+                       << "    result = 1.0f; // Invocation we read from was inactive, so we can't verify results!\n"
+                       << "  }\n"
+                       << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in float result;\n"
+                       << "layout(location = 0) out uint out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = uint(result);\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        std::string idTable[OPTYPE_LAST];
@@ -246,11 +319,11 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 
                frag << "#extension GL_KHR_shader_subgroup_ballot: enable\n"
                         << "layout(location = 0) out uint result;\n"
-                        << "layout(set = 0, binding = 0, std430) buffer Buffer1\n"
+                        << "layout(set = 0, binding = 0, std430) readonly buffer Buffer1\n"
                         << "{\n"
                         << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[];\n"
                         << "};\n"
-                        << "layout(set = 0, binding = 1, std430) buffer Buffer2\n"
+                        << "layout(set = 0, binding = 1, std430) readonly buffer Buffer2\n"
                         << "{\n"
                         << "  uint data2[];\n"
                         << "};\n"
@@ -543,6 +616,21 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO && VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               subgroups::SSBOData inputData[2];
+               inputData[0].format = caseDef.format;
+               inputData[0].numElements = subgroups::maxSupportedSubgroupSize();
+               inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               inputData[1].format = VK_FORMAT_R32_UINT;
+               inputData[1].numElements = inputData[0].numElements;
+               inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero;
+
+               return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT,  inputData, 2, checkVertexPipelineStages);
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -640,7 +728,7 @@ tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx)
 
                        for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex)
                        {
-                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+                               CaseDefinition caseDef = {opTypeIndex, stage, format, false};
 
                                std::ostringstream name;
 
@@ -652,6 +740,13 @@ tcu::TestCaseGroup* createSubgroupsShuffleTests(tcu::TestContext& testCtx)
 
                                addFunctionCaseWithPrograms(group.get(), name.str(),
                                                                                        "", initPrograms, test, caseDef);
+
+                               if (VK_SHADER_STAGE_VERTEX_BIT == stage )
+                               {
+                                       caseDef.noSSBO = true;
+                                       addFunctionCaseWithPrograms(group.get(), name.str()+"_framebuffer", "",
+                                                                                               initFrameBufferPrograms, test, caseDef);
+                               }
                        }
                }
        }
index b410159..fcd7ccd 100644 (file)
@@ -25,6 +25,7 @@
 #include "vktSubgroupsTestsUtils.hpp"
 #include "deRandom.hpp"
 #include "tcuCommandLine.hpp"
+#include "vkImageUtil.hpp"
 
 using namespace tcu;
 using namespace std;
@@ -152,16 +153,20 @@ Move<VkFramebuffer> makeFramebuffer(Context& context,
                                                         &framebufferCreateInfo);
 }
 
-Move<VkPipeline> makeGraphicsPipeline(Context& context,
-                                                                         const VkPipelineLayout pipelineLayout,
-                                                                         const VkShaderStageFlags stages,
-                                                                         const VkShaderModule vertexShaderModule,
-                                                                         const VkShaderModule fragmentShaderModule,
-                                                                         const VkShaderModule geometryShaderModule,
-                                                                         const VkShaderModule tessellationControlModule,
-                                                                         const VkShaderModule tessellationEvaluationModule,
-                                                                         const VkRenderPass renderPass,
-                                                                         const VkPrimitiveTopology topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
+Move<VkPipeline> makeGraphicsPipeline(Context&                                                                 context,
+                                                                         const VkPipelineLayout                                        pipelineLayout,
+                                                                         const VkShaderStageFlags                                      stages,
+                                                                         const VkShaderModule                                          vertexShaderModule,
+                                                                         const VkShaderModule                                          fragmentShaderModule,
+                                                                         const VkShaderModule                                          geometryShaderModule,
+                                                                         const VkShaderModule                                          tessellationControlModule,
+                                                                         const VkShaderModule                                          tessellationEvaluationModule,
+                                                                         const VkRenderPass                                            renderPass,
+                                                                         const VkPrimitiveTopology                                     topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
+                                                                         const VkVertexInputBindingDescription*        vertexInputBindingDescription = DE_NULL,
+                                                                         const VkVertexInputAttributeDescription*      vertexInputAttributeDescriptions = DE_NULL,
+                                                                         const vk::VkFormat                                            attachmentFormat = VK_FORMAT_R32G32B32A32_SFLOAT
+                                                                         )
 {
        const VkBool32 disableRasterization = !(VK_SHADER_STAGE_FRAGMENT_BIT & stages);
        std::vector<vk::VkPipelineShaderStageCreateInfo> pipelineShaderStageParams;
@@ -174,7 +179,7 @@ Move<VkPipeline> makeGraphicsPipeline(Context& context,
                                VK_SHADER_STAGE_VERTEX_BIT,                                                     // VkShaderStageFlagBits                        stage
                                vertexShaderModule,                                                                     // VkShaderModule                                       module
                                "main",                                                                                         // const char*                                          pName
-                               DE_NULL                                                                                         // const VkSpecializationInfo*      pSpecializationInfo
+                               DE_NULL                                                                                         // const VkSpecializationInfo*          pSpecializationInfo
                };
                pipelineShaderStageParams.push_back(stageCreateInfo);
        }
@@ -241,8 +246,13 @@ Move<VkPipeline> makeGraphicsPipeline(Context& context,
 
        const VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo =
        {
-               VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, DE_NULL, 0u,
-               0u, DE_NULL, 0u, DE_NULL,
+               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;
        };
 
        const VkPipelineTessellationStateCreateInfo tessellationStateCreateInfo =
@@ -291,11 +301,18 @@ Move<VkPipeline> makeGraphicsPipeline(Context& context,
                stencilOpState, 0.0f, 0.0f
        };
 
+       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;
+
        const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
        {
                VK_FALSE, VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD,
                VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD,
-               VK_COLOR_COMPONENT_R_BIT
+               colorComponent
        };
 
        const VkPipelineColorBlendStateCreateInfo colorBlendStateCreateInfo =
@@ -357,26 +374,24 @@ Move<VkPipeline> makeComputePipeline(Context& context,
 
        const vk::VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
        {
-               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType
-               // sType;
-               DE_NULL, // const void*              pNext;
-               0u,              // VkPipelineShaderStageCreateFlags   flags;
-               VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits        stage;
-               shaderModule,                            // VkShaderModule           module;
-               "main",                                          // const char*              pName;
-               &info, // const VkSpecializationInfo*      pSpecializationInfo;
+               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                      sType;
+               DE_NULL,                                                                                                // const void*                                          pNext;
+               0u,                                                                                                             // VkPipelineShaderStageCreateFlags     flags;
+               VK_SHADER_STAGE_COMPUTE_BIT,                                                    // VkShaderStageFlagBits                        stage;
+               shaderModule,                                                                                   // VkShaderModule                                       module;
+               "main",                                                                                                 // const char*                                          pName;
+               &info,                                                                                                  // const VkSpecializationInfo*          pSpecializationInfo;
        };
 
        const vk::VkComputePipelineCreateInfo pipelineCreateInfo =
        {
-               VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType
-               // sType;
-               DE_NULL,                                   // const void*            pNext;
-               0u,                                                // VkPipelineCreateFlags      flags;
-               pipelineShaderStageParams, // VkPipelineShaderStageCreateInfo  stage;
-               pipelineLayout,                    // VkPipelineLayout         layout;
-               DE_NULL,                                   // VkPipeline           basePipelineHandle;
-               0,                                                 // deInt32              basePipelineIndex;
+               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(),
@@ -420,12 +435,11 @@ Move<VkCommandBuffer> makeCommandBuffer(
 {
        const VkCommandBufferAllocateInfo bufferAllocateParams =
        {
-               VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType
-               // sType;
-               DE_NULL,                                                 // const void*        pNext;
-               commandPool,                                     // VkCommandPool      commandPool;
-               VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel   level;
-               1u,                                                              // deUint32         bufferCount;
+               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);
@@ -435,9 +449,9 @@ void beginCommandBuffer(Context& context, const VkCommandBuffer commandBuffer)
 {
        const VkCommandBufferBeginInfo commandBufBeginParams =
        {
-               VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
-               DE_NULL, // const void*            pNext;
-               0u,              // VkCommandBufferUsageFlags    flags;
+               VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,            // VkStructureType                              sType;
+               DE_NULL,                                                                                        // const void*                                  pNext;
+               0u,                                                                                                     // VkCommandBufferUsageFlags    flags;
                (const VkCommandBufferInheritanceInfo*)DE_NULL,
        };
        VK_CHECK(context.getDeviceInterface().beginCommandBuffer(
@@ -510,7 +524,7 @@ struct BufferOrImage
                return reinterpret_cast<Image*>(this);
        }
 
-       VkDescriptorType getType() const
+       virtual VkDescriptorType getType() const
        {
                if (m_isImage)
                {
@@ -540,7 +554,9 @@ struct Buffer : public BufferOrImage
 {
        explicit Buffer(
                Context& context, VkDeviceSize sizeInBytes, VkBufferUsageFlags usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
-               : BufferOrImage(false), m_sizeInBytes(sizeInBytes)
+               : BufferOrImage         (false)
+               , m_sizeInBytes         (sizeInBytes)
+               , m_usage                       (usage)
        {
                const vk::VkBufferCreateInfo bufferCreateInfo =
                {
@@ -548,7 +564,7 @@ struct Buffer : public BufferOrImage
                        DE_NULL,
                        0u,
                        sizeInBytes,
-                       usage,
+                       m_usage,
                        VK_SHARING_MODE_EXCLUSIVE,
                        0u,
                        DE_NULL,
@@ -565,18 +581,31 @@ struct Buffer : public BufferOrImage
                                         m_allocation->getOffset()));
        }
 
+       virtual VkDescriptorType getType() const
+       {
+               if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT == m_usage)
+               {
+                       return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+               }
+               return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+       }
+
        VkBuffer getBuffer() const {
                return *m_buffer;
        }
 
+       const VkBuffer* getBufferPtr() const {
+               return &(*m_buffer);
+       }
 
        VkDeviceSize getSize() const {
                return m_sizeInBytes;
        }
 
 private:
-       Move<VkBuffer> m_buffer;
-       VkDeviceSize m_sizeInBytes;
+       Move<VkBuffer>                          m_buffer;
+       VkDeviceSize                            m_sizeInBytes;
+       const VkBufferUsageFlags        m_usage;
 };
 
 struct Image : public BufferOrImage
@@ -1623,6 +1652,293 @@ tcu::TestStatus vkt::subgroups::makeGeometryTest(
        return tcu::TestStatus::pass("OK");
 }
 
+VkImageMemoryBarrier makeImageMemoryBarrier    (const VkAccessFlags                    srcAccessMask,
+                                                                                        const VkAccessFlags                    dstAccessMask,
+                                                                                        const VkImageLayout                    oldLayout,
+                                                                                        const VkImageLayout                    newLayout,
+                                                                                        const VkImage                                  image,
+                                                                                        const VkImageSubresourceRange  subresourceRange)
+{
+       const VkImageMemoryBarrier barrier =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                 // VkStructureType                      sType;
+               DE_NULL,                                                                                // const void*                          pNext;
+               srcAccessMask,                                                                  // VkAccessFlags                        outputMask;
+               dstAccessMask,                                                                  // VkAccessFlags                        inputMask;
+               oldLayout,                                                                              // VkImageLayout                        oldLayout;
+               newLayout,                                                                              // VkImageLayout                        newLayout;
+               VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     srcQueueFamilyIndex;
+               VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     destQueueFamilyIndex;
+               image,                                                                                  // VkImage                                      image;
+               subresourceRange,                                                               // VkImageSubresourceRange      subresourceRange;
+       };
+       return barrier;
+}
+
+VkBufferMemoryBarrier makeBufferMemoryBarrier (const VkAccessFlags     srcAccessMask,
+                                                                                          const VkAccessFlags  dstAccessMask,
+                                                                                          const VkBuffer               buffer,
+                                                                                          const VkDeviceSize   offset,
+                                                                                          const VkDeviceSize   bufferSizeBytes)
+{
+       const VkBufferMemoryBarrier barrier =
+       {
+               VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,        // VkStructureType      sType;
+               DE_NULL,                                                                        // const void*          pNext;
+               srcAccessMask,                                                          // VkAccessFlags        srcAccessMask;
+               dstAccessMask,                                                          // VkAccessFlags        dstAccessMask;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                     srcQueueFamilyIndex;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                     destQueueFamilyIndex;
+               buffer,                                                                         // VkBuffer                     buffer;
+               offset,                                                                         // VkDeviceSize         offset;
+               bufferSizeBytes,                                                        // VkDeviceSize         size;
+       };
+       return barrier;
+}
+
+tcu::TestStatus vkt::subgroups::makeVertexFrameBufferTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize))
+{
+       const deUint32                                                  maxWidth                                = 1024u;
+       vector<de::SharedPtr<BufferOrImage> >   inputBuffers                    (extraDataCount);
+       DescriptorSetLayoutBuilder                              layoutBuilder;
+       const Unique<VkShaderModule>                    vertexShaderModule              (createShaderModule
+                                                                                                                                               (context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule>                    fragmentShaderModule    (createShaderModule
+                                                                                                                                               (context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("fragment"), 0u));
+       const Unique<VkRenderPass>                              renderPass                              (makeRenderPass(context, format));
+
+       const VkVertexInputBindingDescription   vertexInputBinding              =
+       {
+               0u,                                                                                     // binding;
+               static_cast<deUint32>(sizeof(tcu::Vec4)),       // stride;
+               VK_VERTEX_INPUT_RATE_VERTEX                                     // inputRate
+       };
+
+       const VkVertexInputAttributeDescription vertexInputAttribute    =
+       {
+               0u,
+               0u,
+               VK_FORMAT_R32G32B32A32_SFLOAT,
+               0u
+       };
+
+       for (deUint32 i = 0u; i < extraDataCount; i++)
+       {
+               if (extraData[i].isImage)
+               {
+                       inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context, static_cast<deUint32>(extraData[i].numElements), 1u, extraData[i].format));
+               }
+               else
+               {
+                       vk::VkDeviceSize size = getFormatSizeInBytes(extraData[i].format) * extraData[i].numElements;
+                       inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT));
+               }
+               const Allocation& alloc = inputBuffers[i]->getAllocation();
+               initializeMemory(context, alloc, extraData[i]);
+       }
+
+       for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
+               layoutBuilder.addBinding(inputBuffers[ndx]->getType(), 1u, VK_SHADER_STAGE_VERTEX_BIT, DE_NULL);
+
+       const Unique<VkDescriptorSetLayout>             descriptorSetLayout             (layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkPipelineLayout>                  pipelineLayout                  (makePipelineLayout(context, *descriptorSetLayout));
+
+       const Unique<VkPipeline>                                pipeline                                (makeGraphicsPipeline(context, *pipelineLayout,
+                                                                                                                                               VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
+                                                                                                                                               *vertexShaderModule, *fragmentShaderModule,
+                                                                                                                                               DE_NULL, DE_NULL, DE_NULL,
+                                                                                                                                               *renderPass, VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
+                                                                                                                                               &vertexInputBinding, &vertexInputAttribute, format));
+       DescriptorPoolBuilder                                   poolBuilder;
+       DescriptorSetUpdateBuilder                              updateBuilder;
+
+
+       for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
+               poolBuilder.addType(inputBuffers[ndx]->getType());
+
+       Move <VkDescriptorPool>                                 descriptorPool;
+       Move <VkDescriptorSet>                                  descriptorSet;
+
+       if (extraDataCount > 0)
+       {
+               descriptorPool = poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                       VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+               descriptorSet = makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout);
+       }
+
+       for (deUint32 ndx = 0u; ndx < extraDataCount; ndx++)
+       {
+               const Allocation& alloc = inputBuffers[ndx]->getAllocation();
+               initializeMemory(context, alloc, extraData[ndx]);
+       }
+
+       for (deUint32 buffersNdx = 0u; buffersNdx < inputBuffers.size(); buffersNdx++)
+       {
+               if (inputBuffers[buffersNdx]->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
+               {
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[buffersNdx]->getAsBuffer()->getBuffer(),
+                                                                               0ull, inputBuffers[buffersNdx]->getAsBuffer()->getSize());
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                               DescriptorSetUpdateBuilder::Location::binding(buffersNdx),
+                                                                               inputBuffers[buffersNdx]->getType(), &info);
+               }
+       }
+       updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool>                             cmdPool                                 (makeCommandPool(context));
+
+       const deUint32                                                  subgroupSize                    = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer>                   cmdBuffer                               (makeCommandBuffer(context, *cmdPool));
+
+       const vk::VkDeviceSize                                  vertexBufferSize                = maxWidth * sizeof(tcu::Vec4);
+       Buffer                                                                  vertexBuffer                    (context, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+
+       unsigned                                                                totalIterations                 = 0u;
+       unsigned                                                                failedIterations                = 0u;
+
+       Image                                                                   discardableImage                (context, maxWidth, 1u, format, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+       {
+               const Allocation&               alloc                           = vertexBuffer.getAllocation();
+               std::vector<tcu::Vec4>  data                            (maxWidth, Vec4(1.0f, 1.0f, 1.0f, 1.0f));
+               const float                             pixelSize                       = 2.0f / static_cast<float>(maxWidth);
+               float                                   leftHandPosition        = -1.0f;
+
+               for(deUint32 ndx = 0u; ndx < maxWidth; ++ndx)
+               {
+                       data[ndx][0] = leftHandPosition + pixelSize / 2.0f;
+                       leftHandPosition += pixelSize;
+               }
+
+               deMemcpy(alloc.getHostPtr(), &data[0], maxWidth * sizeof(tcu::Vec4));
+               vk::flushMappedMemoryRange(context.getDeviceInterface(), context.getDevice(), alloc.getMemory(), alloc.getOffset(), vertexBufferSize);
+       }
+
+       for (deUint32 width = 1u; width < maxWidth; width++)
+       {
+               totalIterations++;
+               const Unique<VkFramebuffer>     framebuffer                     (makeFramebuffer(context, *renderPass, discardableImage.getImageView(), maxWidth, 1));
+               const VkClearValue                      clearValue                      = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+               const VkViewport                        viewport                        = {0.0f, 0.0f, static_cast<float>(maxWidth), 1.0f, 0.0f, 1.0f};
+               const VkRect2D                          scissor                         = {{0, 0}, {maxWidth, 1}};
+               const vk::VkDeviceSize          imageResultSize         = tcu::getPixelSize(vk::mapVkFormat(format)) * maxWidth;
+               Buffer                                          imageBufferResult       (context, imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+               const VkDeviceSize                      vertexBufferOffset      = 0u;
+
+               for (deUint32 ndx = 0u; ndx < inputBuffers.size(); ndx++)
+               {
+                       const Allocation& alloc = inputBuffers[ndx]->getAllocation();
+                       initializeMemory(context, alloc, extraData[ndx]);
+               }
+
+               const VkRenderPassBeginInfo     renderPassBeginInfo     =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, DE_NULL, *renderPass,
+                       *framebuffer, {{0, 0}, {maxWidth, 1}}, 1, &clearValue,
+               };
+
+               beginCommandBuffer(context, *cmdBuffer);
+               {
+                       context.getDeviceInterface().cmdSetViewport(
+                               *cmdBuffer, 0, 1, &viewport);
+
+                       context.getDeviceInterface().cmdSetScissor(
+                               *cmdBuffer, 0, 1, &scissor);
+
+                       context.getDeviceInterface().cmdBeginRenderPass(
+                               *cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+                       context.getDeviceInterface().cmdBindPipeline(
+                               *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+                       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);
+
+                       context.getDeviceInterface().cmdDraw(*cmdBuffer, width, 1u, 0u, 0u);
+
+                       context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
+
+                       const VkImageSubresourceRange   subresourceRange        =
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT,                                                                                      //VkImageAspectFlags    aspectMask
+                               0u,                                                                                                                                     //deUint32                              baseMipLevel
+                               1u,                                                                                                                                     //deUint32                              levelCount
+                               0u,                                                                                                                                     //deUint32                              baseArrayLayer
+                               1u                                                                                                                                      //deUint32                              layerCount
+                       };
+
+                       const VkBufferImageCopy                 copyRegion                      =
+                       {
+                               0ull,                                                                                                                           //      VkDeviceSize                            bufferOffset;
+                               0u,                                                                                                                                     //      deUint32                                        bufferRowLength;
+                               0u,                                                                                                                                     //      deUint32                                        bufferImageHeight;
+                               makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),      //      VkImageSubresourceLayers        imageSubresource;
+                               makeOffset3D(0, 0, 0),                                                                                          //      VkOffset3D                                      imageOffset;
+                               makeExtent3D(IVec3(maxWidth,1,1)),                                                                      //      VkExtent3D                                      imageExtent;
+                       };
+
+                       const VkImageMemoryBarrier prepareForTransferBarrier = makeImageMemoryBarrier(
+                                                                                                                                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
+                                                                                                                                       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+                                                                                                                                       discardableImage.getImage(), subresourceRange);
+
+                       const VkBufferMemoryBarrier copyBarrier = makeBufferMemoryBarrier(
+                                                                                                               VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
+                                                                                                               imageBufferResult.getBuffer(), 0ull, imageResultSize);
+
+                       context.getDeviceInterface().cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 0u, (const VkBufferMemoryBarrier*)DE_NULL, 1u, &prepareForTransferBarrier);
+                       context.getDeviceInterface().cmdCopyImageToBuffer(*cmdBuffer, discardableImage.getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, imageBufferResult.getBuffer(), 1u, &copyRegion);
+                       context.getDeviceInterface().cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, &copyBarrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
+
+                       endCommandBuffer(context, *cmdBuffer);
+                       Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+                       waitFence(context, fence);
+               }
+
+               {
+                       const Allocation& allocResult = imageBufferResult.getAllocation();
+                       invalidateMappedMemoryRange(context.getDeviceInterface(), context.getDevice(), allocResult.getMemory(), allocResult.getOffset(), imageResultSize);
+
+                       std::vector<const void*> datas;
+                       datas.push_back(allocResult.getHostPtr());
+                       if (!checkResult(datas, width, subgroupSize))
+                               failedIterations++;
+               }
+       }
+
+       if (0 < failedIterations)
+       {
+               context.getTestContext().getLog()
+                               << TestLog::Message << (totalIterations - failedIterations) << " / "
+                               << totalIterations << " values passed" << TestLog::EndMessage;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
 tcu::TestStatus vkt::subgroups::makeVertexTest(
        Context& context, VkFormat format, SSBOData* extraDatas,
        deUint32 extraDatasCount,
@@ -1804,7 +2120,6 @@ tcu::TestStatus vkt::subgroups::makeVertexTest(
                                datas.push_back(resultAlloc.getHostPtr());
                        }
                }
-
                if (!checkResult(datas, width, subgroupSize))
                {
                        failedIterations++;
@@ -1824,6 +2139,225 @@ tcu::TestStatus vkt::subgroups::makeVertexTest(
        return tcu::TestStatus::pass("OK");
 }
 
+tcu::TestStatus vkt::subgroups::makeFragmentFrameBufferTest    (Context& context, VkFormat format, SSBOData* extraDatas,
+       deUint32 extraDatasCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
+                                               deUint32 height, deUint32 subgroupSize))
+{
+       const Unique<VkShaderModule>                    vertexShaderModule              (createShaderModule
+                                                                                                                                               (context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule>                    fragmentShaderModule    (createShaderModule
+                                                                                                                                               (context.getDeviceInterface(), context.getDevice(), context.getBinaryCollection().get("fragment"), 0u));
+
+       std::vector< de::SharedPtr<BufferOrImage> > inputBuffers(extraDatasCount);
+
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               if (extraDatas[i].isImage)
+               {
+                       inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Image(context,
+                                                                               static_cast<deUint32>(extraDatas[i].numElements), 1, extraDatas[i].format));
+               }
+               else
+               {
+                       vk::VkDeviceSize size =
+                               getFormatSizeInBytes(extraDatas[i].format) * extraDatas[i].numElements;
+                       inputBuffers[i] = de::SharedPtr<BufferOrImage>(new Buffer(context, size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT));
+               }
+
+               const Allocation& alloc = inputBuffers[i]->getAllocation();
+               initializeMemory(context, alloc, extraDatas[i]);
+       }
+
+       DescriptorSetLayoutBuilder layoutBuilder;
+
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               layoutBuilder.addBinding(inputBuffers[i]->getType(), 1,
+                                                                VK_SHADER_STAGE_FRAGMENT_BIT, DE_NULL);
+       }
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               layoutBuilder.build(context.getDeviceInterface(), context.getDevice()));
+
+       const Unique<VkPipelineLayout> pipelineLayout(
+               makePipelineLayout(context, *descriptorSetLayout));
+
+       const Unique<VkRenderPass> renderPass(makeRenderPass(context, format));
+       const Unique<VkPipeline> pipeline(makeGraphicsPipeline(context, *pipelineLayout,
+                                                                         VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
+                                                                         *vertexShaderModule, *fragmentShaderModule, DE_NULL, DE_NULL, DE_NULL, *renderPass));
+
+       DescriptorPoolBuilder poolBuilder;
+
+       // To stop validation complaining, always add at least one type to pool.
+       poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               poolBuilder.addType(inputBuffers[i]->getType());
+       }
+
+       Move<VkDescriptorPool> descriptorPool;
+       // Create descriptor set
+       Move<VkDescriptorSet> descriptorSet;
+
+       if (extraDatasCount > 0)
+       {
+               descriptorPool = poolBuilder.build(context.getDeviceInterface(), context.getDevice(),
+                                                                                                       VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+
+               descriptorSet   = makeDescriptorSet(context, *descriptorPool, *descriptorSetLayout);
+       }
+
+       DescriptorSetUpdateBuilder updateBuilder;
+
+       for (deUint32 i = 0; i < extraDatasCount; i++)
+       {
+               if (inputBuffers[i]->isImage())
+               {
+                       VkDescriptorImageInfo info =
+                               makeDescriptorImageInfo(inputBuffers[i]->getAsImage()->getSampler(),
+                                                                               inputBuffers[i]->getAsImage()->getImageView(), VK_IMAGE_LAYOUT_GENERAL);
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+               else
+               {
+                       VkDescriptorBufferInfo info =
+                               makeDescriptorBufferInfo(inputBuffers[i]->getAsBuffer()->getBuffer(),
+                                                                                0ull, inputBuffers[i]->getAsBuffer()->getSize());
+
+                       updateBuilder.writeSingle(*descriptorSet,
+                                                                         DescriptorSetUpdateBuilder::Location::binding(i),
+                                                                         inputBuffers[i]->getType(), &info);
+               }
+       }
+
+       if (extraDatasCount > 0)
+               updateBuilder.update(context.getDeviceInterface(), context.getDevice());
+
+       const Unique<VkCommandPool> cmdPool(makeCommandPool(context));
+
+       const deUint32 subgroupSize = getSubgroupSize(context);
+
+       const Unique<VkCommandBuffer> cmdBuffer(
+               makeCommandBuffer(context, *cmdPool));
+
+       unsigned totalIterations = 0;
+       unsigned failedIterations = 0;
+
+       for (deUint32 width = 8; width <= subgroupSize; width *= 2)
+       {
+               for (deUint32 height = 8; height <= subgroupSize; height *= 2)
+               {
+                       totalIterations++;
+
+                       // re-init the data
+                       for (deUint32 i = 0; i < extraDatasCount; i++)
+                       {
+                               const Allocation& alloc = inputBuffers[i]->getAllocation();
+                               initializeMemory(context, alloc, extraDatas[i]);
+                       }
+
+                       VkDeviceSize formatSize = getFormatSizeInBytes(format);
+                       const VkDeviceSize resultImageSizeInBytes =
+                               width * height * formatSize;
+
+                       Image resultImage(context, width, height, format,
+                                                         VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                         VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+                       Buffer resultBuffer(context, resultImageSizeInBytes,
+                                                               VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+
+                       const Unique<VkFramebuffer> framebuffer(makeFramebuffer(context,
+                                                                                                       *renderPass, resultImage.getImageView(), width, height));
+
+                       const VkClearValue clearValue = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+
+                       const VkRenderPassBeginInfo renderPassBeginInfo = {
+                               VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, DE_NULL, *renderPass,
+                               *framebuffer, {{0, 0}, {width, height}}, 1, &clearValue,
+                       };
+
+                       beginCommandBuffer(context, *cmdBuffer);
+
+                       VkViewport viewport = {0.0f, 0.0f, static_cast<float>(width),
+                                                                  static_cast<float>(height), 0.0f, 1.0f
+                                                                 };
+
+                       context.getDeviceInterface().cmdSetViewport(
+                               *cmdBuffer, 0, 1, &viewport);
+
+                       VkRect2D scissor = {{0, 0}, {width, height}};
+
+                       context.getDeviceInterface().cmdSetScissor(
+                               *cmdBuffer, 0, 1, &scissor);
+
+                       context.getDeviceInterface().cmdBeginRenderPass(
+                               *cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+                       context.getDeviceInterface().cmdBindPipeline(
+                               *cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+                       if (extraDatasCount > 0)
+                       {
+                               context.getDeviceInterface().cmdBindDescriptorSets(*cmdBuffer,
+                                               VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u,
+                                               &descriptorSet.get(), 0u, DE_NULL);
+                       }
+
+                       context.getDeviceInterface().cmdDraw(*cmdBuffer, 3, 1, 0, 0);
+
+                       context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
+
+                       vk::VkBufferImageCopy region = {0, 0, 0,
+                               {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, {0, 0, 0},
+                               {width, height, 1}
+                       };
+                       context.getDeviceInterface().cmdCopyImageToBuffer(*cmdBuffer,
+                                       resultImage.getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+                                       resultBuffer.getBuffer(), 1, &region);
+
+                       endCommandBuffer(context, *cmdBuffer);
+
+                       Move<VkFence> fence(submitCommandBuffer(context, *cmdBuffer));
+
+                       waitFence(context, fence);
+
+                       std::vector<const void*> datas;
+                       {
+                               const Allocation& resultAlloc = resultBuffer.getAllocation();
+                               invalidateMappedMemoryRange(context.getDeviceInterface(),
+                                                                                       context.getDevice(), resultAlloc.getMemory(),
+                                                                                       resultAlloc.getOffset(), resultImageSizeInBytes);
+
+                               // we always have our result data first
+                               datas.push_back(resultAlloc.getHostPtr());
+                       }
+
+                       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;
+               return tcu::TestStatus::fail("Failed!");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
 tcu::TestStatus vkt::subgroups::makeFragmentTest(
        Context& context, VkFormat format, SSBOData* extraDatas,
        deUint32 extraDatasCount,
index 7689e08..cd81d49 100644 (file)
@@ -117,10 +117,19 @@ tcu::TestStatus makeGeometryTest(Context& context, vk::VkFormat format,
        SSBOData* extraData, deUint32 extraDataCount,
        bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
 
+tcu::TestStatus makeVertexFrameBufferTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
+
 tcu::TestStatus makeVertexTest(Context& context, vk::VkFormat format,
        SSBOData* extraData, deUint32 extraDataCount,
        bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
 
+tcu::TestStatus makeFragmentFrameBufferTest(Context& context, vk::VkFormat format,
+       SSBOData* extraData, deUint32 extraDataCount,
+       bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
+                                                                        deUint32 height, deUint32 subgroupSize));
+
 tcu::TestStatus makeFragmentTest(Context& context, vk::VkFormat format,
        SSBOData* extraData, deUint32 extraDataCount,
        bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
index d94ef3e..87fa6a9 100644 (file)
@@ -61,6 +61,24 @@ static bool checkVertexPipelineStages(std::vector<const void*> datas,
        return true;
 }
 
+static bool checkVertexPipelineStagesNoSSBO(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32)
+{
+       const float* data =
+               reinterpret_cast<const float*>(datas[0]);
+       for (deUint32 x = 0; x < width; ++x)
+       {
+               deUint32 val = static_cast<deUint32>(data[x]);
+
+               if (0x7 != val)
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
 static bool checkFragment(std::vector<const void*> datas, deUint32 width,
                                                  deUint32 height, deUint32)
 {
@@ -205,11 +223,81 @@ std::string getOpTypeName(int opType)
 
 struct CaseDefinition
 {
-       int opType;
-       VkShaderStageFlags shaderStage;
-       VkFormat format;
+       int                                     opType;
+       VkShaderStageFlags      shaderStage;
+       VkFormat                        format;
+       bool                            noSSBO;
 };
 
+void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
+{
+       std::ostringstream      vertexSrc;
+       std::ostringstream      fragmentSrc;
+
+       if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+       {
+               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) in highp vec4 in_position;\n"
+                       << "layout(set = 0, binding = 0) uniform Buffer1\n"
+                       << "{\n"
+                       << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "  uint result;\n";
+               if (OPTYPE_ALL == caseDef.opType)
+               {
+                       vertexSrc << " result = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result |= 0x4;\n"
+                               << "  out_color.r = float(result);\n";
+               }
+               else if (OPTYPE_ANY == caseDef.opType)
+               {
+                       vertexSrc << "  result = " << getOpTypeName(caseDef.opType)
+                               << "(true) ? 0x1 : 0;\n"
+                               << "  result |= " << getOpTypeName(caseDef.opType)
+                               << "(false) ? 0 : 0x2;\n"
+                               << "  result |= 0x4;\n"
+                               << "out_color.r = float(result);\n";
+               }
+               else if (OPTYPE_ALLEQUAL == caseDef.opType)
+               {
+                       vertexSrc << "  result = " << getOpTypeName(caseDef.opType) << "("
+                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                               << "  result |= " << getOpTypeName(caseDef.opType)
+                               << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               << "  if (subgroupElect()) result |= 0x2;\n"
+                               << "  result |= " << getOpTypeName(caseDef.opType)
+                               << "(data[0]) ? 0x4 : 0;\n"
+                               << "  out_color.x = float(result);\n";
+               }
+
+               vertexSrc << "  gl_Position = in_position;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str());
+
+               fragmentSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+                       << "layout(location = 0) in vec4 in_color;\n"
+                       << "layout(location = 0) out vec4 out_color;\n"
+                       << "void main()\n"
+                       <<"{\n"
+                       << "    out_color = in_color;\n"
+                       << "}\n";
+               programCollection.glslSources.add("fragment") << glu::FragmentSource(fragmentSrc.str());
+       }
+       else
+       {
+               DE_FATAL("Unsupported shader stage");
+       }
+}
+
 void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
 {
        if (VK_SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage)
@@ -279,7 +367,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                frag << "#version 450\n"
                         << "#extension GL_KHR_shader_subgroup_vote: enable\n"
                         << "layout(location = 0) out uint result;\n"
-                        << "layout(set = 0, binding = 0, std430) buffer Buffer2\n"
+                        << "layout(set = 0, binding = 0, std430) readonly buffer Buffer2\n"
                         << "{\n"
                         << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[];\n"
                         << "};\n"
@@ -576,6 +664,21 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                TCU_THROW(NotSupportedError, "Device does not support subgroup double operations");
        }
 
+       //Tests which don't use the SSBO
+       if (caseDef.noSSBO)
+       {
+               if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
+               {
+                       subgroups::SSBOData inputData;
+                       inputData.format = caseDef.format;
+                       inputData.numElements = subgroups::maxSupportedSubgroupSize();
+                       inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+
+                       return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_SFLOAT, &inputData,
+                                                                                        1, checkVertexPipelineStagesNoSSBO);
+               }
+       }
+
        if ((VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage) &&
                        (VK_SHADER_STAGE_COMPUTE_BIT != caseDef.shaderStage))
        {
@@ -701,7 +804,7 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
                                        continue;
                                }
 
-                               CaseDefinition caseDef = {opTypeIndex, stage, format};
+                               CaseDefinition caseDef = {opTypeIndex, stage, format, false};
 
                                std::string op = getOpTypeName(opTypeIndex);
 
@@ -710,6 +813,17 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
                                                                                        subgroups::getFormatNameForGLSL(format)
                                                                                        + "_" + getShaderStageName(stage),
                                                                                        "", initPrograms, test, caseDef);
+
+                               if (VK_SHADER_STAGE_VERTEX_BIT == stage )
+                               {
+                                       caseDef.noSSBO = true;
+                                       addFunctionCaseWithPrograms(group.get(),
+                                                               de::toLower(op) + "_" +
+                                                               subgroups::getFormatNameForGLSL(format)
+                                                               + "_" + getShaderStageName(stage)+"_framebuffer", "",
+                                                               initFrameBufferPrograms, test, caseDef);
+                               }
+
                        }
                }
        }
index e9d8bb6..127f4ad 100755 (executable)
@@ -247359,7 +247359,9 @@ dEQP-VK.subgroups.builtin_var.subgroupinvocationid_tess_control
 dEQP-VK.subgroups.builtin_var.subgroupsize_geometry
 dEQP-VK.subgroups.builtin_var.subgroupinvocationid_geometry
 dEQP-VK.subgroups.builtin_var.subgroupsize_vertex
+dEQP-VK.subgroups.builtin_var.subgroupsize_vertex_framebuffer
 dEQP-VK.subgroups.builtin_var.subgroupinvocationid_vertex
+dEQP-VK.subgroups.builtin_var.subgroupinvocationid_vertex_framebuffer
 dEQP-VK.subgroups.builtin_var.subgroupsize_fragment
 dEQP-VK.subgroups.builtin_var.subgroupinvocationid_fragment
 dEQP-VK.subgroups.builtin_var.subgroupsize_compute
@@ -247382,10 +247384,15 @@ dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_geometry
 dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_geometry
 dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_geometry
 dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgrouplemask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_vertex
+dEQP-VK.subgroups.builtin_mask_var.subgroupltmask_vertex_framebuffer
 dEQP-VK.subgroups.builtin_mask_var.subgroupeqmask_fragment
 dEQP-VK.subgroups.builtin_mask_var.subgroupgemask_fragment
 dEQP-VK.subgroups.builtin_mask_var.subgroupgtmask_fragment
@@ -247412,15 +247419,24 @@ dEQP-VK.subgroups.basic.subgroupmemorybarrier_geometry
 dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_geometry
 dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_geometry
 dEQP-VK.subgroups.basic.subgroupelect_vertex
+dEQP-VK.subgroups.basic.subgroupelect_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupbarrier_vertex
+dEQP-VK.subgroups.basic.subgroupbarrier_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrier_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_vertex
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_vertex_framebuffer
 dEQP-VK.subgroups.basic.subgroupelect_fragment
 dEQP-VK.subgroups.basic.subgroupbarrier_fragment
+dEQP-VK.subgroups.basic.subgroupbarrier_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrier_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrier_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierbuffer_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_fragment
+dEQP-VK.subgroups.basic.subgroupmemorybarrierimage_fragment_framebuffer
 dEQP-VK.subgroups.basic.subgroupelect_compute
 dEQP-VK.subgroups.basic.subgroupbarrier_compute
 dEQP-VK.subgroups.basic.subgroupmemorybarrier_compute
@@ -247494,27 +247510,49 @@ dEQP-VK.subgroups.vote.subgroupallequal_bvec2_geometry
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_geometry
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_geometry
 dEQP-VK.subgroups.vote.subgroupallequal_int_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_int_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_vertex
+dEQP-VK.subgroups.vote.subgroupall_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_vertex
+dEQP-VK.subgroups.vote.subgroupany_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_float_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_double_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_fragment
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_fragment
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_fragment
@@ -247563,6 +247601,7 @@ dEQP-VK.subgroups.ballot.tess_eval
 dEQP-VK.subgroups.ballot.tess_control
 dEQP-VK.subgroups.ballot.geometry
 dEQP-VK.subgroups.ballot.vertex
+dEQP-VK.subgroups.ballot.vertex_framebuffer
 dEQP-VK.subgroups.ballot.fragment
 dEQP-VK.subgroups.ballot.compute
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_tess_eval
@@ -247686,45 +247725,85 @@ dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_geometry
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_geometry
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_geometry
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uint_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uint_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_float_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_float_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_vec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_vec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_double_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_double_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bool_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bool_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_vertex
+dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_int_fragment
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcastfirst_int_fragment
 dEQP-VK.subgroups.ballot_broadcast.subgroupbroadcast_ivec2_fragment
@@ -247827,12 +247906,19 @@ dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_geometry
 dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_geometry
 dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_geometry
 dEQP-VK.subgroups.ballot_other.subgroupinverseballot_vertex
+dEQP-VK.subgroups.ballot_other.subgroupinverseballot_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotinclusivebitcount_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotexclusivebitcount_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindlsb_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_vertex
+dEQP-VK.subgroups.ballot_other.subgroupballotfindmsb_vertex_framebuffer
 dEQP-VK.subgroups.ballot_other.subgroupinverseballot_fragment
 dEQP-VK.subgroups.ballot_other.subgroupballotbitextract_fragment
 dEQP-VK.subgroups.ballot_other.subgroupballotbitcount_fragment
@@ -248748,305 +248834,605 @@ dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_geometry
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_geometry
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_geometry
 dEQP-VK.subgroups.arithmetic.subgroupadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_int_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uint_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_float_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_double_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupmax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivemax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivemax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bool_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupxor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusiveor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupinclusivexor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusiveor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_vertex
+dEQP-VK.subgroups.arithmetic.subgroupexclusivexor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.arithmetic.subgroupadd_int_fragment
 dEQP-VK.subgroups.arithmetic.subgroupmul_int_fragment
 dEQP-VK.subgroups.arithmetic.subgroupmin_int_fragment
@@ -249948,105 +250334,205 @@ dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_geometry
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_geometry
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_geometry
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_int_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uint_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_float_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_vec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_double_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredadd_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmul_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmin_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredmax_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bool_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bool_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bool_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredand_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_vertex
+dEQP-VK.subgroups.clustered.subgroupclusteredxor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.clustered.subgroupclusteredadd_int_fragment
 dEQP-VK.subgroups.clustered.subgroupclusteredmul_int_fragment
 dEQP-VK.subgroups.clustered.subgroupclusteredmin_int_fragment
@@ -250488,85 +250974,165 @@ dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_geometry
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_geometry
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_geometry
 dEQP-VK.subgroups.shuffle.subgroupshuffle_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_int_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uint_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_float_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_vec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_double_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bool_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffle_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshufflexor_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffleup_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_vertex
+dEQP-VK.subgroups.shuffle.subgroupshuffledown_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.shuffle.subgroupshuffle_int_fragment
 dEQP-VK.subgroups.shuffle.subgroupshufflexor_int_fragment
 dEQP-VK.subgroups.shuffle.subgroupshuffleup_int_fragment
@@ -250968,85 +251534,165 @@ dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapvertical_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadswapdiagonal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_0_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadswaphorizontal_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadswapvertical_int_fragment
@@ -251268,25 +251914,45 @@ dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec2_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_1_ivec3_fragment
@@ -251388,25 +252054,45 @@ dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec2_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_2_ivec3_fragment
@@ -251508,25 +252194,45 @@ dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_geometry
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uint_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_float_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_vec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_double_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bool_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_vertex
+dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_int_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec2_fragment
 dEQP-VK.subgroups.quad.subgroupquadbroadcast_3_ivec3_fragment
@@ -251574,7 +252280,9 @@ dEQP-VK.subgroups.shape.quad_tess_control
 dEQP-VK.subgroups.shape.clustered_geometry
 dEQP-VK.subgroups.shape.quad_geometry
 dEQP-VK.subgroups.shape.clustered_vertex
+dEQP-VK.subgroups.shape.clustered_vertex_framebuffer
 dEQP-VK.subgroups.shape.quad_vertex
+dEQP-VK.subgroups.shape.quad_vertex_framebuffer
 dEQP-VK.subgroups.shape.clustered_fragment
 dEQP-VK.subgroups.shape.quad_fragment
 dEQP-VK.subgroups.shape.clustered_compute