diff options
author | sfricke-samsung <46493288+sfricke-samsung@users.noreply.github.com> | 2021-01-05 06:51:07 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-05 09:51:07 -0500 |
commit | 1bb80d2778a3d0362365b2490e2174bd56453036 (patch) | |
tree | bde4a2b0d810c60e1521fe93fe5f32ce58545b16 | |
parent | 17ffa89097b26efeb323e6963220326b5ffb2baf (diff) | |
download | spirv-tools-1bb80d2778a3d0362365b2490e2174bd56453036.tar.gz |
spirv-val: Add Vulkan Group Operation VUID (#4086)
-rw-r--r-- | source/val/validate_non_uniform.cpp | 13 | ||||
-rw-r--r-- | source/val/validation_state.cpp | 2 | ||||
-rw-r--r-- | test/val/val_non_uniform_test.cpp | 36 |
3 files changed, 51 insertions, 0 deletions
diff --git a/source/val/validate_non_uniform.cpp b/source/val/validate_non_uniform.cpp index 8dcf9743..2b6eb8b5 100644 --- a/source/val/validate_non_uniform.cpp +++ b/source/val/validate_non_uniform.cpp @@ -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; } diff --git a/source/val/validation_state.cpp b/source/val/validation_state.cpp index 539fbb97..f458d4f9 100644 --- a/source/val/validation_state.cpp +++ b/source/val/validation_state.cpp @@ -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 }; diff --git a/test/val/val_non_uniform_test.cpp b/test/val/val_non_uniform_test.cpp index fbd11a9e..352c3496 100644 --- a/test/val/val_non_uniform_test.cpp +++ b/test/val/val_non_uniform_test.cpp @@ -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 |