spirv-val: Add Vulkan Group Operation VUID (#4086)

This commit is contained in:
sfricke-samsung 2021-01-05 06:51:07 -08:00 committed by GitHub
parent 17ffa89097
commit 1bb80d2778
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 0 deletions

View File

@ -47,6 +47,19 @@ spv_result_t ValidateGroupNonUniformBallotBitCount(ValidationState_t& _,
"vector of four components "
"of integer type scalar";
}
const auto group = inst->GetOperandAs<uint32_t>(3);
if (spvIsVulkanEnv(_.context()->target_env)) {
if ((group != SpvGroupOperationReduce) &&
(group != SpvGroupOperationInclusiveScan) &&
(group != SpvGroupOperationExclusiveScan)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< _.VkErrorID(4685)
<< "In Vulkan: The OpGroupNonUniformBallotBitCount group "
"operation must be only: Reduce, InclusiveScan, or "
"ExclusiveScan.";
}
}
return SPV_SUCCESS;
}

View File

@ -1667,6 +1667,8 @@ std::string ValidationState_t::VkErrorID(uint32_t id,
return VUID_WRAP(VUID-ShadingRateKHR-ShadingRateKHR-04492);
case 4633:
return VUID_WRAP(VUID-StandaloneSpirv-None-04633);
case 4685:
return VUID_WRAP(VUID-StandaloneSpirv-OpGroupNonUniformBallotBitCount-04685);
default:
return ""; // unknown id
};

View File

@ -100,6 +100,7 @@ OpFunctionEnd)";
SpvScope scopes[] = {SpvScopeCrossDevice, SpvScopeDevice, SpvScopeWorkgroup,
SpvScopeSubgroup, SpvScopeInvocation};
using ValidateGroupNonUniform = spvtest::ValidateBase<bool>;
using GroupNonUniform = spvtest::ValidateBase<
std::tuple<std::string, std::string, SpvScope, std::string, std::string>>;
@ -288,6 +289,41 @@ INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitCountBadValue, GroupNonUniform,
Values("Expected Value to be a vector of four "
"components of integer type scalar")));
TEST_F(ValidateGroupNonUniform, VulkanGroupNonUniformBallotBitCountOperation) {
std::string test = R"(
OpCapability Shader
OpCapability GroupNonUniform
OpCapability GroupNonUniformBallot
OpCapability GroupNonUniformClustered
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
%void = OpTypeVoid
%func = OpTypeFunction %void
%u32 = OpTypeInt 32 0
%u32vec4 = OpTypeVector %u32 4
%u32_0 = OpConstant %u32 0
%u32vec4_null = OpConstantComposite %u32vec4 %u32_0 %u32_0 %u32_0 %u32_0
%subgroup = OpConstant %u32 3
%main = OpFunction %void None %func
%main_entry = OpLabel
%result = OpGroupNonUniformBallotBitCount %u32 %subgroup ClusteredReduce %u32vec4_null
OpReturn
OpFunctionEnd
)";
CompileSuccessfully(test, SPV_ENV_VULKAN_1_1);
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
EXPECT_THAT(
getDiagnosticString(),
AnyVUID("VUID-StandaloneSpirv-OpGroupNonUniformBallotBitCount-04685"));
EXPECT_THAT(
getDiagnosticString(),
HasSubstr(
"In Vulkan: The OpGroupNonUniformBallotBitCount group operation must "
"be only: Reduce, InclusiveScan, or ExclusiveScan."));
}
} // namespace
} // namespace val
} // namespace spvtools