aboutsummaryrefslogtreecommitdiff
path: root/tools/buildHeaders/jsonToSpirv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/buildHeaders/jsonToSpirv.cpp')
-rw-r--r--tools/buildHeaders/jsonToSpirv.cpp46
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);
}
}
}