diff --git a/generator/index.zig b/generator/index.zig index ceb2a6b..205e174 100644 --- a/generator/index.zig +++ b/generator/index.zig @@ -5,5 +5,6 @@ pub const ShaderCompileStep = @import("build_integration.zig").ShaderCompileStep test "main" { _ = @import("xml.zig"); - _ = @import("vulkan/c-parse.zig"); + _ = @import("vulkan/c_parse.zig"); + _ = @import("spirv/generator.zig"); } diff --git a/generator/spirv/generator.zig b/generator/spirv/generator.zig index 483a02c..031bcf4 100644 --- a/generator/spirv/generator.zig +++ b/generator/spirv/generator.zig @@ -1,5 +1,6 @@ const std = @import("std"); const reg = @import("registry.zig"); +const renderSpirv = @import("render.zig").render; const Allocator = std.mem.Allocator; pub fn generate(allocator: *Allocator, spec_jsons: []const []const u8, writer: anytype) !void { @@ -32,4 +33,6 @@ pub fn generate(allocator: *Allocator, spec_jsons: []const []const u8, writer: a if (ext_registry_i != num_ext_registries) { return error.MultipleCoreRegistries; } + + try renderSpirv(writer, allocator, &core_registry, ext_registries); } diff --git a/generator/spirv/render.zig b/generator/spirv/render.zig new file mode 100644 index 0000000..d529d1c --- /dev/null +++ b/generator/spirv/render.zig @@ -0,0 +1,49 @@ +const std = @import("std"); +const reg = @import("registry.zig"); +const IdRenderer = @import("../id_render.zig").IdRenderer; +const Allocator = std.mem.Allocator; + +// The SPIR-V spec doesn't contain any tag information like vulkan.xml does, +// so the tags are just hardcoded. They are retrieved from +// https://github.com/KhronosGroup/SPIRV-Registry/tree/master/extensions +const tags = [_][]const u8{ + "AMD", + "EXT", + "GOOGLE", + "INTEL", + "KHR", + "NV", +}; + +fn Renderer(comptime WriterType: type) type { + return struct { + const Self = @This(); + + writer: WriterType, + allocator: *Allocator, + core: *const reg.CoreRegistry, + extensions: []const reg.ExtensionRegistry, + id_renderer: IdRenderer, + + fn deinit(self: Self) void { + + } + + fn render(self: *Self) !void { + + } + }; +} + +pub fn render(writer: anytype, allocator: *Allocator, core: *const reg.CoreRegistry, extensions: []const reg.ExtensionRegistry) !void { + const id_renderer = IdRenderer.init(allocator, &tags); + var renderer = Renderer(@TypeOf(writer)) { + .writer = writer, + .allocator = allocator, + .core = core, + .extensions = extensions, + .id_renderer = id_renderer, + }; + defer renderer.deinit(); + try renderer.render(); +}