forked from mirror/vulkan-zig
66 lines
1.3 KiB
Zig
66 lines
1.3 KiB
Zig
// 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,
|
|
};
|