diff options
author | Spencer Fricke <spencerfricke@gmail.com> | 2022-08-29 18:09:20 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-29 18:09:20 +0300 |
commit | 66bdbacc9ca9694aef2846a56b953e296aa9cbd5 (patch) | |
tree | a2ff88e6c743847334a65d5fcbc364f4400c98f1 | |
parent | f76431cbaf86e7d5a148dd45ecbe2d4531fcdd21 (diff) |
spirv-val: Use lookup table for Decoration string (#4903)
-rw-r--r-- | source/val/validate_annotation.cpp | 142 | ||||
-rw-r--r-- | source/val/validate_decorations.cpp | 40 | ||||
-rw-r--r-- | source/val/validation_state.h | 10 |
3 files changed, 23 insertions, 169 deletions
diff --git a/source/val/validate_annotation.cpp b/source/val/validate_annotation.cpp index c27c79943..112c7cdaa 100644 --- a/source/val/validate_annotation.cpp +++ b/source/val/validate_annotation.cpp @@ -22,138 +22,6 @@ namespace spvtools { namespace val { namespace { -std::string LogStringForDecoration(uint32_t decoration) { - switch (decoration) { - case SpvDecorationRelaxedPrecision: - return "RelaxedPrecision"; - case SpvDecorationSpecId: - return "SpecId"; - case SpvDecorationBlock: - return "Block"; - case SpvDecorationBufferBlock: - return "BufferBlock"; - case SpvDecorationRowMajor: - return "RowMajor"; - case SpvDecorationColMajor: - return "ColMajor"; - case SpvDecorationArrayStride: - return "ArrayStride"; - case SpvDecorationMatrixStride: - return "MatrixStride"; - case SpvDecorationGLSLShared: - return "GLSLShared"; - case SpvDecorationGLSLPacked: - return "GLSLPacked"; - case SpvDecorationCPacked: - return "CPacked"; - case SpvDecorationBuiltIn: - return "BuiltIn"; - case SpvDecorationNoPerspective: - return "NoPerspective"; - case SpvDecorationFlat: - return "Flat"; - case SpvDecorationPatch: - return "Patch"; - case SpvDecorationCentroid: - return "Centroid"; - case SpvDecorationSample: - return "Sample"; - case SpvDecorationInvariant: - return "Invariant"; - case SpvDecorationRestrict: - return "Restrict"; - case SpvDecorationAliased: - return "Aliased"; - case SpvDecorationVolatile: - return "Volatile"; - case SpvDecorationConstant: - return "Constant"; - case SpvDecorationCoherent: - return "Coherent"; - case SpvDecorationNonWritable: - return "NonWritable"; - case SpvDecorationNonReadable: - return "NonReadable"; - case SpvDecorationUniform: - return "Uniform"; - case SpvDecorationSaturatedConversion: - return "SaturatedConversion"; - case SpvDecorationStream: - return "Stream"; - case SpvDecorationLocation: - return "Location"; - case SpvDecorationComponent: - return "Component"; - case SpvDecorationIndex: - return "Index"; - case SpvDecorationBinding: - return "Binding"; - case SpvDecorationDescriptorSet: - return "DescriptorSet"; - case SpvDecorationOffset: - return "Offset"; - case SpvDecorationXfbBuffer: - return "XfbBuffer"; - case SpvDecorationXfbStride: - return "XfbStride"; - case SpvDecorationFuncParamAttr: - return "FuncParamAttr"; - case SpvDecorationFPRoundingMode: - return "FPRoundingMode"; - case SpvDecorationFPFastMathMode: - return "FPFastMathMode"; - case SpvDecorationLinkageAttributes: - return "LinkageAttributes"; - case SpvDecorationNoContraction: - return "NoContraction"; - case SpvDecorationInputAttachmentIndex: - return "InputAttachmentIndex"; - case SpvDecorationAlignment: - return "Alignment"; - case SpvDecorationMaxByteOffset: - return "MaxByteOffset"; - case SpvDecorationAlignmentId: - return "AlignmentId"; - case SpvDecorationMaxByteOffsetId: - return "MaxByteOffsetId"; - case SpvDecorationNoSignedWrap: - return "NoSignedWrap"; - case SpvDecorationNoUnsignedWrap: - return "NoUnsignedWrap"; - case SpvDecorationExplicitInterpAMD: - return "ExplicitInterpAMD"; - case SpvDecorationOverrideCoverageNV: - return "OverrideCoverageNV"; - case SpvDecorationPassthroughNV: - return "PassthroughNV"; - case SpvDecorationViewportRelativeNV: - return "ViewportRelativeNV"; - case SpvDecorationSecondaryViewportRelativeNV: - return "SecondaryViewportRelativeNV"; - case SpvDecorationPerPrimitiveNV: - return "PerPrimitiveNV"; - case SpvDecorationPerViewNV: - return "PerViewNV"; - case SpvDecorationPerTaskNV: - return "PerTaskNV"; - case SpvDecorationPerVertexKHR: - return "PerVertexKHR"; - case SpvDecorationNonUniform: - return "NonUniform"; - case SpvDecorationRestrictPointer: - return "RestrictPointer"; - case SpvDecorationAliasedPointer: - return "AliasedPointer"; - case SpvDecorationCounterBuffer: - return "CounterBuffer"; - case SpvDecorationHlslSemanticGOOGLE: - return "HlslSemanticGOOGLE"; - default: - break; - } - return "Unknown"; -} - // Returns true if the decoration takes ID parameters. // TODO(dneto): This can be generated from the grammar. bool DecorationTakesIdParameters(SpvDecoration type) { @@ -233,7 +101,7 @@ spv_result_t ValidateDecorationTarget(ValidationState_t& _, SpvDecoration dec, auto fail = [&_, dec, inst, target](uint32_t vuid) -> DiagnosticStream { DiagnosticStream ds = std::move( _.diag(SPV_ERROR_INVALID_ID, inst) - << _.VkErrorID(vuid) << LogStringForDecoration(dec) + << _.VkErrorID(vuid) << _.SpvDecorationString(dec) << " decoration on target <id> '" << _.getIdName(target->id()) << "' "); return ds; }; @@ -334,7 +202,7 @@ spv_result_t ValidateDecorationTarget(ValidationState_t& _, SpvDecoration dec, sc != SpvStorageClassIncomingCallableDataKHR && sc != SpvStorageClassShaderRecordBufferKHR) { return _.diag(SPV_ERROR_INVALID_ID, target) - << _.VkErrorID(6672) << LogStringForDecoration(dec) + << _.VkErrorID(6672) << _.SpvDecorationString(dec) << " decoration must not be applied to this storage class"; } break; @@ -391,7 +259,7 @@ spv_result_t ValidateDecorate(ValidationState_t& _, const Instruction* inst) { (decoration == SpvDecorationGLSLPacked)) { return _.diag(SPV_ERROR_INVALID_ID, inst) << _.VkErrorID(4669) << "OpDecorate decoration '" - << LogStringForDecoration(decoration) + << _.SpvDecorationString(decoration) << "' is not valid for the Vulkan execution environment."; } } @@ -405,7 +273,7 @@ spv_result_t ValidateDecorate(ValidationState_t& _, const Instruction* inst) { if (target->opcode() != SpvOpDecorationGroup) { if (IsMemberDecorationOnly(decoration)) { return _.diag(SPV_ERROR_INVALID_ID, inst) - << LogStringForDecoration(decoration) + << _.SpvDecorationString(decoration) << " can only be applied to structure members"; } @@ -458,7 +326,7 @@ spv_result_t ValidateMemberDecorate(ValidationState_t& _, const auto decoration = inst->GetOperandAs<SpvDecoration>(2); if (IsNotMemberDecoration(decoration)) { return _.diag(SPV_ERROR_INVALID_ID, inst) - << LogStringForDecoration(decoration) + << _.SpvDecorationString(decoration) << " cannot be applied to structure members"; } diff --git a/source/val/validate_decorations.cpp b/source/val/validate_decorations.cpp index 4e4f10860..c5764ac12 100644 --- a/source/val/validate_decorations.cpp +++ b/source/val/validate_decorations.cpp @@ -1295,32 +1295,6 @@ bool AtMostOncePerMember(SpvDecoration decoration) { } } -// Returns the string name for |decoration|. -const char* GetDecorationName(SpvDecoration decoration) { - switch (decoration) { - case SpvDecorationAliased: - return "Aliased"; - case SpvDecorationRestrict: - return "Restrict"; - case SpvDecorationArrayStride: - return "ArrayStride"; - case SpvDecorationOffset: - return "Offset"; - case SpvDecorationMatrixStride: - return "MatrixStride"; - case SpvDecorationRowMajor: - return "RowMajor"; - case SpvDecorationColMajor: - return "ColMajor"; - case SpvDecorationBlock: - return "Block"; - case SpvDecorationBufferBlock: - return "BufferBlock"; - default: - return ""; - } -} - spv_result_t CheckDecorationsCompatibility(ValidationState_t& vstate) { using PerIDKey = std::tuple<SpvDecoration, uint32_t>; using PerMemberKey = std::tuple<SpvDecoration, uint32_t, uint32_t>; @@ -1353,7 +1327,7 @@ spv_result_t CheckDecorationsCompatibility(ValidationState_t& vstate) { if (already_used && AtMostOncePerId(dec_type)) { return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) << "ID '" << id << "' decorated with " - << GetDecorationName(dec_type) + << vstate.SpvDecorationString(dec_type) << " multiple times is not allowed."; } // Verify certain mutually exclusive decorations are not both applied on @@ -1373,8 +1347,9 @@ spv_result_t CheckDecorationsCompatibility(ValidationState_t& vstate) { if (seen_per_id.find(excl_k) != seen_per_id.end()) { return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) << "ID '" << id << "' decorated with both " - << GetDecorationName(dec_type) << " and " - << GetDecorationName(excl_dec_type) << " is not allowed."; + << vstate.SpvDecorationString(dec_type) << " and " + << vstate.SpvDecorationString(excl_dec_type) + << " is not allowed."; } } } else if (SpvOpMemberDecorate == inst.opcode()) { @@ -1386,7 +1361,7 @@ spv_result_t CheckDecorationsCompatibility(ValidationState_t& vstate) { if (already_used && AtMostOncePerMember(dec_type)) { return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) << "ID '" << id << "', member '" << member_id - << "' decorated with " << GetDecorationName(dec_type) + << "' decorated with " << vstate.SpvDecorationString(dec_type) << " multiple times is not allowed."; } // Verify certain mutually exclusive decorations are not both applied on @@ -1406,8 +1381,9 @@ spv_result_t CheckDecorationsCompatibility(ValidationState_t& vstate) { if (seen_per_member.find(excl_k) != seen_per_member.end()) { return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) << "ID '" << id << "', member '" << member_id - << "' decorated with both " << GetDecorationName(dec_type) - << " and " << GetDecorationName(excl_dec_type) + << "' decorated with both " + << vstate.SpvDecorationString(dec_type) << " and " + << vstate.SpvDecorationString(excl_dec_type) << " is not allowed."; } } diff --git a/source/val/validation_state.h b/source/val/validation_state.h index b4d343d94..1b599ff35 100644 --- a/source/val/validation_state.h +++ b/source/val/validation_state.h @@ -723,6 +723,16 @@ class ValidationState_t { // Returns the disassembly string for the given instruction. std::string Disassemble(const uint32_t* words, uint16_t num_words) const; + // Returns the string name for |decoration|. + std::string SpvDecorationString(uint32_t decoration) { + spv_operand_desc desc = nullptr; + if (grammar_.lookupOperand(SPV_OPERAND_TYPE_DECORATION, decoration, + &desc) != SPV_SUCCESS) { + return std::string("Unknown"); + } + return std::string(desc->name); + } + // Returns whether type m1 and type m2 are cooperative matrices with // the same "shape" (matching scope, rows, cols). If any are specialization // constants, we assume they can match because we can't prove they don't. |