aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsfricke-samsung <46493288+sfricke-samsung@users.noreply.github.com>2021-01-05 06:51:07 -0800
committerGitHub <noreply@github.com>2021-01-05 09:51:07 -0500
commit1bb80d2778a3d0362365b2490e2174bd56453036 (patch)
treebde4a2b0d810c60e1521fe93fe5f32ce58545b16
parent17ffa89097b26efeb323e6963220326b5ffb2baf (diff)
downloadspirv-tools-1bb80d2778a3d0362365b2490e2174bd56453036.tar.gz
spirv-val: Add Vulkan Group Operation VUID (#4086)
-rw-r--r--source/val/validate_non_uniform.cpp13
-rw-r--r--source/val/validation_state.cpp2
-rw-r--r--test/val/val_non_uniform_test.cpp36
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