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:
authorSpencer Fricke <spencerfricke@gmail.com>2022-08-29 18:09:20 +0300
committerGitHub <noreply@github.com>2022-08-29 18:09:20 +0300
commit66bdbacc9ca9694aef2846a56b953e296aa9cbd5 (patch)
treea2ff88e6c743847334a65d5fcbc364f4400c98f1
parentf76431cbaf86e7d5a148dd45ecbe2d4531fcdd21 (diff)
spirv-val: Use lookup table for Decoration string (#4903)
-rw-r--r--source/val/validate_annotation.cpp142
-rw-r--r--source/val/validate_decorations.cpp40
-rw-r--r--source/val/validation_state.h10
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.