diff --git a/generator/spirv/generator.zig b/generator/spirv/generator.zig index 70b454a..483a02c 100644 --- a/generator/spirv/generator.zig +++ b/generator/spirv/generator.zig @@ -6,9 +6,30 @@ pub fn generate(allocator: *Allocator, spec_jsons: []const []const u8, writer: a var arena = std.heap.ArenaAllocator.init(allocator); defer arena.deinit(); - const registries = try arena.allocator.alloc(reg.Registry, spec_jsons.len); - for (registries) |*registry, i| { - var tokens = std.json.TokenStream.init(spec_jsons[i]); - registry.* = try std.json.parse(reg.Registry, &tokens, .{.allocator = &arena.allocator}); + // Only one of the passed specs may be core (and one of them _must_ be core) - + // the others must be exensions. + var core_registry: reg.CoreRegistry = undefined; + const num_ext_registries = spec_jsons.len - 1; + const ext_registries = try arena.allocator.alloc(reg.ExtensionRegistry, num_ext_registries); + + var ext_registry_i: usize = 0; + for (spec_jsons) |spec_json| { + var tokens = std.json.TokenStream.init(spec_json); + const registry = try std.json.parse(reg.Registry, &tokens, .{.allocator = &arena.allocator}); + switch (registry) { + .core => |parsed_core_registry| core_registry = parsed_core_registry, + .extension => |parsed_ext_registry| { + if (ext_registry_i == num_ext_registries) { + return error.NoCoreRegistry; + } + + ext_registries[ext_registry_i] = parsed_ext_registry; + ext_registry_i += 1; + }, + } + } + + if (ext_registry_i != num_ext_registries) { + return error.MultipleCoreRegistries; } } diff --git a/generator/spirv/registry.zig b/generator/spirv/registry.zig index 60a1be7..4f89f07 100644 --- a/generator/spirv/registry.zig +++ b/generator/spirv/registry.zig @@ -18,10 +18,9 @@ pub const CoreRegistry = struct { pub const ExtensionRegistry = struct { copyright: [][]const u8, version: u32, - minor_version: u32, revision: u32, instructions: []Instruction, - operand_kinds: []OperandKind, + operand_kinds: []OperandKind = &[_]OperandKind{}, }; pub const Instruction = struct {