From bcda3eeb11caad6ac3d96a3eeebed3fef498ea6a Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sat, 15 Aug 2020 23:51:37 +0200 Subject: [PATCH] Opcode rendering --- generator/spirv/generator.zig | 2 +- generator/spirv/render.zig | 36 +++++++++++++++++++++++++++++------ generator/vulkan/render.zig | 2 +- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/generator/spirv/generator.zig b/generator/spirv/generator.zig index d05545b..ea7d97b 100644 --- a/generator/spirv/generator.zig +++ b/generator/spirv/generator.zig @@ -69,5 +69,5 @@ pub fn generate(allocator: *Allocator, spec_jsons: []const []const u8, writer: a } const merged = try mergeRegistries(&arena.allocator, core_registry, ext_registries); - try renderSpirv(writer, &merged); + try renderSpirv(writer, &arena.allocator, &merged); } diff --git a/generator/spirv/render.zig b/generator/spirv/render.zig index c4dc288..6ec24e5 100644 --- a/generator/spirv/render.zig +++ b/generator/spirv/render.zig @@ -15,6 +15,20 @@ const tags = [_][]const u8{ "NV", }; +const preamble = + \\ + \\ This file is generated from the SPIR-V JSON registry + ; + +fn stripOpPrefix(name: []const u8) []const u8 { + // Some instructions (those from the core) are prefixed with 'Op' + const prefix = "Op"; + return if (std.mem.startsWith(u8, name, prefix)) + name[prefix.len ..] + else + name; +} + fn Renderer(comptime WriterType: type) type { return struct { const Self = @This(); @@ -23,23 +37,33 @@ fn Renderer(comptime WriterType: type) type { registry: *const reg.CoreRegistry, id_renderer: IdRenderer, - fn deinit(self: Self) void { - + fn render(self: *Self) !void { + for (self.registry.copyright) |line| { + try self.writer.print("// {}\n", .{ line }); + } + try self.writer.writeAll(preamble); + try self.renderOpcodes(); } - fn render(self: *Self) !void { - + fn renderOpcodes(self: *Self) !void { + try self.writer.writeAll("pub const Opcode = enum(u16) {\n"); + for (self.registry.instructions) |instr| { + try self.id_renderer.renderWithCase(self.writer, .snake, stripOpPrefix(instr.opname)); + try self.writer.print(" = {},\n", .{ instr.opcode }); + } + try self.writer.writeAll("};\n"); } }; } -pub fn render(writer: anytype, registry: *const reg.CoreRegistry) !void { +pub fn render(writer: anytype, allocator: *Allocator, registry: *const reg.CoreRegistry) !void { const id_renderer = IdRenderer.init(allocator, &tags); + defer id_renderer.deinit(); var renderer = Renderer(@TypeOf(writer)) { .writer = writer, .registry = registry, .id_renderer = id_renderer, }; - defer renderer.deinit(); try renderer.render(); } + diff --git a/generator/vulkan/render.zig b/generator/vulkan/render.zig index 94d7479..6a5e491 100644 --- a/generator/vulkan/render.zig +++ b/generator/vulkan/render.zig @@ -9,7 +9,7 @@ const IdRenderer = id_render.IdRenderer; const preamble = \\ - \\// This file is generated from the Khronos Vulkan XML API Registry + \\// This file is generated from the Khronos Vulkan XML API registry \\ \\const std = @import("std"); \\const builtin = @import("builtin");