diff --git a/generator/spirv/registry.zig b/generator/spirv/registry.zig new file mode 100644 index 0000000..0016fe4 --- /dev/null +++ b/generator/spirv/registry.zig @@ -0,0 +1,65 @@ +// See https://www.khronos.org/registry/spir-v/specs/unified1/MachineReadableGrammar.html + +pub const Registry = struct { + copyright: []const u8, + registry_type: RegistryType, + instruction: []Instruction, + operand_kinds: []OperandKind, +}; + +pub const RegistryType = union(enum) { + core: struct { + magic_number: u32, + major_version: u32, + minor_version: u32, + revision: u32, + }, + extension: struct { + version: u32, + revision: u32, + }, +}; + +pub const Instruction = struct { + opname: []const u8, + opcode: u32, + operands: []Operand, + capabilities: [][]const u8, +}; + +pub const Operand = struct { + kind: []const u8, + quantifier: Quantifier, + name: []const u8, +}; + +pub const Quantifier = enum { + one, + zero_or_one, + zero_or_more, +}; + +pub const OperandCategory = union(enum) { + bit_enum: []Enumerant, + value_enum: []Enumerant, + id, + literal, + composite: Composite, +}; + +pub const OperandKind = struct { + category: OperandCategory, + name: []const u8, + doc: []const u8, +}; + +pub const Enumerant = struct { + name: []const u8, + value: u32, // A power of 2 for `.bit_enum`. + capabilities: [][]const u8, + parameters: []Operand, // `quantifier` will always be `.one`. +}; + +pub const Composite = struct { + bases: [][]const u8, +};