Extend coverage in subgroups: vote, builtinMaskVar
authorArkadiusz Sarwa <arkadiusz.sarwa@mobica.com>
Mon, 29 Jan 2018 17:25:35 +0000 (18:25 +0100)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Mon, 5 Mar 2018 09:09:16 +0000 (04:09 -0500)
Affects:
dEQP-VK.subgroups.vote.*
dEQP-VK.subgroups.builtin_mask_var.*

 Add tests:
 dEQP-VK.subgroups.vote.*_frag_helper

Components: Vulkan

VK-GL-CTS issue: 965, 799

Change-Id: I32fe052e4cbfc6d1dfefb9b3be7d1e4d54124b16

android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
external/vulkancts/mustpass/1.1.2/vk-default-no-waivers.txt
external/vulkancts/mustpass/1.1.2/vk-default.txt

index 5e68492..1d3a40d 100755 (executable)
@@ -287094,132 +287094,154 @@ dEQP-VK.subgroups.vote.subgroupallequal_int_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_int_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupall_uint_compute
 dEQP-VK.subgroups.vote.subgroupall_uint_graphic
 dEQP-VK.subgroups.vote.subgroupall_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupall_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupany_uint_compute
 dEQP-VK.subgroups.vote.subgroupany_uint_graphic
 dEQP-VK.subgroups.vote.subgroupany_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupany_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uint_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uint_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_float_compute
 dEQP-VK.subgroups.vote.subgroupallequal_float_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_float_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_float_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_double_compute
 dEQP-VK.subgroups.vote.subgroupallequal_double_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_double_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_double_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bool_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bool_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bool_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_fragment_frag_helper
 dEQP-VK.subgroups.ballot.compute
 dEQP-VK.subgroups.ballot.graphic
 dEQP-VK.subgroups.ballot.tess_eval_framebuffer
index db0fae7..92f9de6 100644 (file)
@@ -121,37 +121,37 @@ std::string subgroupComparison (const CaseDefinition& caseDef)
        if ("gl_SubgroupEqMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "%54 = OpIEqual %11 %51 %53\n";
+                       return "%56 = OpIEqual %11 %53 %55\n";
                else
-                       return "%36 = OpIEqual %13 %33 %35\n";
+                       return "%38 = OpIEqual %16 %35 %37\n";
        }
        else if ("gl_SubgroupGeMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "%54 = OpUGreaterThanEqual %11 %51 %53\n";
+                       return "%56 = OpUGreaterThanEqual %11 %53 %55\n";
                else
-                       return "%36 = OpUGreaterThanEqual %13 %33 %35\n";
+                       return "%38 = OpUGreaterThanEqual %16 %35 %37\n";
        }
        else if ("gl_SubgroupGtMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "%54 = OpUGreaterThan %11 %51 %53\n";
+                       return "%56 = OpUGreaterThan %11 %53 %55\n";
                else
-                       return "%36 = OpUGreaterThan %13 %33 %35\n";
+                       return "%38 = OpUGreaterThan %16 %35 %37\n";
        }
        else if ("gl_SubgroupLeMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "%54 = OpULessThanEqual %11 %51 %53\n";
+                       return "%56 = OpULessThanEqual %11 %53 %55\n";
                else
-                       return "%36 = OpULessThanEqual %13 %33 %35\n";
+                       return "%38 = OpULessThanEqual %16 %35 %37\n";
        }
        else if ("gl_SubgroupLtMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "%54 = OpULessThan %11 %51 %53\n";
+                       return "%56 = OpULessThan %11 %53 %55\n";
                else
-                       return "%36 = OpULessThan %13 %33 %35\n";
+                       return "%38 = OpULessThan %16 %35 %37\n";
        }
        return "";
 }
@@ -161,37 +161,37 @@ std::string varSubgroupMask (const CaseDefinition& caseDef)
        if ("gl_SubgroupEqMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "OpDecorate %37 BuiltIn SubgroupEqMask\n";
+                       return "OpDecorate %40 BuiltIn SubgroupEqMask\n";
                else
-                       return "OpDecorate %19 BuiltIn SubgroupEqMask\n";
+                       return "OpDecorate %22 BuiltIn SubgroupEqMask\n";
        }
        else if ("gl_SubgroupGeMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "OpDecorate %37 BuiltIn SubgroupGeMask\n";
+                       return "OpDecorate %40 BuiltIn SubgroupGeMask\n";
                else
-                       return "OpDecorate %19 BuiltIn SubgroupGeMask\n";
+                       return "OpDecorate %22 BuiltIn SubgroupGeMask\n";
        }
        else if ("gl_SubgroupGtMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "OpDecorate %37 BuiltIn SubgroupGtMask\n";
+                       return "OpDecorate %40 BuiltIn SubgroupGtMask\n";
                else
-                       return "OpDecorate %19 BuiltIn SubgroupGtMask\n";
+                       return "OpDecorate %22 BuiltIn SubgroupGtMask\n";
        }
        else if ("gl_SubgroupLeMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "OpDecorate %37 BuiltIn SubgroupLeMask\n";
+                       return "OpDecorate %40 BuiltIn SubgroupLeMask\n";
                else
-                       return "OpDecorate %19 BuiltIn SubgroupLeMask\n";
+                       return "OpDecorate %22 BuiltIn SubgroupLeMask\n";
        }
        else if ("gl_SubgroupLtMask" == caseDef.varName)
        {
                if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
-                       return "OpDecorate %37 BuiltIn SubgroupLtMask\n";
+                       return "OpDecorate %40 BuiltIn SubgroupLtMask\n";
                else
-                       return "OpDecorate %19 BuiltIn SubgroupLtMask\n";
+                       return "OpDecorate %22 BuiltIn SubgroupLtMask\n";
        }
        return "";
 }
@@ -201,6 +201,8 @@ std::string subgroupMask (const CaseDefinition& caseDef)
        std::ostringstream bdy;
 
        bdy << "  uint tempResult = 0x1;\n"
+               << "  uint bit        = 0x1;\n"
+               << "  uint bitCount   = 0x0;\n"
                << "  uvec4 mask = subgroupBallot(true);\n"
                << "  const uvec4 var = " << caseDef.varName << ";\n"
                << "  for (uint i = 0; i < gl_SubgroupSize; i++)\n"
@@ -242,7 +244,31 @@ std::string subgroupMask (const CaseDefinition& caseDef)
                        << "    }\n";
        }
 
-       bdy << "  }\n";
+       bdy << "  }\n"
+               << "  for (uint i = 0; i < 32; i++)\n"
+               << "  {\n"
+               << "    if ((var.x & bit) > 0)\n"
+               << "    {\n"
+               << "      bitCount++;\n"
+               << "    }\n"
+               << "    if ((var.y & bit) > 0)\n"
+               << "    {\n"
+               << "      bitCount++;\n"
+               << "    }\n"
+               << "    if ((var.z & bit) > 0)\n"
+               << "    {\n"
+               << "      bitCount++;\n"
+               << "    }\n"
+               << "    if ((var.w & bit) > 0)\n"
+               << "    {\n"
+               << "      bitCount++;\n"
+               << "    }\n"
+               << "    bit = bit<<1;\n"
+               << "  }\n"
+               << "  if (subgroupBallotBitCount(var) != bitCount)\n"
+               << "  {\n"
+               << "    tempResult = 0;\n"
+               << "  }\n";
        return bdy.str();
 }
 
@@ -260,262 +286,460 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
        if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
        {
                /*
+                       const string bdy = subgroupMask(caseDef);
+                       const string vertex =
+                       "#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()
+                       + bdy +
                        "  out_color = float(tempResult);\n"
                        "  gl_Position = in_position;\n"
                        "  gl_PointSize = 1.0f;\n"
                        "}\n";
+                       programCollection.glslSources.add("vert")
+                               << glu::VertexSource(vertex) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
                */
+
                const string vertex =
                        "; SPIR-V\n"
                        "; Version: 1.3\n"
                        "; Generator: Khronos Glslang Reference Front End; 2\n"
-                       "; Bound: 63\n"
+                       "; Bound: 123\n"
                        "; Schema: 0\n"
                        "OpCapability Shader\n"
                        "OpCapability GroupNonUniform\n"
                        "OpCapability GroupNonUniformBallot\n"
                        "%1 = OpExtInstImport \"GLSL.std.450\"\n"
                        "OpMemoryModel Logical GLSL450\n"
-                       "OpEntryPoint Vertex %4 \"main\" %19 %30 %34 %49 %56 %59\n"
+                       "OpEntryPoint Vertex %4 \"main\" %22 %32 %36 %107 %114 %117\n"
                        + mask +
-                       "OpDecorate %30 RelaxedPrecision\n"
-                       "OpDecorate %30 BuiltIn SubgroupSize\n"
-                       "OpDecorate %31 RelaxedPrecision\n"
-                       "OpDecorate %34 RelaxedPrecision\n"
-                       "OpDecorate %34 BuiltIn SubgroupLocalInvocationId\n"
-                       "OpDecorate %35 RelaxedPrecision\n"
-                       "OpDecorate %49 Location 0\n"
-                       "OpMemberDecorate %54 0 BuiltIn Position\n"
-                       "OpMemberDecorate %54 1 BuiltIn PointSize\n"
-                       "OpMemberDecorate %54 2 BuiltIn ClipDistance\n"
-                       "OpMemberDecorate %54 3 BuiltIn CullDistance\n"
-                       "OpDecorate %54 Block\n"
-                       "OpDecorate %59 Location 0\n"
+                       "OpDecorate %32 RelaxedPrecision\n"
+                       "OpDecorate %32 BuiltIn SubgroupSize\n"
+                       "OpDecorate %33 RelaxedPrecision\n"
+                       "OpDecorate %36 RelaxedPrecision\n"
+                       "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
+                       "OpDecorate %37 RelaxedPrecision\n"
+                       "OpDecorate %107 Location 0\n"
+                       "OpMemberDecorate %112 0 BuiltIn Position\n"
+                       "OpMemberDecorate %112 1 BuiltIn PointSize\n"
+                       "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
+                       "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
+                       "OpDecorate %112 Block\n"
+                       "OpDecorate %117 Location 0\n"
                        "%2 = OpTypeVoid\n"
                        "%3 = OpTypeFunction %2\n"
                        "%6 = OpTypeInt 32 0\n"
                        "%7 = OpTypePointer Function %6\n"
                        "%9 = OpConstant %6 1\n"
-                       "%10 = OpTypeVector %6 4\n"
-                       "%11 = OpTypePointer Function %10\n"
-                       "%13 = OpTypeBool\n"
-                       "%14 = OpConstantTrue %13\n"
-                       "%15 = OpConstant %6 3\n"
-                       "%18 = OpTypePointer Input %10\n"
-                       "%19 = OpVariable %18 Input\n"
-                       "%22 = OpConstant %6 0\n"
-                       "%29 = OpTypePointer Input %6\n"
-                       "%30 = OpVariable %29 Input\n"
-                       "%34 = OpVariable %29 Input\n"
-                       "%44 = OpTypeInt 32 1\n"
-                       "%45 = OpConstant %44 1\n"
-                       "%47 = OpTypeFloat 32\n"
-                       "%48 = OpTypePointer Output %47\n"
-                       "%49 = OpVariable %48 Output\n"
-                       "%52 = OpTypeVector %47 4\n"
-                       "%53 = OpTypeArray %47 %9\n"
-                       "%54 = OpTypeStruct %52 %47 %53 %53\n"
-                       "%55 = OpTypePointer Output %54\n"
-                       "%56 = OpVariable %55 Output\n"
-                       "%57 = OpConstant %44 0\n"
-                       "%63 = OpConstant %47 1\n"
-                       "%58 = OpTypePointer Input %52\n"
-                       "%59 = OpVariable %58 Input\n"
-                       "%61 = OpTypePointer Output %52\n"
+                       "%12 = OpConstant %6 0\n"
+                       "%13 = OpTypeVector %6 4\n"
+                       "%14 = OpTypePointer Function %13\n"
+                       "%16 = OpTypeBool\n"
+                       "%17 = OpConstantTrue %16\n"
+                       "%18 = OpConstant %6 3\n"
+                       "%21 = OpTypePointer Input %13\n"
+                       "%22 = OpVariable %21 Input\n"
+                       "%31 = OpTypePointer Input %6\n"
+                       "%32 = OpVariable %31 Input\n"
+                       "%36 = OpVariable %31 Input\n"
+                       "%46 = OpTypeInt 32 1\n"
+                       "%47 = OpConstant %46 1\n"
+                       "%56 = OpConstant %6 32\n"
+                       "%76 = OpConstant %6 2\n"
+                       "%105 = OpTypeFloat 32\n"
+                       "%106 = OpTypePointer Output %105\n"
+                       "%107 = OpVariable %106 Output\n"
+                       "%110 = OpTypeVector %105 4\n"
+                       "%111 = OpTypeArray %105 %9\n"
+                       "%112 = OpTypeStruct %110 %105 %111 %111\n"
+                       "%113 = OpTypePointer Output %112\n"
+                       "%114 = OpVariable %113 Output\n"
+                       "%115 = OpConstant %46 0\n"
+                       "%116 = OpTypePointer Input %110\n"
+                       "%117 = OpVariable %116 Input\n"
+                       "%119 = OpTypePointer Output %110\n"
+                       "%121 = OpConstant %105 1\n"
                        "%4 = OpFunction %2 None %3\n"
                        "%5 = OpLabel\n"
                        "%8 = OpVariable %7 Function\n"
-                       "%12 = OpVariable %11 Function\n"
-                       "%17 = OpVariable %11 Function\n"
-                       "%21 = OpVariable %7 Function\n"
+                       "%10 = OpVariable %7 Function\n"
+                       "%11 = OpVariable %7 Function\n"
+                       "%15 = OpVariable %14 Function\n"
+                       "%20 = OpVariable %14 Function\n"
+                       "%24 = OpVariable %7 Function\n"
+                       "%49 = OpVariable %7 Function\n"
                        "OpStore %8 %9\n"
-                       "%16 = OpGroupNonUniformBallot %10 %15 %14\n"
-                       "OpStore %12 %16\n"
-                       "%20 = OpLoad %10 %19\n"
-                       "OpStore %17 %20\n"
-                       "OpStore %21 %22\n"
-                       "OpBranch %23\n"
-                       "%23 = OpLabel\n"
-                       "OpLoopMerge %25 %26 None\n"
-                       "OpBranch %27\n"
-                       "%27 = OpLabel\n"
-                       "%28 = OpLoad %6 %21\n"
-                       "%31 = OpLoad %6 %30\n"
-                       "%32 = OpULessThan %13 %28 %31\n"
-                       "OpBranchConditional %32 %24 %25\n"
-                       "%24 = OpLabel\n"
-                       "%33 = OpLoad %6 %21\n"
-                       "%35 = OpLoad %6 %34\n"
-                       + comparison +
-                       "%37 = OpLoad %10 %17\n"
-                       "%38 = OpLoad %6 %21\n"
-                       "%39 = OpGroupNonUniformBallotBitExtract %13 %15 %37 %38\n"
-                       "%40 = OpLogicalNotEqual %13 %36 %39\n"
-                       "OpSelectionMerge %42 None\n"
-                       "OpBranchConditional %40 %41 %42\n"
-                       "%41 = OpLabel\n"
-                       "OpStore %8 %22\n"
-                       "OpBranch %42\n"
-                       "%42 = OpLabel\n"
-                       "OpBranch %26\n"
-                       "%26 = OpLabel\n"
-                       "%43 = OpLoad %6 %21\n"
-                       "%46 = OpIAdd %6 %43 %45\n"
-                       "OpStore %21 %46\n"
-                       "OpBranch %23\n"
+                       "OpStore %10 %9\n"
+                       "OpStore %11 %12\n"
+                       "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
+                       "OpStore %15 %19\n"
+                       "%23 = OpLoad %13 %22\n"
+                       "OpStore %20 %23\n"
+                       "OpStore %24 %12\n"
+                       "OpBranch %25\n"
                        "%25 = OpLabel\n"
-                       "%50 = OpLoad %6 %8\n"
-                       "%51 = OpConvertUToF %47 %50\n"
-                       "OpStore %49 %51\n"
-                       "%60 = OpLoad %52 %59\n"
-                       "%62 = OpAccessChain %61 %56 %57\n"
-                       "OpStore %62 %60\n"
-                       "%64 = OpAccessChain %48 %56 %45\n"
-                       "OpStore %64 %63\n"
+                       "OpLoopMerge %27 %28 None\n"
+                       "OpBranch %29\n"
+                       "%29 = OpLabel\n"
+                       "%30 = OpLoad %6 %24\n"
+                       "%33 = OpLoad %6 %32\n"
+                       "%34 = OpULessThan %16 %30 %33\n"
+                       "OpBranchConditional %34 %26 %27\n"
+                       "%26 = OpLabel\n"
+                       "%35 = OpLoad %6 %24\n"
+                       "%37 = OpLoad %6 %36\n"
+                       + comparison +
+                       "%39 = OpLoad %13 %20\n"
+                       "%40 = OpLoad %6 %24\n"
+                       "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
+                       "%42 = OpLogicalNotEqual %16 %38 %41\n"
+                       "OpSelectionMerge %44 None\n"
+                       "OpBranchConditional %42 %43 %44\n"
+                       "%43 = OpLabel\n"
+                       "OpStore %8 %12\n"
+                       "OpBranch %44\n"
+                       "%44 = OpLabel\n"
+                       "OpBranch %28\n"
+                       "%28 = OpLabel\n"
+                       "%45 = OpLoad %6 %24\n"
+                       "%48 = OpIAdd %6 %45 %47\n"
+                       "OpStore %24 %48\n"
+                       "OpBranch %25\n"
+                       "%27 = OpLabel\n"
+                       "OpStore %49 %12\n"
+                       "OpBranch %50\n"
+                       "%50 = OpLabel\n"
+                       "OpLoopMerge %52 %53 None\n"
+                       "OpBranch %54\n"
+                       "%54 = OpLabel\n"
+                       "%55 = OpLoad %6 %49\n"
+                       "%57 = OpULessThan %16 %55 %56\n"
+                       "OpBranchConditional %57 %51 %52\n"
+                       "%51 = OpLabel\n"
+                       "%58 = OpAccessChain %7 %20 %12\n"
+                       "%59 = OpLoad %6 %58\n"
+                       "%60 = OpLoad %6 %10\n"
+                       "%61 = OpBitwiseAnd %6 %59 %60\n"
+                       "%62 = OpUGreaterThan %16 %61 %12\n"
+                       "OpSelectionMerge %64 None\n"
+                       "OpBranchConditional %62 %63 %64\n"
+                       "%63 = OpLabel\n"
+                       "%65 = OpLoad %6 %11\n"
+                       "%66 = OpIAdd %6 %65 %47\n"
+                       "OpStore %11 %66\n"
+                       "OpBranch %64\n"
+                       "%64 = OpLabel\n"
+                       "%67 = OpAccessChain %7 %20 %9\n"
+                       "%68 = OpLoad %6 %67\n"
+                       "%69 = OpLoad %6 %10\n"
+                       "%70 = OpBitwiseAnd %6 %68 %69\n"
+                       "%71 = OpUGreaterThan %16 %70 %12\n"
+                       "OpSelectionMerge %73 None\n"
+                       "OpBranchConditional %71 %72 %73\n"
+                       "%72 = OpLabel\n"
+                       "%74 = OpLoad %6 %11\n"
+                       "%75 = OpIAdd %6 %74 %47\n"
+                       "OpStore %11 %75\n"
+                       "OpBranch %73\n"
+                       "%73 = OpLabel\n"
+                       "%77 = OpAccessChain %7 %20 %76\n"
+                       "%78 = OpLoad %6 %77\n"
+                       "%79 = OpLoad %6 %10\n"
+                       "%80 = OpBitwiseAnd %6 %78 %79\n"
+                       "%81 = OpUGreaterThan %16 %80 %12\n"
+                       "OpSelectionMerge %83 None\n"
+                       "OpBranchConditional %81 %82 %83\n"
+                       "%82 = OpLabel\n"
+                       "%84 = OpLoad %6 %11\n"
+                       "%85 = OpIAdd %6 %84 %47\n"
+                       "OpStore %11 %85\n"
+                       "OpBranch %83\n"
+                       "%83 = OpLabel\n"
+                       "%86 = OpAccessChain %7 %20 %18\n"
+                       "%87 = OpLoad %6 %86\n"
+                       "%88 = OpLoad %6 %10\n"
+                       "%89 = OpBitwiseAnd %6 %87 %88\n"
+                       "%90 = OpUGreaterThan %16 %89 %12\n"
+                       "OpSelectionMerge %92 None\n"
+                       "OpBranchConditional %90 %91 %92\n"
+                       "%91 = OpLabel\n"
+                       "%93 = OpLoad %6 %11\n"
+                       "%94 = OpIAdd %6 %93 %47\n"
+                       "OpStore %11 %94\n"
+                       "OpBranch %92\n"
+                       "%92 = OpLabel\n"
+                       "%95 = OpLoad %6 %10\n"
+                       "%96 = OpShiftLeftLogical %6 %95 %47\n"
+                       "OpStore %10 %96\n"
+                       "OpBranch %53\n"
+                       "%53 = OpLabel\n"
+                       "%97 = OpLoad %6 %49\n"
+                       "%98 = OpIAdd %6 %97 %47\n"
+                       "OpStore %49 %98\n"
+                       "OpBranch %50\n"
+                       "%52 = OpLabel\n"
+                       "%99 = OpLoad %13 %20\n"
+                       "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
+                       "%101 = OpLoad %6 %11\n"
+                       "%102 = OpINotEqual %16 %100 %101\n"
+                       "OpSelectionMerge %104 None\n"
+                       "OpBranchConditional %102 %103 %104\n"
+                       "%103 = OpLabel\n"
+                       "OpStore %8 %12\n"
+                       "OpBranch %104\n"
+                       "%104 = OpLabel\n"
+                       "%108 = OpLoad %6 %8\n"
+                       "%109 = OpConvertUToF %105 %108\n"
+                       "OpStore %107 %109\n"
+                       "%118 = OpLoad %110 %117\n"
+                       "%120 = OpAccessChain %119 %114 %115\n"
+                       "OpStore %120 %118\n"
+                       "%122 = OpAccessChain %106 %114 %47\n"
+                       "OpStore %122 %121\n"
                        "OpReturn\n"
                        "OpFunctionEnd\n";
                programCollection.spirvAsmSources.add("vert") << vertex << buildOptionsSpr;
        }
        else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
        {
+               /*
+                       const string bdy = subgroupMask(caseDef);
+                       const string  evaluationSource =
+                       "#version 450\n"
+                       "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+                       "#extension GL_EXT_tessellation_shader : require\n"
+                       "layout(isolines, equal_spacing, ccw ) in;\n"
+                       "layout(location = 0) out float out_color;\n"
+                       "\n"
+                       "void main (void)\n"
+                       "{\n"
+                       + bdy +
+                       "  out_color = float(tempResult);\n"
+                       "  gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+                       "}\n";
+                       programCollection.glslSources.add("tese")
+                               << glu::TessellationEvaluationSource(evaluationSource) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+               */
                const string evaluationSource =
                        "; SPIR-V\n"
                        "; Version: 1.3\n"
                        "; Generator: Khronos Glslang Reference Front End; 2\n"
-                       "; Bound: 81\n"
+                       "; Bound: 136\n"
                        "; Schema: 0\n"
                        "OpCapability Tessellation\n"
                        "OpCapability GroupNonUniform\n"
                        "OpCapability GroupNonUniformBallot\n"
                        "%1 = OpExtInstImport \"GLSL.std.450\"\n"
                        "OpMemoryModel Logical GLSL450\n"
-                       "OpEntryPoint TessellationEvaluation %4 \"main\" %19 %30 %34 %49 %56 %62 %70 %80\n"
+                       "OpEntryPoint TessellationEvaluation %4 \"main\" %22 %32 %36 %107 %114 %120 %128\n"
                        "OpExecutionMode %4 Isolines\n"
                        "OpExecutionMode %4 SpacingEqual\n"
                        "OpExecutionMode %4 VertexOrderCcw\n"
                        + mask +
-                       "OpDecorate %30 RelaxedPrecision\n"
-                       "OpDecorate %30 BuiltIn SubgroupSize\n"
-                       "OpDecorate %31 RelaxedPrecision\n"
-                       "OpDecorate %34 RelaxedPrecision\n"
-                       "OpDecorate %34 BuiltIn SubgroupLocalInvocationId\n"
-                       "OpDecorate %35 RelaxedPrecision\n"
-                       "OpDecorate %49 Location 0\n"
-                       "OpMemberDecorate %54 0 BuiltIn Position\n"
-                       "OpMemberDecorate %54 1 BuiltIn PointSize\n"
-                       "OpMemberDecorate %54 2 BuiltIn ClipDistance\n"
-                       "OpMemberDecorate %54 3 BuiltIn CullDistance\n"
-                       "OpDecorate %54 Block\n"
-                       "OpMemberDecorate %58 0 BuiltIn Position\n"
-                       "OpMemberDecorate %58 1 BuiltIn PointSize\n"
-                       "OpMemberDecorate %58 2 BuiltIn ClipDistance\n"
-                       "OpMemberDecorate %58 3 BuiltIn CullDistance\n"
-                       "OpDecorate %58 Block\n"
-                       "OpDecorate %70 BuiltIn TessCoord\n"
-                       "OpDecorate %80 Location 0\n"
+                       "OpDecorate %32 RelaxedPrecision\n"
+                       "OpDecorate %32 BuiltIn SubgroupSize\n"
+                       "OpDecorate %33 RelaxedPrecision\n"
+                       "OpDecorate %36 RelaxedPrecision\n"
+                       "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
+                       "OpDecorate %37 RelaxedPrecision\n"
+                       "OpDecorate %107 Location 0\n"
+                       "OpMemberDecorate %112 0 BuiltIn Position\n"
+                       "OpMemberDecorate %112 1 BuiltIn PointSize\n"
+                       "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
+                       "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
+                       "OpDecorate %112 Block\n"
+                       "OpMemberDecorate %116 0 BuiltIn Position\n"
+                       "OpMemberDecorate %116 1 BuiltIn PointSize\n"
+                       "OpMemberDecorate %116 2 BuiltIn ClipDistance\n"
+                       "OpMemberDecorate %116 3 BuiltIn CullDistance\n"
+                       "OpDecorate %116 Block\n"
+                       "OpDecorate %128 BuiltIn TessCoord\n"
                        "%2 = OpTypeVoid\n"
                        "%3 = OpTypeFunction %2\n"
                        "%6 = OpTypeInt 32 0\n"
                        "%7 = OpTypePointer Function %6\n"
                        "%9 = OpConstant %6 1\n"
-                       "%10 = OpTypeVector %6 4\n"
-                       "%11 = OpTypePointer Function %10\n"
-                       "%13 = OpTypeBool\n"
-                       "%14 = OpConstantTrue %13\n"
-                       "%15 = OpConstant %6 3\n"
-                       "%18 = OpTypePointer Input %10\n"
-                       "%19 = OpVariable %18 Input\n"
-                       "%22 = OpConstant %6 0\n"
-                       "%29 = OpTypePointer Input %6\n"
-                       "%30 = OpVariable %29 Input\n"
-                       "%34 = OpVariable %29 Input\n"
-                       "%44 = OpTypeInt 32 1\n"
-                       "%45 = OpConstant %44 1\n"
-                       "%47 = OpTypeFloat 32\n"
-                       "%48 = OpTypePointer Output %47\n"
-                       "%49 = OpVariable %48 Output\n"
-                       "%52 = OpTypeVector %47 4\n"
-                       "%53 = OpTypeArray %47 %9\n"
-                       "%54 = OpTypeStruct %52 %47 %53 %53\n"
-                       "%55 = OpTypePointer Output %54\n"
-                       "%56 = OpVariable %55 Output\n"
-                       "%57 = OpConstant %44 0\n"
-                       "%58 = OpTypeStruct %52 %47 %53 %53\n"
-                       "%59 = OpConstant %6 32\n"
-                       "%60 = OpTypeArray %58 %59\n"
-                       "%61 = OpTypePointer Input %60\n"
-                       "%62 = OpVariable %61 Input\n"
-                       "%63 = OpTypePointer Input %52\n"
-                       "%68 = OpTypeVector %47 3\n"
-                       "%69 = OpTypePointer Input %68\n"
-                       "%70 = OpVariable %69 Input\n"
-                       "%71 = OpTypePointer Input %47\n"
-                       "%76 = OpTypePointer Output %52\n"
-                       "%78 = OpTypeArray %47 %59\n"
-                       "%79 = OpTypePointer Input %78\n"
-                       "%80 = OpVariable %79 Input\n"
+                       "%12 = OpConstant %6 0\n"
+                       "%13 = OpTypeVector %6 4\n"
+                       "%14 = OpTypePointer Function %13\n"
+                       "%16 = OpTypeBool\n"
+                       "%17 = OpConstantTrue %16\n"
+                       "%18 = OpConstant %6 3\n"
+                       "%21 = OpTypePointer Input %13\n"
+                       "%22 = OpVariable %21 Input\n"
+                       "%31 = OpTypePointer Input %6\n"
+                       "%32 = OpVariable %31 Input\n"
+                       "%36 = OpVariable %31 Input\n"
+                       "%46 = OpTypeInt 32 1\n"
+                       "%47 = OpConstant %46 1\n"
+                       "%56 = OpConstant %6 32\n"
+                       "%76 = OpConstant %6 2\n"
+                       "%105 = OpTypeFloat 32\n"
+                       "%106 = OpTypePointer Output %105\n"
+                       "%107 = OpVariable %106 Output\n"
+                       "%110 = OpTypeVector %105 4\n"
+                       "%111 = OpTypeArray %105 %9\n"
+                       "%112 = OpTypeStruct %110 %105 %111 %111\n"
+                       "%113 = OpTypePointer Output %112\n"
+                       "%114 = OpVariable %113 Output\n"
+                       "%115 = OpConstant %46 0\n"
+                       "%116 = OpTypeStruct %110 %105 %111 %111\n"
+                       "%117 = OpConstant %6 32\n"
+                       "%118 = OpTypeArray %116 %117\n"
+                       "%119 = OpTypePointer Input %118\n"
+                       "%120 = OpVariable %119 Input\n"
+                       "%121 = OpTypePointer Input %110\n"
+                       "%126 = OpTypeVector %105 3\n"
+                       "%127 = OpTypePointer Input %126\n"
+                       "%128 = OpVariable %127 Input\n"
+                       "%129 = OpTypePointer Input %105\n"
+                       "%134 = OpTypePointer Output %110\n"
                        "%4 = OpFunction %2 None %3\n"
                        "%5 = OpLabel\n"
                        "%8 = OpVariable %7 Function\n"
-                       "%12 = OpVariable %11 Function\n"
-                       "%17 = OpVariable %11 Function\n"
-                       "%21 = OpVariable %7 Function\n"
+                       "%10 = OpVariable %7 Function\n"
+                       "%11 = OpVariable %7 Function\n"
+                       "%15 = OpVariable %14 Function\n"
+                       "%20 = OpVariable %14 Function\n"
+                       "%24 = OpVariable %7 Function\n"
+                       "%49 = OpVariable %7 Function\n"
                        "OpStore %8 %9\n"
-                       "%16 = OpGroupNonUniformBallot %10 %15 %14\n"
-                       "OpStore %12 %16\n"
-                       "%20 = OpLoad %10 %19\n"
-                       "OpStore %17 %20\n"
-                       "OpStore %21 %22\n"
-                       "OpBranch %23\n"
-                       "%23 = OpLabel\n"
-                       "OpLoopMerge %25 %26 None\n"
-                       "OpBranch %27\n"
-                       "%27 = OpLabel\n"
-                       "%28 = OpLoad %6 %21\n"
-                       "%31 = OpLoad %6 %30\n"
-                       "%32 = OpULessThan %13 %28 %31\n"
-                       "OpBranchConditional %32 %24 %25\n"
-                       "%24 = OpLabel\n"
-                       "%33 = OpLoad %6 %21\n"
-                       "%35 = OpLoad %6 %34\n"
-                       + comparison +
-                       "%37 = OpLoad %10 %17\n"
-                       "%38 = OpLoad %6 %21\n"
-                       "%39 = OpGroupNonUniformBallotBitExtract %13 %15 %37 %38\n"
-                       "%40 = OpLogicalNotEqual %13 %36 %39\n"
-                       "OpSelectionMerge %42 None\n"
-                       "OpBranchConditional %40 %41 %42\n"
-                       "%41 = OpLabel\n"
-                       "OpStore %8 %22\n"
-                       "OpBranch %42\n"
-                       "%42 = OpLabel\n"
-                       "OpBranch %26\n"
-                       "%26 = OpLabel\n"
-                       "%43 = OpLoad %6 %21\n"
-                       "%46 = OpIAdd %6 %43 %45\n"
-                       "OpStore %21 %46\n"
-                       "OpBranch %23\n"
+                       "OpStore %10 %9\n"
+                       "OpStore %11 %12\n"
+                       "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
+                       "OpStore %15 %19\n"
+                       "%23 = OpLoad %13 %22\n"
+                       "OpStore %20 %23\n"
+                       "OpStore %24 %12\n"
+                       "OpBranch %25\n"
                        "%25 = OpLabel\n"
-                       "%50 = OpLoad %6 %8\n"
-                       "%51 = OpConvertUToF %47 %50\n"
-                       "OpStore %49 %51\n"
-                       "%64 = OpAccessChain %63 %62 %57 %57\n"
-                       "%65 = OpLoad %52 %64\n"
-                       "%66 = OpAccessChain %63 %62 %45 %57\n"
-                       "%67 = OpLoad %52 %66\n"
-                       "%72 = OpAccessChain %71 %70 %22\n"
-                       "%73 = OpLoad %47 %72\n"
-                       "%74 = OpCompositeConstruct %52 %73 %73 %73 %73\n"
-                       "%75 = OpExtInst %52 %1 FMix %65 %67 %74\n"
-                       "%77 = OpAccessChain %76 %56 %57\n"
-                       "OpStore %77 %75\n"
+                       "OpLoopMerge %27 %28 None\n"
+                       "OpBranch %29\n"
+                       "%29 = OpLabel\n"
+                       "%30 = OpLoad %6 %24\n"
+                       "%33 = OpLoad %6 %32\n"
+                       "%34 = OpULessThan %16 %30 %33\n"
+                       "OpBranchConditional %34 %26 %27\n"
+                       "%26 = OpLabel\n"
+                       "%35 = OpLoad %6 %24\n"
+                       "%37 = OpLoad %6 %36\n"
+                       + comparison +
+                       "%39 = OpLoad %13 %20\n"
+                       "%40 = OpLoad %6 %24\n"
+                       "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
+                       "%42 = OpLogicalNotEqual %16 %38 %41\n"
+                       "OpSelectionMerge %44 None\n"
+                       "OpBranchConditional %42 %43 %44\n"
+                       "%43 = OpLabel\n"
+                       "OpStore %8 %12\n"
+                       "OpBranch %44\n"
+                       "%44 = OpLabel\n"
+                       "OpBranch %28\n"
+                       "%28 = OpLabel\n"
+                       "%45 = OpLoad %6 %24\n"
+                       "%48 = OpIAdd %6 %45 %47\n"
+                       "OpStore %24 %48\n"
+                       "OpBranch %25\n"
+                       "%27 = OpLabel\n"
+                       "OpStore %49 %12\n"
+                       "OpBranch %50\n"
+                       "%50 = OpLabel\n"
+                       "OpLoopMerge %52 %53 None\n"
+                       "OpBranch %54\n"
+                       "%54 = OpLabel\n"
+                       "%55 = OpLoad %6 %49\n"
+                       "%57 = OpULessThan %16 %55 %56\n"
+                       "OpBranchConditional %57 %51 %52\n"
+                       "%51 = OpLabel\n"
+                       "%58 = OpAccessChain %7 %20 %12\n"
+                       "%59 = OpLoad %6 %58\n"
+                       "%60 = OpLoad %6 %10\n"
+                       "%61 = OpBitwiseAnd %6 %59 %60\n"
+                       "%62 = OpUGreaterThan %16 %61 %12\n"
+                       "OpSelectionMerge %64 None\n"
+                       "OpBranchConditional %62 %63 %64\n"
+                       "%63 = OpLabel\n"
+                       "%65 = OpLoad %6 %11\n"
+                       "%66 = OpIAdd %6 %65 %47\n"
+                       "OpStore %11 %66\n"
+                       "OpBranch %64\n"
+                       "%64 = OpLabel\n"
+                       "%67 = OpAccessChain %7 %20 %9\n"
+                       "%68 = OpLoad %6 %67\n"
+                       "%69 = OpLoad %6 %10\n"
+                       "%70 = OpBitwiseAnd %6 %68 %69\n"
+                       "%71 = OpUGreaterThan %16 %70 %12\n"
+                       "OpSelectionMerge %73 None\n"
+                       "OpBranchConditional %71 %72 %73\n"
+                       "%72 = OpLabel\n"
+                       "%74 = OpLoad %6 %11\n"
+                       "%75 = OpIAdd %6 %74 %47\n"
+                       "OpStore %11 %75\n"
+                       "OpBranch %73\n"
+                       "%73 = OpLabel\n"
+                       "%77 = OpAccessChain %7 %20 %76\n"
+                       "%78 = OpLoad %6 %77\n"
+                       "%79 = OpLoad %6 %10\n"
+                       "%80 = OpBitwiseAnd %6 %78 %79\n"
+                       "%81 = OpUGreaterThan %16 %80 %12\n"
+                       "OpSelectionMerge %83 None\n"
+                       "OpBranchConditional %81 %82 %83\n"
+                       "%82 = OpLabel\n"
+                       "%84 = OpLoad %6 %11\n"
+                       "%85 = OpIAdd %6 %84 %47\n"
+                       "OpStore %11 %85\n"
+                       "OpBranch %83\n"
+                       "%83 = OpLabel\n"
+                       "%86 = OpAccessChain %7 %20 %18\n"
+                       "%87 = OpLoad %6 %86\n"
+                       "%88 = OpLoad %6 %10\n"
+                       "%89 = OpBitwiseAnd %6 %87 %88\n"
+                       "%90 = OpUGreaterThan %16 %89 %12\n"
+                       "OpSelectionMerge %92 None\n"
+                       "OpBranchConditional %90 %91 %92\n"
+                       "%91 = OpLabel\n"
+                       "%93 = OpLoad %6 %11\n"
+                       "%94 = OpIAdd %6 %93 %47\n"
+                       "OpStore %11 %94\n"
+                       "OpBranch %92\n"
+                       "%92 = OpLabel\n"
+                       "%95 = OpLoad %6 %10\n"
+                       "%96 = OpShiftLeftLogical %6 %95 %47\n"
+                       "OpStore %10 %96\n"
+                       "OpBranch %53\n"
+                       "%53 = OpLabel\n"
+                       "%97 = OpLoad %6 %49\n"
+                       "%98 = OpIAdd %6 %97 %47\n"
+                       "OpStore %49 %98\n"
+                       "OpBranch %50\n"
+                       "%52 = OpLabel\n"
+                       "%99 = OpLoad %13 %20\n"
+                       "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
+                       "%101 = OpLoad %6 %11\n"
+                       "%102 = OpINotEqual %16 %100 %101\n"
+                       "OpSelectionMerge %104 None\n"
+                       "OpBranchConditional %102 %103 %104\n"
+                       "%103 = OpLabel\n"
+                       "OpStore %8 %12\n"
+                       "OpBranch %104\n"
+                       "%104 = OpLabel\n"
+                       "%108 = OpLoad %6 %8\n"
+                       "%109 = OpConvertUToF %105 %108\n"
+                       "OpStore %107 %109\n"
+                       "%122 = OpAccessChain %121 %120 %115 %115\n"
+                       "%123 = OpLoad %110 %122\n"
+                       "%124 = OpAccessChain %121 %120 %47 %115\n"
+                       "%125 = OpLoad %110 %124\n"
+                       "%130 = OpAccessChain %129 %128 %12\n"
+                       "%131 = OpLoad %105 %130\n"
+                       "%132 = OpCompositeConstruct %110 %131 %131 %131 %131\n"
+                       "%133 = OpExtInst %110 %1 FMix %123 %125 %132\n"
+                       "%135 = OpAccessChain %134 %114 %115\n"
+                       "OpStore %135 %133\n"
                        "OpReturn\n"
                        "OpFunctionEnd\n";
                programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
@@ -524,6 +748,9 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
        else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
        {
                /*
+                       const string bdy = subgroupMask(caseDef);
+                       const string  controlSource =
+                       "#version 450\n"
                        "#extension GL_EXT_tessellation_shader : require\n"
                        "#extension GL_KHR_shader_subgroup_ballot: enable\n"
                        "layout(vertices = 2) out;\n"
@@ -531,50 +758,51 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "void main (void)\n"
                        "{\n"
                        "  if (gl_InvocationID == 0)\n"
-                         {\n"
+                       "  {\n"
                        "    gl_TessLevelOuter[0] = 1.0f;\n"
                        "    gl_TessLevelOuter[1] = 1.0f;\n"
                        "  }\n"
-                       bdy.str()
+                       + bdy +
                        "  out_color[gl_InvocationID] = float(tempResult);\n"
                        "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
-                       "}\n";;
+                       "}\n";
+                       programCollection.glslSources.add("tesc")
+                       << glu::TessellationControlSource(controlSource) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
                */
-
                const string controlSource =
                        "; SPIR-V\n"
                        "; Version: 1.3\n"
                        "; Generator: Khronos Glslang Reference Front End; 2\n"
-                       "; Bound: 89\n"
+                       "; Bound: 146\n"
                        "; Schema: 0\n"
                        "OpCapability Tessellation\n"
                        "OpCapability GroupNonUniform\n"
                        "OpCapability GroupNonUniformBallot\n"
                        "%1 = OpExtInstImport \"GLSL.std.450\"\n"
                        "OpMemoryModel Logical GLSL450\n"
-                       "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %37 %48 %52 %66 %76 %82\n"
+                       "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %40 %50 %54 %123 %133 %139\n"
                        "OpExecutionMode %4 OutputVertices 2\n"
                        "OpDecorate %8 BuiltIn InvocationId\n"
                        "OpDecorate %20 Patch\n"
                        "OpDecorate %20 BuiltIn TessLevelOuter\n"
                        + mask +
-                       "OpDecorate %48 RelaxedPrecision\n"
-                       "OpDecorate %48 BuiltIn SubgroupSize\n"
-                       "OpDecorate %49 RelaxedPrecision\n"
-                       "OpDecorate %52 RelaxedPrecision\n"
-                       "OpDecorate %52 BuiltIn SubgroupLocalInvocationId\n"
-                       "OpDecorate %53 RelaxedPrecision\n"
-                       "OpDecorate %66 Location 0\n"
-                       "OpMemberDecorate %73 0 BuiltIn Position\n"
-                       "OpMemberDecorate %73 1 BuiltIn PointSize\n"
-                       "OpMemberDecorate %73 2 BuiltIn ClipDistance\n"
-                       "OpMemberDecorate %73 3 BuiltIn CullDistance\n"
-                       "OpDecorate %73 Block\n"
-                       "OpMemberDecorate %78 0 BuiltIn Position\n"
-                       "OpMemberDecorate %78 1 BuiltIn PointSize\n"
-                       "OpMemberDecorate %78 2 BuiltIn ClipDistance\n"
-                       "OpMemberDecorate %78 3 BuiltIn CullDistance\n"
-                       "OpDecorate %78 Block\n"
+                       "OpDecorate %50 RelaxedPrecision\n"
+                       "OpDecorate %50 BuiltIn SubgroupSize\n"
+                       "OpDecorate %51 RelaxedPrecision\n"
+                       "OpDecorate %54 RelaxedPrecision\n"
+                       "OpDecorate %54 BuiltIn SubgroupLocalInvocationId\n"
+                       "OpDecorate %55 RelaxedPrecision\n"
+                       "OpDecorate %123 Location 0\n"
+                       "OpMemberDecorate %130 0 BuiltIn Position\n"
+                       "OpMemberDecorate %130 1 BuiltIn PointSize\n"
+                       "OpMemberDecorate %130 2 BuiltIn ClipDistance\n"
+                       "OpMemberDecorate %130 3 BuiltIn CullDistance\n"
+                       "OpDecorate %130 Block\n"
+                       "OpMemberDecorate %135 0 BuiltIn Position\n"
+                       "OpMemberDecorate %135 1 BuiltIn PointSize\n"
+                       "OpMemberDecorate %135 2 BuiltIn ClipDistance\n"
+                       "OpMemberDecorate %135 3 BuiltIn CullDistance\n"
+                       "OpDecorate %135 Block\n"
                        "%2 = OpTypeVoid\n"
                        "%3 = OpTypeFunction %2\n"
                        "%6 = OpTypeInt 32 1\n"
@@ -593,39 +821,43 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "%24 = OpConstant %6 1\n"
                        "%26 = OpTypePointer Function %16\n"
                        "%28 = OpConstant %16 1\n"
-                       "%29 = OpTypeVector %16 4\n"
-                       "%30 = OpTypePointer Function %29\n"
-                       "%32 = OpConstantTrue %11\n"
-                       "%33 = OpConstant %16 3\n"
-                       "%36 = OpTypePointer Input %29\n"
-                       "%37 = OpVariable %36 Input\n"
-                       "%40 = OpConstant %16 0\n"
-                       "%47 = OpTypePointer Input %16\n"
-                       "%48 = OpVariable %47 Input\n"
-                       "%52 = OpVariable %47 Input\n"
-                       "%63 = OpConstant %16 2\n"
-                       "%64 = OpTypeArray %15 %63\n"
-                       "%65 = OpTypePointer Output %64\n"
-                       "%66 = OpVariable %65 Output\n"
-                       "%71 = OpTypeVector %15 4\n"
-                       "%72 = OpTypeArray %15 %28\n"
-                       "%73 = OpTypeStruct %71 %15 %72 %72\n"
-                       "%74 = OpTypeArray %73 %63\n"
-                       "%75 = OpTypePointer Output %74\n"
-                       "%76 = OpVariable %75 Output\n"
-                       "%78 = OpTypeStruct %71 %15 %72 %72\n"
-                       "%79 = OpConstant %16 32\n"
-                       "%80 = OpTypeArray %78 %79\n"
-                       "%81 = OpTypePointer Input %80\n"
-                       "%82 = OpVariable %81 Input\n"
-                       "%84 = OpTypePointer Input %71\n"
-                       "%87 = OpTypePointer Output %71\n"
+                       "%31 = OpConstant %16 0\n"
+                       "%32 = OpTypeVector %16 4\n"
+                       "%33 = OpTypePointer Function %32\n"
+                       "%35 = OpConstantTrue %11\n"
+                       "%36 = OpConstant %16 3\n"
+                       "%39 = OpTypePointer Input %32\n"
+                       "%40 = OpVariable %39 Input\n"
+                       "%49 = OpTypePointer Input %16\n"
+                       "%50 = OpVariable %49 Input\n"
+                       "%54 = OpVariable %49 Input\n"
+                       "%72 = OpConstant %16 32\n"
+                       "%92 = OpConstant %16 2\n"
+                       "%121 = OpTypeArray %15 %92\n"
+                       "%122 = OpTypePointer Output %121\n"
+                       "%123 = OpVariable %122 Output\n"
+                       "%128 = OpTypeVector %15 4\n"
+                       "%129 = OpTypeArray %15 %28\n"
+                       "%130 = OpTypeStruct %128 %15 %129 %129\n"
+                       "%131 = OpTypeArray %130 %92\n"
+                       "%132 = OpTypePointer Output %131\n"
+                       "%133 = OpVariable %132 Output\n"
+                       "%135 = OpTypeStruct %128 %15 %129 %129\n"
+                       "%136 = OpConstant %16 32\n"
+                       "%137 = OpTypeArray %135 %136\n"
+                       "%138 = OpTypePointer Input %137\n"
+                       "%139 = OpVariable %138 Input\n"
+                       "%141 = OpTypePointer Input %128\n"
+                       "%144 = OpTypePointer Output %128\n"
                        "%4 = OpFunction %2 None %3\n"
                        "%5 = OpLabel\n"
                        "%27 = OpVariable %26 Function\n"
-                       "%31 = OpVariable %30 Function\n"
-                       "%35 = OpVariable %30 Function\n"
-                       "%39 = OpVariable %26 Function\n"
+                       "%29 = OpVariable %26 Function\n"
+                       "%30 = OpVariable %26 Function\n"
+                       "%34 = OpVariable %33 Function\n"
+                       "%38 = OpVariable %33 Function\n"
+                       "%42 = OpVariable %26 Function\n"
+                       "%65 = OpVariable %26 Function\n"
                        "%9 = OpLoad %6 %8\n"
                        "%12 = OpIEqual %11 %9 %10\n"
                        "OpSelectionMerge %14 None\n"
@@ -638,52 +870,136 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
                        "OpBranch %14\n"
                        "%14 = OpLabel\n"
                        "OpStore %27 %28\n"
-                       "%34 = OpGroupNonUniformBallot %29 %33 %32\n"
-                       "OpStore %31 %34\n"
-                       "%38 = OpLoad %29 %37\n"
-                       "OpStore %35 %38\n"
-                       "OpStore %39 %40\n"
-                       "OpBranch %41\n"
-                       "%41 = OpLabel\n"
-                       "OpLoopMerge %43 %44 None\n"
-                       "OpBranch %45\n"
-                       "%45 = OpLabel\n"
-                       "%46 = OpLoad %16 %39\n"
-                       "%49 = OpLoad %16 %48\n"
-                       "%50 = OpULessThan %11 %46 %49\n"
-                       "OpBranchConditional %50 %42 %43\n"
-                       "%42 = OpLabel\n"
-                       "%51 = OpLoad %16 %39\n"
-                       "%53 = OpLoad %16 %52\n"
-                       + comparison +
-                       "%55 = OpLoad %29 %35\n"
-                       "%56 = OpLoad %16 %39\n"
-                       "%57 = OpGroupNonUniformBallotBitExtract %11 %33 %55 %56\n"
-                       "%58 = OpLogicalNotEqual %11 %54 %57\n"
-                       "OpSelectionMerge %60 None\n"
-                       "OpBranchConditional %58 %59 %60\n"
-                       "%59 = OpLabel\n"
-                       "OpStore %27 %40\n"
-                       "OpBranch %60\n"
-                       "%60 = OpLabel\n"
-                       "OpBranch %44\n"
-                       "%44 = OpLabel\n"
-                       "%61 = OpLoad %16 %39\n"
-                       "%62 = OpIAdd %16 %61 %24\n"
-                       "OpStore %39 %62\n"
-                       "OpBranch %41\n"
+                       "OpStore %29 %28\n"
+                       "OpStore %30 %31\n"
+                       "%37 = OpGroupNonUniformBallot %32 %36 %35\n"
+                       "OpStore %34 %37\n"
+                       "%41 = OpLoad %32 %40\n"
+                       "OpStore %38 %41\n"
+                       "OpStore %42 %31\n"
+                       "OpBranch %43\n"
                        "%43 = OpLabel\n"
-                       "%67 = OpLoad %6 %8\n"
-                       "%68 = OpLoad %16 %27\n"
-                       "%69 = OpConvertUToF %15 %68\n"
-                       "%70 = OpAccessChain %22 %66 %67\n"
-                       "OpStore %70 %69\n"
-                       "%77 = OpLoad %6 %8\n"
-                       "%83 = OpLoad %6 %8\n"
-                       "%85 = OpAccessChain %84 %82 %83 %10\n"
-                       "%86 = OpLoad %71 %85\n"
-                       "%88 = OpAccessChain %87 %76 %77 %10\n"
-                       "OpStore %88 %86\n"
+                       "OpLoopMerge %45 %46 None\n"
+                       "OpBranch %47\n"
+                       "%47 = OpLabel\n"
+                       "%48 = OpLoad %16 %42\n"
+                       "%51 = OpLoad %16 %50\n"
+                       "%52 = OpULessThan %11 %48 %51\n"
+                       "OpBranchConditional %52 %44 %45\n"
+                       "%44 = OpLabel\n"
+                       "%53 = OpLoad %16 %42\n"
+                       "%55 = OpLoad %16 %54\n"
+                       + comparison +
+                       "%57 = OpLoad %32 %38\n"
+                       "%58 = OpLoad %16 %42\n"
+                       "%59 = OpGroupNonUniformBallotBitExtract %11 %36 %57 %58\n"
+                       "%60 = OpLogicalNotEqual %11 %56 %59\n"
+                       "OpSelectionMerge %62 None\n"
+                       "OpBranchConditional %60 %61 %62\n"
+                       "%61 = OpLabel\n"
+                       "OpStore %27 %31\n"
+                       "OpBranch %62\n"
+                       "%62 = OpLabel\n"
+                       "OpBranch %46\n"
+                       "%46 = OpLabel\n"
+                       "%63 = OpLoad %16 %42\n"
+                       "%64 = OpIAdd %16 %63 %24\n"
+                       "OpStore %42 %64\n"
+                       "OpBranch %43\n"
+                       "%45 = OpLabel\n"
+                       "OpStore %65 %31\n"
+                       "OpBranch %66\n"
+                       "%66 = OpLabel\n"
+                       "OpLoopMerge %68 %69 None\n"
+                       "OpBranch %70\n"
+                       "%70 = OpLabel\n"
+                       "%71 = OpLoad %16 %65\n"
+                       "%73 = OpULessThan %11 %71 %72\n"
+                       "OpBranchConditional %73 %67 %68\n"
+                       "%67 = OpLabel\n"
+                       "%74 = OpAccessChain %26 %38 %31\n"
+                       "%75 = OpLoad %16 %74\n"
+                       "%76 = OpLoad %16 %29\n"
+                       "%77 = OpBitwiseAnd %16 %75 %76\n"
+                       "%78 = OpUGreaterThan %11 %77 %31\n"
+                       "OpSelectionMerge %80 None\n"
+                       "OpBranchConditional %78 %79 %80\n"
+                       "%79 = OpLabel\n"
+                       "%81 = OpLoad %16 %30\n"
+                       "%82 = OpIAdd %16 %81 %24\n"
+                       "OpStore %30 %82\n"
+                       "OpBranch %80\n"
+                       "%80 = OpLabel\n"
+                       "%83 = OpAccessChain %26 %38 %28\n"
+                       "%84 = OpLoad %16 %83\n"
+                       "%85 = OpLoad %16 %29\n"
+                       "%86 = OpBitwiseAnd %16 %84 %85\n"
+                       "%87 = OpUGreaterThan %11 %86 %31\n"
+                       "OpSelectionMerge %89 None\n"
+                       "OpBranchConditional %87 %88 %89\n"
+                       "%88 = OpLabel\n"
+                       "%90 = OpLoad %16 %30\n"
+                       "%91 = OpIAdd %16 %90 %24\n"
+                       "OpStore %30 %91\n"
+                       "OpBranch %89\n"
+                       "%89 = OpLabel\n"
+                       "%93 = OpAccessChain %26 %38 %92\n"
+                       "%94 = OpLoad %16 %93\n"
+                       "%95 = OpLoad %16 %29\n"
+                       "%96 = OpBitwiseAnd %16 %94 %95\n"
+                       "%97 = OpUGreaterThan %11 %96 %31\n"
+                       "OpSelectionMerge %99 None\n"
+                       "OpBranchConditional %97 %98 %99\n"
+                       "%98 = OpLabel\n"
+                       "%100 = OpLoad %16 %30\n"
+                       "%101 = OpIAdd %16 %100 %24\n"
+                       "OpStore %30 %101\n"
+                       "OpBranch %99\n"
+                       "%99 = OpLabel\n"
+                       "%102 = OpAccessChain %26 %38 %36\n"
+                       "%103 = OpLoad %16 %102\n"
+                       "%104 = OpLoad %16 %29\n"
+                       "%105 = OpBitwiseAnd %16 %103 %104\n"
+                       "%106 = OpUGreaterThan %11 %105 %31\n"
+                       "OpSelectionMerge %108 None\n"
+                       "OpBranchConditional %106 %107 %108\n"
+                       "%107 = OpLabel\n"
+                       "%109 = OpLoad %16 %30\n"
+                       "%110 = OpIAdd %16 %109 %24\n"
+                       "OpStore %30 %110\n"
+                       "OpBranch %108\n"
+                       "%108 = OpLabel\n"
+                       "%111 = OpLoad %16 %29\n"
+                       "%112 = OpShiftLeftLogical %16 %111 %24\n"
+                       "OpStore %29 %112\n"
+                       "OpBranch %69\n"
+                       "%69 = OpLabel\n"
+                       "%113 = OpLoad %16 %65\n"
+                       "%114 = OpIAdd %16 %113 %24\n"
+                       "OpStore %65 %114\n"
+                       "OpBranch %66\n"
+                       "%68 = OpLabel\n"
+                       "%115 = OpLoad %32 %38\n"
+                       "%116 = OpGroupNonUniformBallotBitCount %16 %36 Reduce %115\n"
+                       "%117 = OpLoad %16 %30\n"
+                       "%118 = OpINotEqual %11 %116 %117\n"
+                       "OpSelectionMerge %120 None\n"
+                       "OpBranchConditional %118 %119 %120\n"
+                       "%119 = OpLabel\n"
+                       "OpStore %27 %31\n"
+                       "OpBranch %120\n"
+                       "%120 = OpLabel\n"
+                       "%124 = OpLoad %6 %8\n"
+                       "%125 = OpLoad %16 %27\n"
+                       "%126 = OpConvertUToF %15 %125\n"
+                       "%127 = OpAccessChain %22 %123 %124\n"
+                       "OpStore %127 %126\n"
+                       "%134 = OpLoad %6 %8\n"
+                       "%140 = OpLoad %6 %8\n"
+                       "%142 = OpAccessChain %141 %139 %140 %10\n"
+                       "%143 = OpLoad %128 %142\n"
+                       "%145 = OpAccessChain %144 %133 %134 %10\n"
+                       "OpStore %145 %143\n"
                        "OpReturn\n"
                        "OpFunctionEnd\n";
                programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
@@ -691,126 +1007,236 @@ void initFrameBufferPrograms(SourceCollections& programCollection, CaseDefinitio
        }
        else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
        {
+               /*
+               const string bdy = subgroupMask(caseDef);
                const string geometry =
-                       "; SPIR-V\n"
-                       "; Version: 1.3\n"
-                       "; Generator: Khronos Glslang Reference Front End; 2\n"
-                       "; Bound: 67\n"
-                       "; Schema: 0\n"
-                       "OpCapability Geometry\n"
-                       "OpCapability GroupNonUniform\n"
-                       "OpCapability GroupNonUniformBallot\n"
-                       "%1 = OpExtInstImport \"GLSL.std.450\"\n"
-                       "OpMemoryModel Logical GLSL450\n"
-                       "OpEntryPoint Geometry %4 \"main\" %19 %30 %34 %49 %56 %61\n"
-                       "OpExecutionMode %4 InputPoints\n"
-                       "OpExecutionMode %4 Invocations 1\n"
-                       "OpExecutionMode %4 OutputPoints\n"
-                       "OpExecutionMode %4 OutputVertices 1\n"
-                       + mask +
-                       "OpDecorate %30 RelaxedPrecision\n"
-                       "OpDecorate %30 BuiltIn SubgroupSize\n"
-                       "OpDecorate %31 RelaxedPrecision\n"
-                       "OpDecorate %34 RelaxedPrecision\n"
-                       "OpDecorate %34 BuiltIn SubgroupLocalInvocationId\n"
-                       "OpDecorate %35 RelaxedPrecision\n"
-                       "OpDecorate %49 Location 0\n"
-                       "OpMemberDecorate %54 0 BuiltIn Position\n"
-                       "OpMemberDecorate %54 1 BuiltIn PointSize\n"
-                       "OpMemberDecorate %54 2 BuiltIn ClipDistance\n"
-                       "OpMemberDecorate %54 3 BuiltIn CullDistance\n"
-                       "OpDecorate %54 Block\n"
-                       "OpMemberDecorate %58 0 BuiltIn Position\n"
-                       "OpMemberDecorate %58 1 BuiltIn PointSize\n"
-                       "OpMemberDecorate %58 2 BuiltIn ClipDistance\n"
-                       "OpMemberDecorate %58 3 BuiltIn CullDistance\n"
-                       "OpDecorate %58 Block\n"
-                       "%2 = OpTypeVoid\n"
-                       "%3 = OpTypeFunction %2\n"
-                       "%6 = OpTypeInt 32 0\n"
-                       "%7 = OpTypePointer Function %6\n"
-                       "%9 = OpConstant %6 1\n"
-                       "%10 = OpTypeVector %6 4\n"
-                       "%11 = OpTypePointer Function %10\n"
-                       "%13 = OpTypeBool\n"
-                       "%14 = OpConstantTrue %13\n"
-                       "%15 = OpConstant %6 3\n"
-                       "%18 = OpTypePointer Input %10\n"
-                       "%19 = OpVariable %18 Input\n"
-                       "%22 = OpConstant %6 0\n"
-                       "%29 = OpTypePointer Input %6\n"
-                       "%30 = OpVariable %29 Input\n"
-                       "%34 = OpVariable %29 Input\n"
-                       "%44 = OpTypeInt 32 1\n"
-                       "%45 = OpConstant %44 1\n"
-                       "%47 = OpTypeFloat 32\n"
-                       "%48 = OpTypePointer Output %47\n"
-                       "%49 = OpVariable %48 Output\n"
-                       "%52 = OpTypeVector %47 4\n"
-                       "%53 = OpTypeArray %47 %9\n"
-                       "%54 = OpTypeStruct %52 %47 %53 %53\n"
-                       "%55 = OpTypePointer Output %54\n"
-                       "%56 = OpVariable %55 Output\n"
-                       "%57 = OpConstant %44 0\n"
-                       "%58 = OpTypeStruct %52 %47 %53 %53\n"
-                       "%59 = OpTypeArray %58 %9\n"
-                       "%60 = OpTypePointer Input %59\n"
-                       "%61 = OpVariable %60 Input\n"
-                       "%62 = OpTypePointer Input %52\n"
-                       "%65 = OpTypePointer Output %52\n"
-                       "%4 = OpFunction %2 None %3\n"
-                       "%5 = OpLabel\n"
-                       "%8 = OpVariable %7 Function\n"
-                       "%12 = OpVariable %11 Function\n"
-                       "%17 = OpVariable %11 Function\n"
-                       "%21 = OpVariable %7 Function\n"
-                       "OpStore %8 %9\n"
-                       "%16 = OpGroupNonUniformBallot %10 %15 %14\n"
-                       "OpStore %12 %16\n"
-                       "%20 = OpLoad %10 %19\n"
-                       "OpStore %17 %20\n"
-                       "OpStore %21 %22\n"
-                       "OpBranch %23\n"
-                       "%23 = OpLabel\n"
-                       "OpLoopMerge %25 %26 None\n"
-                       "OpBranch %27\n"
-                       "%27 = OpLabel\n"
-                       "%28 = OpLoad %6 %21\n"
-                       "%31 = OpLoad %6 %30\n"
-                       "%32 = OpULessThan %13 %28 %31\n"
-                       "OpBranchConditional %32 %24 %25\n"
-                       "%24 = OpLabel\n"
-                       "%33 = OpLoad %6 %21\n"
-                       "%35 = OpLoad %6 %34\n"
-                       + comparison +
-                       "%37 = OpLoad %10 %17\n"
-                       "%38 = OpLoad %6 %21\n"
-                       "%39 = OpGroupNonUniformBallotBitExtract %13 %15 %37 %38\n"
-                       "%40 = OpLogicalNotEqual %13 %36 %39\n"
-                       "OpSelectionMerge %42 None\n"
-                       "OpBranchConditional %40 %41 %42\n"
-                       "%41 = OpLabel\n"
-                       "OpStore %8 %22\n"
-                       "OpBranch %42\n"
-                       "%42 = OpLabel\n"
-                       "OpBranch %26\n"
-                       "%26 = OpLabel\n"
-                       "%43 = OpLoad %6 %21\n"
-                       "%46 = OpIAdd %6 %43 %45\n"
-                       "OpStore %21 %46\n"
-                       "OpBranch %23\n"
-                       "%25 = OpLabel\n"
-                       "%50 = OpLoad %6 %8\n"
-                       "%51 = OpConvertUToF %47 %50\n"
-                       "OpStore %49 %51\n"
-                       "%63 = OpAccessChain %62 %61 %57 %57\n"
-                       "%64 = OpLoad %52 %63\n"
-                       "%66 = OpAccessChain %65 %56 %57\n"
-                       "OpStore %66 %64\n"
-                       "OpEmitVertex\n"
-                       "OpEndPrimitive\n"
-                       "OpReturn\n"
-                       "OpFunctionEnd\n";
+               "#version 450\n"
+               "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+               "layout(points) in;\n"
+               "layout(points, max_vertices = 1) out;\n"
+               "layout(location = 0) out float out_color;\n"
+               "\n"
+               "void main (void)\n"
+               "{\n"
+               + bdy +
+               "  out_color = float(tempResult);\n"
+               "  gl_Position = gl_in[0].gl_Position;\n"
+               "  EmitVertex();\n"
+               "  EndPrimitive();\n"
+               "}\n";
+               programCollection.glslSources.add("geometry")
+                       << glu::GeometrySource(geometry) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+               */
+
+               const string geometry =
+               "; SPIR-V\n"
+               "; Version: 1.3\n"
+               "; Generator: Khronos Glslang Reference Front End; 2\n"
+               "; Bound: 125\n"
+               "; Schema: 0\n"
+               "OpCapability Geometry\n"
+               "OpCapability GroupNonUniform\n"
+               "OpCapability GroupNonUniformBallot\n"
+               "%1 = OpExtInstImport \"GLSL.std.450\"\n"
+               "OpMemoryModel Logical GLSL450\n"
+               "OpEntryPoint Geometry %4 \"main\" %22 %32 %36 %107 %114 %119\n"
+               "OpExecutionMode %4 InputPoints\n"
+               "OpExecutionMode %4 Invocations 1\n"
+               "OpExecutionMode %4 OutputPoints\n"
+               "OpExecutionMode %4 OutputVertices 1\n"
+               + mask +
+               "OpDecorate %32 RelaxedPrecision\n"
+               "OpDecorate %32 BuiltIn SubgroupSize\n"
+               "OpDecorate %33 RelaxedPrecision\n"
+               "OpDecorate %36 RelaxedPrecision\n"
+               "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
+               "OpDecorate %37 RelaxedPrecision\n"
+               "OpDecorate %107 Location 0\n"
+               "OpMemberDecorate %112 0 BuiltIn Position\n"
+               "OpMemberDecorate %112 1 BuiltIn PointSize\n"
+               "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
+               "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
+               "OpDecorate %112 Block\n"
+               "OpMemberDecorate %116 0 BuiltIn Position\n"
+               "OpMemberDecorate %116 1 BuiltIn PointSize\n"
+               "OpMemberDecorate %116 2 BuiltIn ClipDistance\n"
+               "OpMemberDecorate %116 3 BuiltIn CullDistance\n"
+               "OpDecorate %116 Block\n"
+               "%2 = OpTypeVoid\n"
+               "%3 = OpTypeFunction %2\n"
+               "%6 = OpTypeInt 32 0\n"
+               "%7 = OpTypePointer Function %6\n"
+               "%9 = OpConstant %6 1\n"
+               "%12 = OpConstant %6 0\n"
+               "%13 = OpTypeVector %6 4\n"
+               "%14 = OpTypePointer Function %13\n"
+               "%16 = OpTypeBool\n"
+               "%17 = OpConstantTrue %16\n"
+               "%18 = OpConstant %6 3\n"
+               "%21 = OpTypePointer Input %13\n"
+               "%22 = OpVariable %21 Input\n"
+               "%31 = OpTypePointer Input %6\n"
+               "%32 = OpVariable %31 Input\n"
+               "%36 = OpVariable %31 Input\n"
+               "%46 = OpTypeInt 32 1\n"
+               "%47 = OpConstant %46 1\n"
+               "%56 = OpConstant %6 32\n"
+               "%76 = OpConstant %6 2\n"
+               "%105 = OpTypeFloat 32\n"
+               "%106 = OpTypePointer Output %105\n"
+               "%107 = OpVariable %106 Output\n"
+               "%110 = OpTypeVector %105 4\n"
+               "%111 = OpTypeArray %105 %9\n"
+               "%112 = OpTypeStruct %110 %105 %111 %111\n"
+               "%113 = OpTypePointer Output %112\n"
+               "%114 = OpVariable %113 Output\n"
+               "%115 = OpConstant %46 0\n"
+               "%116 = OpTypeStruct %110 %105 %111 %111\n"
+               "%117 = OpTypeArray %116 %9\n"
+               "%118 = OpTypePointer Input %117\n"
+               "%119 = OpVariable %118 Input\n"
+               "%120 = OpTypePointer Input %110\n"
+               "%123 = OpTypePointer Output %110\n"
+               "%4 = OpFunction %2 None %3\n"
+               "%5 = OpLabel\n"
+               "%8 = OpVariable %7 Function\n"
+               "%10 = OpVariable %7 Function\n"
+               "%11 = OpVariable %7 Function\n"
+               "%15 = OpVariable %14 Function\n"
+               "%20 = OpVariable %14 Function\n"
+               "%24 = OpVariable %7 Function\n"
+               "%49 = OpVariable %7 Function\n"
+               "OpStore %8 %9\n"
+               "OpStore %10 %9\n"
+               "OpStore %11 %12\n"
+               "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
+               "OpStore %15 %19\n"
+               "%23 = OpLoad %13 %22\n"
+               "OpStore %20 %23\n"
+               "OpStore %24 %12\n"
+               "OpBranch %25\n"
+               "%25 = OpLabel\n"
+               "OpLoopMerge %27 %28 None\n"
+               "OpBranch %29\n"
+               "%29 = OpLabel\n"
+               "%30 = OpLoad %6 %24\n"
+               "%33 = OpLoad %6 %32\n"
+               "%34 = OpULessThan %16 %30 %33\n"
+               "OpBranchConditional %34 %26 %27\n"
+               "%26 = OpLabel\n"
+               "%35 = OpLoad %6 %24\n"
+               "%37 = OpLoad %6 %36\n"
+               + comparison +
+               "%39 = OpLoad %13 %20\n"
+               "%40 = OpLoad %6 %24\n"
+               "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
+               "%42 = OpLogicalNotEqual %16 %38 %41\n"
+               "OpSelectionMerge %44 None\n"
+               "OpBranchConditional %42 %43 %44\n"
+               "%43 = OpLabel\n"
+               "OpStore %8 %12\n"
+               "OpBranch %44\n"
+               "%44 = OpLabel\n"
+               "OpBranch %28\n"
+               "%28 = OpLabel\n"
+               "%45 = OpLoad %6 %24\n"
+               "%48 = OpIAdd %6 %45 %47\n"
+               "OpStore %24 %48\n"
+               "OpBranch %25\n"
+               "%27 = OpLabel\n"
+               "OpStore %49 %12\n"
+               "OpBranch %50\n"
+               "%50 = OpLabel\n"
+               "OpLoopMerge %52 %53 None\n"
+               "OpBranch %54\n"
+               "%54 = OpLabel\n"
+               "%55 = OpLoad %6 %49\n"
+               "%57 = OpULessThan %16 %55 %56\n"
+               "OpBranchConditional %57 %51 %52\n"
+               "%51 = OpLabel\n"
+               "%58 = OpAccessChain %7 %20 %12\n"
+               "%59 = OpLoad %6 %58\n"
+               "%60 = OpLoad %6 %10\n"
+               "%61 = OpBitwiseAnd %6 %59 %60\n"
+               "%62 = OpUGreaterThan %16 %61 %12\n"
+               "OpSelectionMerge %64 None\n"
+               "OpBranchConditional %62 %63 %64\n"
+               "%63 = OpLabel\n"
+               "%65 = OpLoad %6 %11\n"
+               "%66 = OpIAdd %6 %65 %47\n"
+               "OpStore %11 %66\n"
+               "OpBranch %64\n"
+               "%64 = OpLabel\n"
+               "%67 = OpAccessChain %7 %20 %9\n"
+               "%68 = OpLoad %6 %67\n"
+               "%69 = OpLoad %6 %10\n"
+               "%70 = OpBitwiseAnd %6 %68 %69\n"
+               "%71 = OpUGreaterThan %16 %70 %12\n"
+               "OpSelectionMerge %73 None\n"
+               "OpBranchConditional %71 %72 %73\n"
+               "%72 = OpLabel\n"
+               "%74 = OpLoad %6 %11\n"
+               "%75 = OpIAdd %6 %74 %47\n"
+               "OpStore %11 %75\n"
+               "OpBranch %73\n"
+               "%73 = OpLabel\n"
+               "%77 = OpAccessChain %7 %20 %76\n"
+               "%78 = OpLoad %6 %77\n"
+               "%79 = OpLoad %6 %10\n"
+               "%80 = OpBitwiseAnd %6 %78 %79\n"
+               "%81 = OpUGreaterThan %16 %80 %12\n"
+               "OpSelectionMerge %83 None\n"
+               "OpBranchConditional %81 %82 %83\n"
+               "%82 = OpLabel\n"
+               "%84 = OpLoad %6 %11\n"
+               "%85 = OpIAdd %6 %84 %47\n"
+               "OpStore %11 %85\n"
+               "OpBranch %83\n"
+               "%83 = OpLabel\n"
+               "%86 = OpAccessChain %7 %20 %18\n"
+               "%87 = OpLoad %6 %86\n"
+               "%88 = OpLoad %6 %10\n"
+               "%89 = OpBitwiseAnd %6 %87 %88\n"
+               "%90 = OpUGreaterThan %16 %89 %12\n"
+               "OpSelectionMerge %92 None\n"
+               "OpBranchConditional %90 %91 %92\n"
+               "%91 = OpLabel\n"
+               "%93 = OpLoad %6 %11\n"
+               "%94 = OpIAdd %6 %93 %47\n"
+               "OpStore %11 %94\n"
+               "OpBranch %92\n"
+               "%92 = OpLabel\n"
+               "%95 = OpLoad %6 %10\n"
+               "%96 = OpShiftLeftLogical %6 %95 %47\n"
+               "OpStore %10 %96\n"
+               "OpBranch %53\n"
+               "%53 = OpLabel\n"
+               "%97 = OpLoad %6 %49\n"
+               "%98 = OpIAdd %6 %97 %47\n"
+               "OpStore %49 %98\n"
+               "OpBranch %50\n"
+               "%52 = OpLabel\n"
+               "%99 = OpLoad %13 %20\n"
+               "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
+               "%101 = OpLoad %6 %11\n"
+               "%102 = OpINotEqual %16 %100 %101\n"
+               "OpSelectionMerge %104 None\n"
+               "OpBranchConditional %102 %103 %104\n"
+               "%103 = OpLabel\n"
+               "OpStore %8 %12\n"
+               "OpBranch %104\n"
+               "%104 = OpLabel\n"
+               "%108 = OpLoad %6 %8\n"
+               "%109 = OpConvertUToF %105 %108\n"
+               "OpStore %107 %109\n"
+               "%121 = OpAccessChain %120 %119 %115 %115\n"
+               "%122 = OpLoad %110 %121\n"
+               "%124 = OpAccessChain %123 %114 %115\n"
+               "OpStore %124 %122\n"
+               "OpEmitVertex\n"
+               "OpEndPrimitive\n"
+               "OpReturn\n"
+               "OpFunctionEnd\n";
        programCollection.spirvAsmSources.add("geometry") << geometry << buildOptionsSpr;
        }
        else
index 286f8bc..15eea6e 100644 (file)
@@ -2753,7 +2753,7 @@ tcu::TestStatus vkt::subgroups::makeFragmentFrameBufferTest       (Context& context, V
        const Unique<VkRenderPass> renderPass(makeRenderPass(context, format));
        const Unique<VkPipeline> pipeline(makeGraphicsPipeline(context, *pipelineLayout,
                                                                          VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
-                                                                         *vertexShaderModule, *fragmentShaderModule, DE_NULL, DE_NULL, DE_NULL, *renderPass, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
+                                                                         *vertexShaderModule, *fragmentShaderModule, DE_NULL, DE_NULL, DE_NULL, *renderPass, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
                                                                          DE_NULL, DE_NULL, true));
 
        DescriptorPoolBuilder poolBuilder;
@@ -2877,7 +2877,7 @@ tcu::TestStatus vkt::subgroups::makeFragmentFrameBufferTest       (Context& context, V
                                                &descriptorSet.get(), 0u, DE_NULL);
                        }
 
-                       context.getDeviceInterface().cmdDraw(*cmdBuffer, 3, 1, 0, 0);
+                       context.getDeviceInterface().cmdDraw(*cmdBuffer, 4, 1, 0, 0);
 
                        context.getDeviceInterface().cmdEndRenderPass(*cmdBuffer);
 
index a04c8b8..fed38d0 100644 (file)
@@ -52,7 +52,7 @@ static bool checkVertexPipelineStages(std::vector<const void*> datas,
        {
                deUint32 val = data[x];
 
-               if (0x7 != val)
+               if (0x1F != val)
                {
                        return false;
                }
@@ -61,6 +61,33 @@ static bool checkVertexPipelineStages(std::vector<const void*> datas,
        return true;
 }
 
+static bool checkFragmentPipelineStages(std::vector<const void*> datas,
+                                                                         deUint32 width, deUint32 height, deUint32)
+{
+       const deUint32* data =
+               reinterpret_cast<const deUint32*>(datas[0]);
+       for (deUint32 x = 0u; x < width; ++x)
+       {
+               for (deUint32 y = 0u; y < height; ++y)
+               {
+                       const deUint32 ndx = (x * height + y);
+                       deUint32 val = data[ndx] & 0x1F;
+
+                       if (data[ndx] & 0x40) //Helper fragment shader invocation was executed
+                       {
+                               if(val != 0x1F)
+                                       return false;
+                       }
+                       else //Helper fragment shader invocation was not executed yet
+                       {
+                               if (val != 0x1E)
+                                       return false;
+                       }
+               }
+       }
+       return true;
+}
+
 static bool checkCompute(std::vector<const void*> datas,
                                                 const deUint32 numWorkgroups[3], const deUint32 localSize[3],
                                                 deUint32)
@@ -100,7 +127,7 @@ static bool checkCompute(std::vector<const void*> datas,
                                                                globalInvocationX;
 
                                                        // The data should look (in binary) 0b111
-                                                       if (0x7 != data[offset])
+                                                       if (0x1F != data[offset])
                                                        {
                                                                return false;
                                                        }
@@ -152,8 +179,8 @@ static bool checkComputeAllEqual(std::vector<const void*> datas,
                                                                 globalInvocationY) +
                                                                globalInvocationX;
 
-                                                       // The data should look (in binary) 0b111
-                                                       if (0x7 != data[offset])
+                                                       // The data should look (in binary) 0b11111
+                                                       if (0x1F != data[offset])
                                                        {
                                                                return false;
                                                        }
@@ -192,17 +219,59 @@ struct CaseDefinition
 void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
 {
        const vk::ShaderBuildOptions buildOptions       (vk::SPIRV_VERSION_1_3, 0u);
-       subgroups::setFragmentShaderFrameBuffer(programCollection);
 
-       if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+       if (VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
+               subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+       if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               const string vertex     = "#version 450\n"
+                       "void main (void)\n"
+                       "{\n"
+                       "  vec2 uv = vec2(float(gl_VertexIndex & 1), float((gl_VertexIndex >> 1) & 1));\n"
+                       "  gl_Position = vec4(uv * 4.0f -2.0f, 0.0f, 1.0f);\n"
+                       "  gl_PointSize = 1.0f;\n"
+                       "}\n";
+               programCollection.glslSources.add("vert") << glu::VertexSource(vertex) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+       }
+       else if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
                subgroups::setVertexShaderFrameBuffer(programCollection);
 
+       const string source =
+               (OPTYPE_ALL == caseDef.opType) ?
+                       "  result = " + getOpTypeName(caseDef.opType) +
+                       "(true) ? 0x1 : 0;\n"
+                       "  result |= " + getOpTypeName(caseDef.opType) +
+                       "(false) ? 0 : 0x1A;\n"
+                       "  result |= 0x4;\n"
+               : (OPTYPE_ANY == caseDef.opType) ?
+                               "  result = " + getOpTypeName(caseDef.opType) +
+                               "(true) ? 0x1 : 0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(false) ? 0 : 0x1A;\n"
+                               "  result |= 0x4;\n"
+               : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+                               "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+                               "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((gl_SubgroupInvocationID % 5)%2));\n"
+                               "  result = " + getOpTypeName(caseDef.opType) + "("
+                               + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(data[0]) ? 0x4 : 0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(valueEqual) ? 0x8 : 0x0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(valueNoEqual) ? 0x0 : 0x10;\n"
+                               "  if (subgroupElect()) result |= 0x2 | 0x10;\n"
+               : "";
+
        if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
        {
                std::ostringstream vertexSrc;
                vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
                        << "#extension GL_KHR_shader_subgroup_vote: enable\n"
-                       << "layout(location = 0) out float out_color;\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"
@@ -211,38 +280,14 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "\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";
-               }
-               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";
-               }
-               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";
-               }
-               vertexSrc << "  out_color = float(result);\n"
+                       << "  uint result;\n"
+                       << source
+                       << "  out_color.r = float(result);\n"
                        << "  gl_Position = in_position;\n"
                        << "  gl_PointSize = 1.0f;\n"
                        << "}\n";
-               programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str()) << buildOptions;
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str()) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
        }
        else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
        {
@@ -260,34 +305,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "\n"
                        << "void main (void)\n"
                        << "{\n"
-                       << "  uint result;\n";
-               if (OPTYPE_ALL == caseDef.opType)
-               {
-                       geometry << "  result = " << getOpTypeName(caseDef.opType)
-                               << "(true) ? 0x1 : 0;\n"
-                               << "  result |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
-                               << "  result |= 0x4;\n";
-               }
-               else if (OPTYPE_ANY == caseDef.opType)
-               {
-                       geometry << "  result = " << getOpTypeName(caseDef.opType)
-                               << "(true) ? 0x1 : 0;\n"
-                               << "  result |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
-                               << "  result |= 0x4;\n";
-               }
-               else if (OPTYPE_ALLEQUAL == caseDef.opType)
-               {
-                       geometry << "  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";
-               }
-               geometry << "  out_color = float(result);\n"
+                       << "  uint result;\n"
+                       << source
+                       << "  out_color = float(result);\n"
                        << "  gl_Position = gl_in[0].gl_Position;\n"
                        << "  EmitVertex();\n"
                        << "  EndPrimitive();\n"
@@ -315,34 +335,9 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        <<"  {\n"
                        << "    gl_TessLevelOuter[0] = 1.0f;\n"
                        << "    gl_TessLevelOuter[1] = 1.0f;\n"
-                       << "  }\n";
-               if (OPTYPE_ALL == caseDef.opType)
-               {
-                       controlSource << "  result = " << getOpTypeName(caseDef.opType)
-                               << "(true) ? 0x1 : 0;\n"
-                               << "  result |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
-                               << "  result|= 0x4;\n";
-               }
-               else if (OPTYPE_ANY == caseDef.opType)
-               {
-                       controlSource << "  result = " << getOpTypeName(caseDef.opType)
-                               << "(true) ? 0x1 : 0;\n"
-                               << "  result |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
-                               << "  result |= 0x4;\n";
-               }
-               else if (OPTYPE_ALLEQUAL == caseDef.opType)
-               {
-                       controlSource << "  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";
-               }
-               controlSource << "  out_color[gl_InvocationID] = float(result);"
+                       << "  }\n"
+                       << source
+                       << "  out_color[gl_InvocationID] = float(result);"
                        << "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
                        << "}\n";
 
@@ -366,34 +361,8 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                        << "void main (void)\n"
                        << "{\n"
                        << "  uint result;\n"
-                       << "  highp uint offset = gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5);\n";
-               if (OPTYPE_ALL == caseDef.opType)
-               {
-                       evaluationSource << "  result = " << getOpTypeName(caseDef.opType)
-                               << "(true) ? 0x1 : 0;\n"
-                               << "  result |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
-                               << "  result |= 0x4;\n";
-               }
-               else if (OPTYPE_ANY == caseDef.opType)
-               {
-                       evaluationSource << "  result = " << getOpTypeName(caseDef.opType)
-                               << "(true) ? 0x1 : 0;\n"
-                               << "  result |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
-                               << "  result |= 0x4;\n";
-               }
-               else if (OPTYPE_ALLEQUAL == caseDef.opType)
-               {
-                       evaluationSource << "  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";
-               }
-               evaluationSource
+                       << "  highp uint offset = gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5);\n"
+                       << source
                        << "  out_color = float(result);\n"
                        << "  gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
                        << "}\n";
@@ -402,6 +371,65 @@ void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefiniti
                programCollection.glslSources.add("tese")
                                << glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
        }
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+       {
+               const string sourceFragment =
+               (OPTYPE_ALL == caseDef.opType) ?
+                       "  result |= " + getOpTypeName(caseDef.opType) +
+                       "(!gl_HelperInvocation) ? 0x0 : 0x1;\n"
+                       "  result |= " + getOpTypeName(caseDef.opType) +
+                       "(false) ? 0 : 0x1A;\n"
+                       "  result |= 0x4;\n"
+               : (OPTYPE_ANY == caseDef.opType) ?
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(gl_HelperInvocation) ? 0x1 : 0x0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(false) ? 0 : 0x1A;\n"
+                               "  result |= 0x4;\n"
+               : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+                               "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+                               "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((int(gl_FragCoord.x*gl_SubgroupInvocationID) % 5)%2));\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) + "("
+                               + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x10 : 0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(data[0]) ? 0x4 : 0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(valueEqual) ? 0x8 : 0x0;\n"
+                               "  result |= " + getOpTypeName(caseDef.opType) +
+                               "(gl_HelperInvocation) ? 0x0 : 0x1;\n"
+                               "  if (subgroupElect()) result |= 0x2 | 0x10;\n"
+               : "";
+
+               std::ostringstream fragmentSource;
+               fragmentSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+               << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+               << "layout(location = 0) out uint out_color;\n"
+               << "layout(set = 0, binding = 0) uniform Buffer1\n"
+               << "{\n"
+               << "  " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+               << "};\n"
+               << ""
+               << "void main()\n"
+               << "{\n"
+               << "  uint result = 0u;\n"
+               << "  if (dFdx(gl_SubgroupInvocationID * gl_FragCoord.x * gl_FragCoord.y) - dFdy(gl_SubgroupInvocationID * gl_FragCoord.x * gl_FragCoord.y) > 0.0f)\n"
+               << "  {\n"
+               << "    result |= 0x20;\n" // to be sure that compiler doesn't remove dFdx and dFdy executions
+               << "  }\n"
+               << "  bool helper = subgroupAny(gl_HelperInvocation);\n"
+               << "  if (helper)\n"
+               << "  {\n"
+               << "    result |= 0x40;\n"
+               << "  }\n"
+               << sourceFragment
+               << "  out_color = result;\n"
+               << "}\n";
+
+               programCollection.glslSources.add("fragment")
+                       << glu::FragmentSource(fragmentSource.str())<< vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+       }
        else
        {
                DE_FATAL("Unsupported shader stage");
@@ -438,7 +466,7 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        src << "  result[offset] = " << getOpTypeName(caseDef.opType)
                                << "(true) ? 0x1 : 0;\n"
                                << "  result[offset] |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
+                               << "(false) ? 0 : 0x1A;\n"
                                << "  result[offset] |= " << getOpTypeName(caseDef.opType)
                                << "(data[gl_SubgroupInvocationID] > 0) ? 0x4 : 0;\n";
                }
@@ -447,19 +475,26 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        src << "  result[offset] = " << getOpTypeName(caseDef.opType)
                                << "(true) ? 0x1 : 0;\n"
                                << "  result[offset] |= " << getOpTypeName(caseDef.opType)
-                               << "(false) ? 0 : 0x2;\n"
+                               << "(false) ? 0 : 0x1A;\n"
                                << "  result[offset] |= " << getOpTypeName(caseDef.opType)
                                << "(data[gl_SubgroupInvocationID] == data[0]) ? 0x4 : 0;\n";
                }
+
                else if (OPTYPE_ALLEQUAL == caseDef.opType)
                {
-                       src << "  result[offset] = " << getOpTypeName(caseDef.opType) << "("
-                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+                       src << "  " << subgroups::getFormatNameForGLSL(caseDef.format) <<" valueEqual = " << subgroups::getFormatNameForGLSL(caseDef.format) << "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n"
+                               << "  " << subgroups::getFormatNameForGLSL(caseDef.format) <<" valueNoEqual = " << subgroups::getFormatNameForGLSL(caseDef.format) << "(12.0 * float(data[gl_SubgroupInvocationID]) + ((offset % 5)%2));\n"
+                               <<"  result[offset] = " << getOpTypeName(caseDef.opType) << "("
+                               << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0x0;\n"
                                << "  result[offset] |= " << getOpTypeName(caseDef.opType)
-                               << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
-                               << "  if (subgroupElect()) result[offset] |= 0x2;\n"
+                               << "(gl_SubgroupInvocationID) ? 0x0 : 0x2;\n"
                                << "  result[offset] |= " << getOpTypeName(caseDef.opType)
-                               << "(data[0]) ? 0x4 : 0;\n";
+                               << "(data[0]) ? 0x4 : 0x0;\n"
+                               << "  result[offset] |= "<< getOpTypeName(caseDef.opType)
+                               << "(valueEqual) ? 0x8 : 0x0;\n"
+                               << "  result[offset] |= "<< getOpTypeName(caseDef.opType)
+                               << "(valueNoEqual) ? 0x0 : 0x10;\n"
+                               << "  if (subgroupElect()) result[offset] |= 0x2 | 0x10;\n";
                }
 
                src << "}\n";
@@ -474,22 +509,28 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                        "  result[offset] = " + getOpTypeName(caseDef.opType) +
                        "(true) ? 0x1 : 0;\n"
                        "  result[offset] |= " + getOpTypeName(caseDef.opType) +
-                       "(false) ? 0 : 0x2;\n"
+                       "(false) ? 0 : 0x1A;\n"
                        "  result[offset] |= 0x4;\n"
                : (OPTYPE_ANY == caseDef.opType) ?
                                "  result[offset] = " + getOpTypeName(caseDef.opType) +
                                "(true) ? 0x1 : 0;\n"
                                "  result[offset] |= " + getOpTypeName(caseDef.opType) +
-                               "(false) ? 0 : 0x2;\n"
+                               "(false) ? 0 : 0x1A;\n"
                                "  result[offset] |= 0x4;\n"
                : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+                               "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+                               "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((gl_SubgroupInvocationID % 5)%2));\n"
                                "  result[offset] = " + getOpTypeName(caseDef.opType) + "("
                                + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
                                "  result[offset] |= " + getOpTypeName(caseDef.opType) +
                                "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
-                               "  if (subgroupElect()) result[offset] |= 0x2;\n"
                                "  result[offset] |= " + getOpTypeName(caseDef.opType) +
                                "(data[0]) ? 0x4 : 0;\n"
+                               "  result[offset] |= " + getOpTypeName(caseDef.opType) +
+                               "(valueEqual) ? 0x8 : 0x0;\n"
+                               "  result[offset] |= " + getOpTypeName(caseDef.opType) +
+                               "(valueNoEqual) ? 0x0 : 0x10;\n"
+                               "  if (subgroupElect()) result[offset] |= 0x2 | 0x10;\n"
                : "";
 
                const string formatString = subgroups::getFormatNameForGLSL(caseDef.format);
@@ -610,22 +651,28 @@ void initPrograms(SourceCollections& programCollection, CaseDefinition caseDef)
                                "  result = " + getOpTypeName(caseDef.opType) +
                                "(true) ? 0x1 : 0;\n"
                                "  result |= " + getOpTypeName(caseDef.opType) +
-                               "(false) ? 0 : 0x2;\n"
+                               "(false) ? 0 : 0x1A;\n"
                                "  result |= 0x4;\n"
                        : (OPTYPE_ANY == caseDef.opType) ?
                                        "  result = " + getOpTypeName(caseDef.opType) +
                                        "(true) ? 0x1 : 0;\n"
                                        "  result |= " + getOpTypeName(caseDef.opType) +
-                                       "(false) ? 0 : 0x2;\n"
+                                       "(false) ? 0 : 0x1A;\n"
                                        "  result |= 0x4;\n"
                        : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+                                       "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+                                       "  " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((int(gl_FragCoord.x*gl_SubgroupInvocationID) % 5)%2));\n"
                                        "  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"
+                                       "  result |= " + getOpTypeName(caseDef.opType) +
+                                       "(valueEqual) ? 0x8 : 0x0;\n"
+                                       "  result |= " + getOpTypeName(caseDef.opType) +
+                                       "(valueNoEqual) ? 0x0 : 0x10;\n"
+                                       "  if (subgroupElect()) result |= 0x2 | 0x10;\n"
                        : "";
                        const string fragment =
                                "#version 450\n"
@@ -689,7 +736,7 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        subgroups::SSBOData inputData;
        inputData.format = caseDef.format;
        inputData.numElements = subgroups::maxSupportedSubgroupSize();
-       inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+       inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
 
        if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
                return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
@@ -698,7 +745,9 @@ tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
        else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
                return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
        else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
-               return subgroups::makeTessellationEvaluationFrameBufferTest(context,  VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+               return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+       else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+               return subgroups::makeFragmentFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkFragmentPipelineStages);
        else
                TCU_THROW(InternalError, "Unhandled shader stage");
 }
@@ -732,7 +781,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                subgroups::SSBOData inputData;
                inputData.format = caseDef.format;
                inputData.numElements = subgroups::maxSupportedSubgroupSize();
-               inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+               inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
 
                return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData,
                                                                                  1, (OPTYPE_ALLEQUAL == caseDef.opType) ? checkComputeAllEqual : checkCompute);
@@ -765,7 +814,7 @@ tcu::TestStatus test(Context& context, const CaseDefinition caseDef)
                subgroups::SSBOData inputData;
                inputData.format                        = caseDef.format;
                inputData.numElements           = subgroups::maxSupportedSubgroupSize();
-               inputData.initializeType        = subgroups::SSBOData::InitializeNonZero;
+               inputData.initializeType        = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
                inputData.binding                       = 4u;
                inputData.stages                        = stages;
 
@@ -841,6 +890,13 @@ tcu::TestCaseGroup* createSubgroupsVoteTests(tcu::TestContext& testCtx)
                                                        + "_" + getShaderStageName(caseDef.shaderStage)+"_framebuffer", "",
                                                        initFrameBufferPrograms, noSSBOtest, caseDef);
                        }
+
+                       const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_FRAGMENT_BIT, format};
+                       addFunctionCaseWithPrograms(group.get(),
+                                               op + "_" +
+                                               subgroups::getFormatNameForGLSL(format)
+                                               + "_" + getShaderStageName(caseDef.shaderStage)+"_frag_helper", "",
+                                               initFrameBufferPrograms, noSSBOtest, caseDef);
                }
        }
 
index 2a897ce..5449887 100644 (file)
@@ -287417,132 +287417,154 @@ dEQP-VK.subgroups.vote.subgroupallequal_int_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_int_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupall_uint_compute
 dEQP-VK.subgroups.vote.subgroupall_uint_graphic
 dEQP-VK.subgroups.vote.subgroupall_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupall_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupany_uint_compute
 dEQP-VK.subgroups.vote.subgroupany_uint_graphic
 dEQP-VK.subgroups.vote.subgroupany_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupany_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uint_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uint_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_float_compute
 dEQP-VK.subgroups.vote.subgroupallequal_float_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_float_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_float_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_double_compute
 dEQP-VK.subgroups.vote.subgroupallequal_double_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_double_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_double_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bool_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bool_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bool_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_fragment_frag_helper
 dEQP-VK.subgroups.ballot.compute
 dEQP-VK.subgroups.ballot.graphic
 dEQP-VK.subgroups.ballot.tess_eval_framebuffer
index 3e34f98..91e5363 100644 (file)
@@ -287378,132 +287378,154 @@ dEQP-VK.subgroups.vote.subgroupallequal_int_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_int_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_int_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_ivec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_ivec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupall_uint_compute
 dEQP-VK.subgroups.vote.subgroupall_uint_graphic
 dEQP-VK.subgroups.vote.subgroupall_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupall_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupall_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupany_uint_compute
 dEQP-VK.subgroups.vote.subgroupany_uint_graphic
 dEQP-VK.subgroups.vote.subgroupany_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupany_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupany_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uint_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uint_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uint_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uint_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uint_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_uvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_uvec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_float_compute
 dEQP-VK.subgroups.vote.subgroupallequal_float_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_float_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_float_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_float_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_vec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_vec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_double_compute
 dEQP-VK.subgroups.vote.subgroupallequal_double_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_double_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_double_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_double_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_dvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_dvec4_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bool_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bool_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bool_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bool_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bool_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec2_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec2_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec3_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec3_fragment_frag_helper
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_compute
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_graphic
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_vertex_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_eval_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_tess_control_framebuffer
 dEQP-VK.subgroups.vote.subgroupallequal_bvec4_geometry_framebuffer
+dEQP-VK.subgroups.vote.subgroupallequal_bvec4_fragment_frag_helper
 dEQP-VK.subgroups.ballot.compute
 dEQP-VK.subgroups.ballot.graphic
 dEQP-VK.subgroups.ballot.tess_eval_framebuffer