Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Tools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKévin Petit <kevin.petit@arm.com>2022-10-06 05:47:10 +0300
committerGitHub <noreply@github.com>2022-10-06 05:47:10 +0300
commita6e6454ef27f9c3c652d6a37281c3b9ed45d4667 (patch)
tree7ca7377917655153e5e13b92e24d694e0a36a2a0
parent4dbc66380dd63aabbd33c38198008449d0a5807a (diff)
spirv-val: Add SPV_ARM_core_builtins validation (#4958)
Signed-off-by: Kevin Petit <kevin.petit@arm.com> Change-Id: If1680a823aea9662d44def1ec6fe6ac334c00574 Signed-off-by: Kevin Petit <kevin.petit@arm.com>
-rw-r--r--source/val/validate_builtins.cpp19
-rw-r--r--test/val/val_builtins_test.cpp55
2 files changed, 67 insertions, 7 deletions
diff --git a/source/val/validate_builtins.cpp b/source/val/validate_builtins.cpp
index d5b89eb1a..6f4b0f9c3 100644
--- a/source/val/validate_builtins.cpp
+++ b/source/val/validate_builtins.cpp
@@ -333,7 +333,7 @@ class BuiltInsValidator {
// Used for GlobalInvocationId, LocalInvocationId, NumWorkgroups, WorkgroupId.
spv_result_t ValidateComputeShaderI32Vec3InputAtDefinition(
const Decoration& decoration, const Instruction& inst);
- spv_result_t ValidateSMBuiltinsAtDefinition(const Decoration& decoration,
+ spv_result_t ValidateNVSMOrARMCoreBuiltinsAtDefinition(const Decoration& decoration,
const Instruction& inst);
// Used for BaryCoord, BaryCoordNoPersp.
spv_result_t ValidateFragmentShaderF32Vec3InputAtDefinition(
@@ -528,7 +528,7 @@ class BuiltInsValidator {
const Instruction& referenced_inst,
const Instruction& referenced_from_inst);
- spv_result_t ValidateSMBuiltinsAtReference(
+ spv_result_t ValidateNVSMOrARMCoreBuiltinsAtReference(
const Decoration& decoration, const Instruction& built_in_inst,
const Instruction& referenced_inst,
const Instruction& referenced_from_inst);
@@ -3749,7 +3749,7 @@ spv_result_t BuiltInsValidator::ValidateFullyCoveredAtReference(
return SPV_SUCCESS;
}
-spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtDefinition(
+spv_result_t BuiltInsValidator::ValidateNVSMOrARMCoreBuiltinsAtDefinition(
const Decoration& decoration, const Instruction& inst) {
if (spvIsVulkanEnv(_.context()->target_env)) {
if (spv_result_t error = ValidateI32(
@@ -3770,10 +3770,10 @@ spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtDefinition(
}
// Seed at reference checks with this built-in.
- return ValidateSMBuiltinsAtReference(decoration, inst, inst, inst);
+ return ValidateNVSMOrARMCoreBuiltinsAtReference(decoration, inst, inst, inst);
}
-spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtReference(
+spv_result_t BuiltInsValidator::ValidateNVSMOrARMCoreBuiltinsAtReference(
const Decoration& decoration, const Instruction& built_in_inst,
const Instruction& referenced_inst,
const Instruction& referenced_from_inst) {
@@ -3797,7 +3797,7 @@ spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtReference(
if (function_id_ == 0) {
// Propagate this rule to all dependant ids in the global scope.
id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind(
- &BuiltInsValidator::ValidateSMBuiltinsAtReference, this, decoration,
+ &BuiltInsValidator::ValidateNVSMOrARMCoreBuiltinsAtReference, this, decoration,
built_in_inst, referenced_from_inst, std::placeholders::_1));
}
@@ -4225,11 +4225,16 @@ spv_result_t BuiltInsValidator::ValidateSingleBuiltInAtDefinition(
case SpvBuiltInLocalInvocationIndex: {
return ValidateLocalInvocationIndexAtDefinition(decoration, inst);
}
+ case SpvBuiltInCoreIDARM:
+ case SpvBuiltInCoreCountARM:
+ case SpvBuiltInCoreMaxIDARM:
+ case SpvBuiltInWarpIDARM:
+ case SpvBuiltInWarpMaxIDARM:
case SpvBuiltInWarpsPerSMNV:
case SpvBuiltInSMCountNV:
case SpvBuiltInWarpIDNV:
case SpvBuiltInSMIDNV: {
- return ValidateSMBuiltinsAtDefinition(decoration, inst);
+ return ValidateNVSMOrARMCoreBuiltinsAtDefinition(decoration, inst);
}
case SpvBuiltInBaseInstance:
case SpvBuiltInBaseVertex: {
diff --git a/test/val/val_builtins_test.cpp b/test/val/val_builtins_test.cpp
index 241eae4af..4f9fc9763 100644
--- a/test/val/val_builtins_test.cpp
+++ b/test/val/val_builtins_test.cpp
@@ -2851,6 +2851,61 @@ INSTANTIATE_TEST_SUITE_P(
"needs to be a 32-bit int scalar",
"has bit width 64"))));
+INSTANTIATE_TEST_SUITE_P(
+ ArmCoreBuiltinsInputSuccess,
+ ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
+ Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
+ "WarpMaxIDARM"),
+ Values("Vertex", "Fragment", "TessellationControl",
+ "TessellationEvaluation", "Geometry", "GLCompute"),
+ Values("Input"), Values("%u32"),
+ Values("OpCapability CoreBuiltinsARM\n"),
+ Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
+ Values(TestResult())));
+
+INSTANTIATE_TEST_SUITE_P(
+ ArmCoreBuiltinsNotInput,
+ ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
+ Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
+ "WarpMaxIDARM"),
+ Values("Vertex", "Fragment", "TessellationControl",
+ "TessellationEvaluation", "Geometry", "GLCompute"),
+ Values("Output"), Values("%u32"),
+ Values("OpCapability CoreBuiltinsARM\n"),
+ Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
+ Values(TestResult(
+ SPV_ERROR_INVALID_DATA,
+ "to be only used for variables with Input storage class",
+ "uses storage class Output"))));
+
+INSTANTIATE_TEST_SUITE_P(
+ ArmCoreBuiltinsNotIntScalar,
+ ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
+ Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
+ "WarpMaxIDARM"),
+ Values("Vertex", "Fragment", "TessellationControl",
+ "TessellationEvaluation", "Geometry", "GLCompute"),
+ Values("Input"), Values("%f32", "%u32vec3"),
+ Values("OpCapability CoreBuiltinsARM\n"),
+ Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
+ Values(TestResult(SPV_ERROR_INVALID_DATA,
+ "needs to be a 32-bit int scalar",
+ "is not an int scalar"))));
+
+INSTANTIATE_TEST_SUITE_P(
+ ArmCoreBuiltinsNotInt32,
+ ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
+ Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
+ "WarpMaxIDARM"),
+ Values("Vertex", "Fragment", "TessellationControl",
+ "TessellationEvaluation", "Geometry", "GLCompute"),
+ Values("Input"), Values("%u64"),
+ Values("OpCapability CoreBuiltinsARM\n"),
+ Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
+ Values(TestResult(SPV_ERROR_INVALID_DATA,
+ "needs to be a 32-bit int scalar",
+ "has bit width 64"))));
+
CodeGenerator GetWorkgroupSizeSuccessGenerator() {
CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();