forked from mirror/vulkan-zig
Make SPIR-V registry parse-able by std.json.parse
This commit is contained in:
@@ -1,65 +1,72 @@
|
||||
// See https://www.khronos.org/registry/spir-v/specs/unified1/MachineReadableGrammar.html
|
||||
|
||||
pub const Registry = struct {
|
||||
copyright: []const u8,
|
||||
registry_type: RegistryType,
|
||||
instruction: []Instruction,
|
||||
pub const Registry = union(enum) {
|
||||
core: CoreRegistry,
|
||||
extension: ExtensionRegistry,
|
||||
};
|
||||
|
||||
pub const CoreRegistry = struct {
|
||||
copyright: [][]const u8,
|
||||
magic_number: []const u8, // Hexadecimal representation of the magic number
|
||||
major_version: u32,
|
||||
minor_version: u32,
|
||||
revision: u32,
|
||||
instructions: []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 ExtensionRegistry = struct {
|
||||
copyright: [][]const u8,
|
||||
version: u32,
|
||||
minor_version: u32,
|
||||
revision: u32,
|
||||
instructions: []Instruction,
|
||||
operand_kinds: []OperandKind,
|
||||
};
|
||||
|
||||
pub const Instruction = struct {
|
||||
opname: []const u8,
|
||||
opcode: u32,
|
||||
operands: []Operand,
|
||||
capabilities: [][]const u8,
|
||||
operands: []Operand = &[_]Operand{},
|
||||
capabilities: [][]const u8 = &[_][]const u8{},
|
||||
extensions: [][]const u8 = &[_][]const u8{},
|
||||
};
|
||||
|
||||
pub const Operand = struct {
|
||||
kind: []const u8,
|
||||
quantifier: Quantifier,
|
||||
name: []const u8,
|
||||
|
||||
/// Either
|
||||
/// - null: exactly once.
|
||||
/// - "?": zero or once.
|
||||
/// - "*": zero or more.
|
||||
quantifier: ?[]const u8 = null,
|
||||
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 OperandCategory = enum {
|
||||
// Note: non-canonical casing to match Spir-V JSON spec/
|
||||
BitEnum,
|
||||
ValueEnum,
|
||||
Id,
|
||||
Literal,
|
||||
Composite,
|
||||
};
|
||||
|
||||
pub const OperandKind = struct {
|
||||
category: OperandCategory,
|
||||
name: []const u8,
|
||||
doc: []const u8,
|
||||
kind: []const u8,
|
||||
doc: []const u8 = "",
|
||||
enumerants: ?[]Enumerant = null,
|
||||
bases: ?[]const []const u8 = null,
|
||||
};
|
||||
|
||||
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,
|
||||
enumerant: []const u8,
|
||||
value: union(enum) {
|
||||
bitflag: []const u8, // Hexadecimal representation of the value
|
||||
int: u31,
|
||||
},
|
||||
capabilities: [][]const u8 = &[_][]const u8{},
|
||||
extensions: [][]const u8 = &[_][]const u8{}, // Valid for .ValueEnum
|
||||
parameters: []Operand = &[_]Operand{}, // `quantifier` will always be `null`.
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user