diff options
author | Kévin Petit <kevin.petit@arm.com> | 2022-10-06 05:47:10 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-06 05:47:10 +0300 |
commit | a6e6454ef27f9c3c652d6a37281c3b9ed45d4667 (patch) | |
tree | 7ca7377917655153e5e13b92e24d694e0a36a2a0 | |
parent | 4dbc66380dd63aabbd33c38198008449d0a5807a (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.cpp | 19 | ||||
-rw-r--r-- | test/val/val_builtins_test.cpp | 55 |
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(); |