Additions to VARYING_SUBGROUP_SIZE and FULL_SUBGROUPS_BIT tests
authorAntto Mäkinen <antto.makinen@siru.fi>
Tue, 14 Dec 2021 14:29:28 +0000 (16:29 +0200)
committerMatthew Netsch <quic_mnetsch@quicinc.com>
Sun, 23 Jan 2022 01:56:32 +0000 (01:56 +0000)
The behavior in VK_EXT_subgroup_size_control is assumed by default when
using SPIR-V 1.6. This CL adds variants of the existing tests for
subgroup_size_control where instead of adding these flags, a SPIR-V 1.6
module is used.

VK-GL-CTS issue: 3072

New Tests:
dEQP-VK.subgroups.size_control.*_spirv16

Components: Vulkan
Change-Id: I374f56e4ff8f6d971785a53e50667214cc536689

android/cts/master/vk-master-2021-03-01/subgroups.txt
android/cts/master/vk-master/subgroups.txt
external/vulkancts/modules/vulkan/subgroups/vktSubgroupsSizeControlTests.cpp
external/vulkancts/mustpass/master/vk-default/subgroups.txt

index 5f647fe..a6d9b1c 100644 (file)
@@ -4883,20 +4883,42 @@ dEQP-VK.subgroups.ballot_mask.ext_shader_subgroup_ballot.ray_tracing.gl_subgroup
 dEQP-VK.subgroups.ballot_mask.ext_shader_subgroup_ballot.ray_tracing.gl_subgroupltmaskarb
 dEQP-VK.subgroups.size_control.generic.subgroup_size_properties
 dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.graphics.required_subgroup_size_max
 dEQP-VK.subgroups.size_control.graphics.required_subgroup_size_min
 dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size
-dEQP-VK.subgroups.size_control.compute.require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size
-dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max
-dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups
+dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.framebuffer.vertex_required_subgroup_size_max
 dEQP-VK.subgroups.size_control.framebuffer.vertex_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.tess_eval_required_subgroup_size_max
@@ -4908,6 +4930,8 @@ dEQP-VK.subgroups.size_control.framebuffer.geometry_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_max
 dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.ray_tracing.required_subgroup_size_max
 dEQP-VK.subgroups.size_control.ray_tracing.required_subgroup_size_min
 dEQP-VK.subgroups.subgroup_uniform_control_flow.large_full.subgroup_reconverge00
index 5c8074b..aba23b2 100644 (file)
@@ -20867,20 +20867,42 @@ dEQP-VK.subgroups.ballot_mask.ext_shader_subgroup_ballot.ray_tracing.gl_subgroup
 dEQP-VK.subgroups.ballot_mask.ext_shader_subgroup_ballot.ray_tracing.gl_subgroupltmaskarb
 dEQP-VK.subgroups.size_control.generic.subgroup_size_properties
 dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.graphics.required_subgroup_size_max
 dEQP-VK.subgroups.size_control.graphics.required_subgroup_size_min
 dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size
-dEQP-VK.subgroups.size_control.compute.require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size
-dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max
-dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups
+dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.framebuffer.vertex_required_subgroup_size_max
 dEQP-VK.subgroups.size_control.framebuffer.vertex_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.tess_eval_required_subgroup_size_max
@@ -20892,6 +20914,8 @@ dEQP-VK.subgroups.size_control.framebuffer.geometry_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_max
 dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.ray_tracing.required_subgroup_size_max
 dEQP-VK.subgroups.size_control.ray_tracing.required_subgroup_size_min
 dEQP-VK.subgroups.subgroup_uniform_control_flow.large_full.subgroup_reconverge00
index 334fa22..b364aa9 100755 (executable)
@@ -52,6 +52,14 @@ struct CaseDefinition
        deBool                          requiresBallot;
        deUint32                        requiredSubgroupSizeMode;
        de::SharedPtr<bool>     geometryPointSizeSupported;
+       SpirvVersion            spirvVersion;
+};
+
+struct TestParams
+{
+       deBool  useSpirv16;
+       deBool  flagsEnabled;
+       string  postfix;
 };
 
 struct internalDataStruct
@@ -245,15 +253,18 @@ static bool checkComputeRequireFull (const void*                  internalData,
                        return DE_FALSE;
                }
 
-               if (checkInternalData->caseDef.pipelineShaderStageCreateFlags == VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT &&
-                       data[i].x() != checkInternalData->requiredSubgroupSize)
+               if ((checkInternalData->caseDef.pipelineShaderStageCreateFlags == VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
+                       || checkInternalData->caseDef.spirvVersion == SPIRV_VERSION_1_6)
+                       && data[i].x() != checkInternalData->requiredSubgroupSize)
                {
                        log << TestLog::Message << "[" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] << "] "
                                << "expected subgroupSize (" << checkInternalData->requiredSubgroupSize << ") doesn't match gl_SubgroupSize ( " << data[i].x() << ")" << TestLog::EndMessage;
                        return DE_FALSE;
                }
 
-               if (checkInternalData->caseDef.pipelineShaderStageCreateFlags == VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT && data[i].z() != numSubgroups)
+               if ((checkInternalData->caseDef.pipelineShaderStageCreateFlags == VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
+                        || checkInternalData->caseDef.spirvVersion == SPIRV_VERSION_1_6)
+                        && data[i].z() != numSubgroups)
                {
                        log << TestLog::Message << "[" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] << "] "
                                << "expected number of subgroups dispatched (" << numSubgroups << ") doesn't match gl_NumSubgroups (" << data[i].z() << ")";
@@ -266,7 +277,7 @@ static bool checkComputeRequireFull (const void*                    internalData,
 
 void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
 {
-       const ShaderBuildOptions        buildOptions    (programCollection.usedVulkanVersion, SPIRV_VERSION_1_3, 0u);
+       const ShaderBuildOptions        buildOptions    (programCollection.usedVulkanVersion, caseDef.spirvVersion, 0u);
 
        if (VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
                subgroups::setFragmentShaderFrameBuffer(programCollection);
@@ -431,11 +442,10 @@ string getTestSource (const CaseDefinition&)
 
 void initPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
 {
-       const SpirvVersion                      spirvVersion            = isAllRayTracingStages(caseDef.shaderStage) ? SPIRV_VERSION_1_4 : SPIRV_VERSION_1_3;
-       const ShaderBuildOptions        buildOptions            (programCollection.usedVulkanVersion, spirvVersion, 0u);
-       const string                            extHeader                       = getExtHeader(caseDef);
-       const string                            testSrc                         = getTestSource(caseDef);
-       const vector<string>            headDeclarations        = getPerStageHeadDeclarations(caseDef);
+       ShaderBuildOptions              buildOptions            (programCollection.usedVulkanVersion, caseDef.spirvVersion, 0u);
+       const string                    extHeader                       = getExtHeader(caseDef);
+       const string                    testSrc                         = getTestSource(caseDef);
+       const vector<string>    headDeclarations        = getPerStageHeadDeclarations(caseDef);
 
        subgroups::initStdPrograms(programCollection, buildOptions, caseDef.shaderStage, VK_FORMAT_R32_UINT, *caseDef.geometryPointSizeSupported, extHeader, testSrc, "", headDeclarations);
 }
@@ -469,7 +479,7 @@ void initProgramsRequireFull (SourceCollections& programCollection, CaseDefiniti
                << "   result[offset].z = gl_NumSubgroups;" // save the number of subgroups dispatched.
                << "}\n";
 
-       programCollection.glslSources.add("comp") << glu::ComputeSource(src.str()) << ShaderBuildOptions(programCollection.usedVulkanVersion, SPIRV_VERSION_1_3, 0u);
+       programCollection.glslSources.add("comp") << glu::ComputeSource(src.str()) << ShaderBuildOptions(programCollection.usedVulkanVersion, caseDef.spirvVersion, 0u);
 }
 
 void supportedCheck (Context& context)
@@ -533,6 +543,9 @@ void supportedCheckFeatures (Context& context, CaseDefinition caseDef)
        {
                context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
        }
+
+       if (caseDef.spirvVersion > vk::getMaxSpirvVersionForVulkan(context.getUsedApiVersion()))
+               TCU_THROW(NotSupportedError, "Shader requires SPIR-V version higher than available");
 }
 
 void supportedCheckFeaturesShader (Context& context, CaseDefinition caseDef)
@@ -734,13 +747,19 @@ TestStatus testRequireSubgroupSize (Context& context, const CaseDefinition caseD
                        requiredSubgroupSize,   //  deUint32                            requiredSubgroupSize;
                };
 
-               // Depending on the flag we need to run one verification function or another.
+               // Depending on the flag and SPIR-V version we need to run one verification function or another.
+               subgroups::CheckResultCompute                                                   checkResult                                                                     = checkCompute;
+
+               if (caseDef.pipelineShaderStageCreateFlags == VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
+                       || caseDef.spirvVersion == SPIRV_VERSION_1_6)
+                       checkResult = checkComputeRequireFull;
+
                return subgroups::makeComputeTestRequiredSubgroupSize(context,
                                                                                                                          VK_FORMAT_R32G32B32A32_UINT,
                                                                                                                          DE_NULL,
                                                                                                                          0,
                                                                                                                          &internalData,
-                                                                                                                         caseDef.pipelineShaderStageCreateFlags == VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT ? checkComputeRequireFull : checkCompute,
+                                                                                                                         checkResult,
                                                                                                                          caseDef.pipelineShaderStageCreateFlags,
                                                                                                                          numWorkgroups,
                                                                                                                          DE_TRUE,
@@ -885,68 +904,88 @@ TestCaseGroup* createSubgroupsSizeControlTests (TestContext& testCtx)
                addFunctionCase(genericGroup.get(), "subgroup_size_properties", "", supportedCheck, testSanitySubgroupSizeProperties);
        }
 
-       // Allow varying subgroup case.
+       const TestParams                        testParams[]            = {{false, true, ""}, {true, false, "_spirv16"}, {true, true, "_flags_spirv16"}};
+
+       for (const auto& params : testParams)
        {
-               const CaseDefinition caseDefCompute = {VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool)};
-               addFunctionCaseWithPrograms(computeGroup.get(), "allow_varying_subgroup_size", "", supportedCheckFeatures, initPrograms, test, caseDefCompute);
-               const CaseDefinition caseDefAllGraphics = {VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool)};
-               addFunctionCaseWithPrograms(graphicsGroup.get(), "allow_varying_subgroup_size", "", supportedCheckFeaturesShader, initPrograms, test, caseDefAllGraphics);
-               const CaseDefinition caseDefAllRaytracing = {VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, SHADER_STAGE_ALL_RAY_TRACING, DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool)};
-               addFunctionCaseWithPrograms(raytracingGroup.get(), "allow_varying_subgroup_size", "", supportedCheckFeaturesShader, initPrograms, test, caseDefAllRaytracing);
+               // Allow varying subgroup cases.
+               const deUint32                  flagsVary                               = VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT;
+               const CaseDefinition    caseDefVary                             = {params.flagsEnabled ? flagsVary : 0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE,
+                                                                                                                  de::SharedPtr<bool>(new bool), params.useSpirv16 ? SPIRV_VERSION_1_6 : SPIRV_VERSION_1_3};
+
+               addFunctionCaseWithPrograms(computeGroup.get(), "allow_varying_subgroup_size" + params.postfix, "", supportedCheckFeatures,
+                                                                       initPrograms, test, caseDefVary);
+               addFunctionCaseWithPrograms(graphicsGroup.get(), "allow_varying_subgroup_size" + params.postfix, "",
+                                                                       supportedCheckFeaturesShader, initPrograms, test, caseDefVary);
 
                for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
                {
-                       const CaseDefinition caseDefStage = {VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool)};
-                       addFunctionCaseWithPrograms(framebufferGroup.get(),  getShaderStageName(caseDefStage.shaderStage) + "_allow_varying_subgroup_size", "", supportedCheckFeaturesShader, initFrameBufferPrograms, noSSBOtest, caseDefStage);
-               }
-       }
+                       const CaseDefinition    caseDefStage    = {params.flagsEnabled ? flagsVary : 0u, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE,
+                                                                                                          de::SharedPtr<bool>(new bool), params.useSpirv16 ? SPIRV_VERSION_1_6 : SPIRV_VERSION_1_3};
 
-       // Require full subgroups case (only compute shaders).
-       {
-               const CaseDefinition caseDef = {VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool)};
-               addFunctionCaseWithPrograms(computeGroup.get(), "require_full_subgroups", "", supportedCheckFeatures, initProgramsRequireFull, testRequireFullSubgroups, caseDef);
-       }
+                       string                                  name                    = getShaderStageName(caseDefStage.shaderStage) + "_allow_varying_subgroup_size" + params.postfix;
+                       addFunctionCaseWithPrograms(framebufferGroup.get(), name, "", supportedCheckFeaturesShader, initFrameBufferPrograms,
+                                                                               noSSBOtest, caseDefStage);
+               }
 
-       // Require full subgroups together with allow varying subgroup (only compute shaders).
-       {
-               deUint32 flags = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT | VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT;
-               const CaseDefinition caseDef = {flags, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool)};
-               addFunctionCaseWithPrograms(computeGroup.get(), "require_full_subgroups_allow_varying_subgroup_size", "", supportedCheckFeatures, initProgramsRequireFull, testRequireFullSubgroups, caseDef);
+               // Require full subgroups together with allow varying subgroup (only compute shaders).
+               const deUint32                  flagsFullVary                   = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
+                                                                                                                 | VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT;
+               const CaseDefinition    caseDefFullVary                 = {params.flagsEnabled ? flagsFullVary : 0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool),
+                                                                                                                  params.useSpirv16 ? SPIRV_VERSION_1_6 : SPIRV_VERSION_1_3};
+               addFunctionCaseWithPrograms(computeGroup.get(), "require_full_subgroups_allow_varying_subgroup_size" + params.postfix, "",
+                                                                       supportedCheckFeatures, initProgramsRequireFull, testRequireFullSubgroups, caseDefFullVary);
+
+               // Require full subgroups cases (only compute shaders).
+               const deUint32                  flagsFull                               = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT;
+               const CaseDefinition    caseDefFull                             = {params.flagsEnabled ? flagsFull : 0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_NONE, de::SharedPtr<bool>(new bool),
+                                                                                                                  params.useSpirv16 ? SPIRV_VERSION_1_6 : SPIRV_VERSION_1_3};
+               addFunctionCaseWithPrograms(computeGroup.get(), "require_full_subgroups" + params.postfix, "", supportedCheckFeatures, initProgramsRequireFull,
+                                                                       testRequireFullSubgroups, caseDefFull);
+
+               // Tests to check setting a required subgroup size value, together with require full subgroups (only compute shaders).
+               const CaseDefinition    caseDefMaxFull                  = {params.flagsEnabled ? flagsFull : 0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool),
+                                                                                                                  params.useSpirv16 ? SPIRV_VERSION_1_6 : SPIRV_VERSION_1_3};
+               addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_max_require_full_subgroups" + params.postfix, "", supportedCheckFeatures,
+                                                                       initProgramsRequireFull, testRequireSubgroupSize, caseDefMaxFull);
+
+               const CaseDefinition    caseDefMinFull                  = {params.flagsEnabled ? flagsFull : 0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool),
+                                                                                                                  params.useSpirv16 ? SPIRV_VERSION_1_6 : SPIRV_VERSION_1_3};
+               addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_min_require_full_subgroups" + params.postfix, "", supportedCheckFeatures,
+                                                                       initProgramsRequireFull, testRequireSubgroupSize, caseDefMinFull);
+
+               // Ray tracing cases with allow varying subgroup.
+               const deUint32                  flagsRayTracing                 = VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT;
+               const CaseDefinition    caseDefAllRaytracing    = {params.flagsEnabled ? flagsRayTracing : 0u, SHADER_STAGE_ALL_RAY_TRACING, DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE,
+                                                                                                                  de::SharedPtr<bool>(new bool), params.useSpirv16 ? SPIRV_VERSION_1_6 : SPIRV_VERSION_1_4};
+               addFunctionCaseWithPrograms(raytracingGroup.get(), "allow_varying_subgroup_size" + params.postfix, "", supportedCheckFeaturesShader,
+                                                                       initPrograms, test, caseDefAllRaytracing);
        }
 
        // Tests to check setting a required subgroup size value.
        {
-               const CaseDefinition caseDefAllGraphicsMax = {0u, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool)};
+               const CaseDefinition caseDefAllGraphicsMax = {0u, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_3};
                addFunctionCaseWithPrograms(graphicsGroup.get(), "required_subgroup_size_max", "", supportedCheckFeaturesShader, initPrograms, testRequireSubgroupSize, caseDefAllGraphicsMax);
-               const CaseDefinition caseDefComputeMax = {0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool)};
+               const CaseDefinition caseDefComputeMax = {0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_3};
                addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_max", "", supportedCheckFeatures, initPrograms, testRequireSubgroupSize, caseDefComputeMax);
-               const CaseDefinition caseDefAllRaytracingMax = {0u, SHADER_STAGE_ALL_RAY_TRACING, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool)};
+               const CaseDefinition caseDefAllRaytracingMax = {0u, SHADER_STAGE_ALL_RAY_TRACING, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_4};
                addFunctionCaseWithPrograms(raytracingGroup.get(), "required_subgroup_size_max", "", supportedCheckFeaturesShader, initPrograms, testRequireSubgroupSize, caseDefAllRaytracingMax);
 
-               const CaseDefinition caseDefAllGraphicsMin = {0u, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool)};
+               const CaseDefinition caseDefAllGraphicsMin = {0u, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_3};
                addFunctionCaseWithPrograms(graphicsGroup.get(), "required_subgroup_size_min", "", supportedCheckFeaturesShader, initPrograms, testRequireSubgroupSize, caseDefAllGraphicsMin);
-               const CaseDefinition caseDefComputeMin = {0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool)};
+               const CaseDefinition caseDefComputeMin = {0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_3};
                addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_min", "", supportedCheckFeatures, initPrograms, testRequireSubgroupSize, caseDefComputeMin);
-               const CaseDefinition caseDefAllRaytracingMin = {0u, SHADER_STAGE_ALL_RAY_TRACING, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool)};
+               const CaseDefinition caseDefAllRaytracingMin = {0u, SHADER_STAGE_ALL_RAY_TRACING, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_4};
                addFunctionCaseWithPrograms(raytracingGroup.get(), "required_subgroup_size_min", "", supportedCheckFeaturesShader, initPrograms, testRequireSubgroupSize, caseDefAllRaytracingMin);
                for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
                {
-                       const CaseDefinition caseDefStageMax = {0u, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool)};
+                       const CaseDefinition caseDefStageMax = {0u, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_3};
                        addFunctionCaseWithPrograms(framebufferGroup.get(),  getShaderStageName(caseDefStageMax.shaderStage) + "_required_subgroup_size_max", "", supportedCheckFeaturesShader, initFrameBufferPrograms, noSSBOtestRequireSubgroupSize, caseDefStageMax);
-                       const CaseDefinition caseDefStageMin = {0u, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool)};
+                       const CaseDefinition caseDefStageMin = {0u, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool), SPIRV_VERSION_1_3};
                        addFunctionCaseWithPrograms(framebufferGroup.get(),  getShaderStageName(caseDefStageMin.shaderStage) + "_required_subgroup_size_min", "", supportedCheckFeaturesShader, initFrameBufferPrograms, noSSBOtestRequireSubgroupSize, caseDefStageMin);
                }
        }
 
-       // Tests to check setting a required subgroup size value, together with require full subgroups (only compute shaders).
-       {
-               deUint32 flags = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT;
-               const CaseDefinition caseDefMax = {flags, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_MAX, de::SharedPtr<bool>(new bool)};
-               addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_max_require_full_subgroups", "", supportedCheckFeatures, initProgramsRequireFull, testRequireSubgroupSize, caseDefMax);
-               const CaseDefinition caseDefMin = {flags, VK_SHADER_STAGE_COMPUTE_BIT, DE_TRUE, REQUIRED_SUBGROUP_SIZE_MIN, de::SharedPtr<bool>(new bool)};
-               addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_min_require_full_subgroups", "", supportedCheckFeatures, initProgramsRequireFull, testRequireSubgroupSize, caseDefMin);
-       }
-
        group->addChild(genericGroup.release());
        group->addChild(graphicsGroup.release());
        group->addChild(computeGroup.release());
index 5c8074b..aba23b2 100644 (file)
@@ -20867,20 +20867,42 @@ dEQP-VK.subgroups.ballot_mask.ext_shader_subgroup_ballot.ray_tracing.gl_subgroup
 dEQP-VK.subgroups.ballot_mask.ext_shader_subgroup_ballot.ray_tracing.gl_subgroupltmaskarb
 dEQP-VK.subgroups.size_control.generic.subgroup_size_properties
 dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.graphics.allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.graphics.required_subgroup_size_max
 dEQP-VK.subgroups.size_control.graphics.required_subgroup_size_min
 dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size
-dEQP-VK.subgroups.size_control.compute.require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size
-dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max
-dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups
 dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups
+dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups_spirv16
+dEQP-VK.subgroups.size_control.compute.allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max_require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min_require_full_subgroups_flags_spirv16
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_max
+dEQP-VK.subgroups.size_control.compute.required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size
 dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.vertex_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_eval_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.tess_control_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.geometry_allow_varying_subgroup_size_flags_spirv16
+dEQP-VK.subgroups.size_control.framebuffer.fragment_allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.framebuffer.vertex_required_subgroup_size_max
 dEQP-VK.subgroups.size_control.framebuffer.vertex_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.tess_eval_required_subgroup_size_max
@@ -20892,6 +20914,8 @@ dEQP-VK.subgroups.size_control.framebuffer.geometry_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_max
 dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_min
 dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size
+dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size_spirv16
+dEQP-VK.subgroups.size_control.ray_tracing.allow_varying_subgroup_size_flags_spirv16
 dEQP-VK.subgroups.size_control.ray_tracing.required_subgroup_size_max
 dEQP-VK.subgroups.size_control.ray_tracing.required_subgroup_size_min
 dEQP-VK.subgroups.subgroup_uniform_control_flow.large_full.subgroup_reconverge00