diff options
Diffstat (limited to 'tools/buildHeaders/jsonToSpirv.cpp')
-rw-r--r-- | tools/buildHeaders/jsonToSpirv.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tools/buildHeaders/jsonToSpirv.cpp b/tools/buildHeaders/jsonToSpirv.cpp index e5b1e3e..67b5bce 100644 --- a/tools/buildHeaders/jsonToSpirv.cpp +++ b/tools/buildHeaders/jsonToSpirv.cpp @@ -25,6 +25,7 @@ #include <assert.h> #include <string.h> #include <algorithm> +#include <cstdlib> #include <iostream> #include <unordered_map> #include <unordered_set> @@ -63,6 +64,8 @@ EnumValues FPFastMathParams; EnumValues FPRoundingModeParams; EnumValues FPDenormModeParams; EnumValues FPOperationModeParams; +EnumValues QuantizationModesParams; +EnumValues OverflowModesParams; EnumValues LinkageTypeParams; EnumValues DecorationParams; EnumValues BuiltInParams; @@ -84,6 +87,7 @@ EnumValues RayQueryIntersectionParams; EnumValues RayQueryCommittedIntersectionTypeParams; EnumValues RayQueryCandidateIntersectionTypeParams; EnumValues FragmentShadingRateParams; +EnumValues PackedVectorFormatParams; std::pair<bool, std::string> ReadFile(const std::string& path) { @@ -184,6 +188,10 @@ ClassOptionality ToOperandClassAndOptionality(const std::string& operandKind, co type = OperandFPDenormMode; } else if (operandKind == "FPOperationMode") { type = OperandFPOperationMode; + } else if (operandKind == "QuantizationModes") { + type = OperandQuantizationModes; + } else if (operandKind == "OverflowModes") { + type = OperandOverflowModes; } else if (operandKind == "LinkageType") { type = OperandLinkageType; } else if (operandKind == "AccessQualifier") { @@ -224,6 +232,8 @@ ClassOptionality ToOperandClassAndOptionality(const std::string& operandKind, co type = OperandRayQueryCandidateIntersectionType; } else if (operandKind == "FragmentShadingRate") { type = OperandFragmentShadingRate; + } else if (operandKind == "PackedVectorFormat") { + type = OperandPackedVectorFormat; } if (type == OperandNone) { @@ -326,6 +336,8 @@ void jsonToSpirv(const std::string& jsonPath, bool buildingHeaders) // process the instructions const Json::Value insts = root["instructions"]; + unsigned maxOpcode = 0; + bool firstOpcode = true; for (const auto& inst : insts) { const auto printingClass = inst["class"].asString(); if (printingClass.size() == 0) { @@ -341,6 +353,19 @@ void jsonToSpirv(const std::string& jsonPath, bool buildingHeaders) } const auto opcode = inst["opcode"].asUInt(); const std::string name = inst["opname"].asString(); + if (firstOpcode) { + maxOpcode = opcode; + firstOpcode = false; + } else { + if (maxOpcode > opcode) { + std::cerr << "Error: " << name + << " is out of order. It follows the instruction with opcode " << maxOpcode + << std::endl; + std::exit(1); + } else { + maxOpcode = opcode; + } + } EnumCaps caps = getCaps(inst); std::string version = inst["version"].asString(); std::string lastVersion = inst["lastVersion"].asString(); @@ -384,12 +409,27 @@ void jsonToSpirv(const std::string& jsonPath, bool buildingHeaders) return result; }; + unsigned maxValue = 0; + bool firstValue = true; for (const auto& enumerant : source["enumerants"]) { unsigned value; bool skip_zero_in_bitfield; std::tie(value, skip_zero_in_bitfield) = getValue(enumerant); if (skip_zero_in_bitfield) continue; + if (firstValue) { + maxValue = value; + firstValue = false; + } else { + if (maxValue > value) { + std::cerr << "Error: " << source["kind"] << " enumerant " << enumerant["enumerant"] + << " is out of order. It has value " << value + << " but follows the enumerant with value " << maxValue << std::endl; + std::exit(1); + } else { + maxValue = value; + } + } EnumCaps caps(getCaps(enumerant)); std::string version = enumerant["version"].asString(); std::string lastVersion = enumerant["lastVersion"].asString(); @@ -462,6 +502,10 @@ void jsonToSpirv(const std::string& jsonPath, bool buildingHeaders) establishOperandClass(enumName, OperandFPDenormMode, &FPDenormModeParams, operandEnum, category); } else if (enumName == "FPOperationMode") { establishOperandClass(enumName, OperandFPOperationMode, &FPOperationModeParams, operandEnum, category); + } else if (enumName == "QuantizationModes") { + establishOperandClass(enumName, OperandQuantizationModes, &QuantizationModesParams, operandEnum, category); + } else if (enumName == "OverflowModes") { + establishOperandClass(enumName, OperandOverflowModes, &OverflowModesParams, operandEnum, category); } else if (enumName == "LinkageType") { establishOperandClass(enumName, OperandLinkageType, &LinkageTypeParams, operandEnum, category); } else if (enumName == "FunctionParameterAttribute") { @@ -498,6 +542,8 @@ void jsonToSpirv(const std::string& jsonPath, bool buildingHeaders) establishOperandClass(enumName, OperandRayQueryCandidateIntersectionType, &RayQueryCandidateIntersectionTypeParams, operandEnum, category); } else if (enumName == "FragmentShadingRate") { establishOperandClass(enumName, OperandFragmentShadingRate, &FragmentShadingRateParams, operandEnum, category); + } else if (enumName == "PackedVectorFormat") { + establishOperandClass(enumName, OperandPackedVectorFormat, &PackedVectorFormatParams, operandEnum, category); } } } |