From de0a048f45a2257ba855d4e3660170a4e365d684 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Mon, 14 Jun 2021 20:49:09 +0200 Subject: [PATCH] Fix another vk.xml moment --- build.zig | 12 ++++++------ generator/vulkan/generator.zig | 36 ++++++++++++++++++++++++++++++---- generator/vulkan/registry.zig | 15 ++++++++------ 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/build.zig b/build.zig index fcd3168..326deb1 100644 --- a/build.zig +++ b/build.zig @@ -21,11 +21,11 @@ pub const ResourceGenStep = struct { self.* = .{ .step = Step.init(.custom, "resources", builder.allocator, make), - .shader_step = vkgen.ShaderCompileStep.init(builder, &[_][]const u8{"glslc", "--target-env=vulkan1.2"}), + .shader_step = vkgen.ShaderCompileStep.init(builder, &[_][]const u8{ "glslc", "--target-env=vulkan1.2" }), .builder = builder, .package = .{ .name = "resources", - .path = .{.generated = &self.output_file}, + .path = .{ .generated = &self.output_file }, .dependencies = null, }, .output_file = .{ @@ -40,14 +40,14 @@ pub const ResourceGenStep = struct { } fn renderPath(self: *ResourceGenStep, path: []const u8, writer: anytype) void { - const separators = &[_]u8{ std.fs.path.sep_windows, std.fs.path.sep_posix }; + const separators = &[_]u8{ std.fs.path.sep_windows, std.fs.path.sep_posix }; var i: usize = 0; while (std.mem.indexOfAnyPos(u8, path, i, separators)) |j| { - writer.writeAll(path[i .. j]) catch unreachable; + writer.writeAll(path[i..j]) catch unreachable; switch (std.fs.path.sep) { std.fs.path.sep_windows => writer.writeAll("\\\\") catch unreachable, std.fs.path.sep_posix => writer.writeByte(std.fs.path.sep_posix) catch unreachable, - else => unreachable + else => unreachable, } i = j + 1; @@ -59,7 +59,7 @@ pub const ResourceGenStep = struct { const shader_out_path = self.shader_step.add(source); var writer = self.resources.writer(); - writer.print("pub const {s} = @embedFile(\"", .{ name }) catch unreachable; + writer.print("pub const {s} = @embedFile(\"", .{name}) catch unreachable; self.renderPath(shader_out_path, writer); writer.writeAll("\");\n") catch unreachable; } diff --git a/generator/vulkan/generator.zig b/generator/vulkan/generator.zig index ade9af0..b0c28d1 100644 --- a/generator/vulkan/generator.zig +++ b/generator/vulkan/generator.zig @@ -147,10 +147,37 @@ pub const Generator = struct { try merger.merge(); } - fn fixupTags(self: *Generator) !void { - var fixer_upper = TagFixerUpper.init(self.gpa, &self.registry, &self.id_renderer); - defer fixer_upper.deinit(); - try fixer_upper.fixup(); + // https://github.com/KhronosGroup/Vulkan-Docs/pull/1556 + fn fixupBitFlags(self: *Generator) !void { + var seen_bits = std.StringArrayHashMap(void).init(&self.reg_arena.allocator); + defer seen_bits.deinit(); + + for (self.registry.decls) |decl| { + const bitmask = switch (decl.decl_type) { + .bitmask => |bm| bm, + else => continue, + }; + + if (bitmask.bits_enum) |bits_enum| { + try seen_bits.put(bits_enum, {}); + } + } + + var i: usize = 0; + + for (self.registry.decls) |decl| { + switch (decl.decl_type) { + .enumeration => |e| { + if (e.is_bitmask and seen_bits.get(decl.name) == null) + continue; + }, + else => {} + } + self.registry.decls[i] = decl; + i += 1; + } + + self.registry.decls.len = i; } fn render(self: *Generator, writer: anytype) !void { @@ -170,5 +197,6 @@ pub fn generate(allocator: *Allocator, spec_xml: []const u8, writer: anytype) !v defer gen.deinit(); try gen.mergeEnumFields(); + try gen.fixupBitFlags(); try gen.render(writer); } diff --git a/generator/vulkan/registry.zig b/generator/vulkan/registry.zig index 203dcd7..46c5b11 100644 --- a/generator/vulkan/registry.zig +++ b/generator/vulkan/registry.zig @@ -70,12 +70,15 @@ pub const Container = struct { }; pub const Enum = struct { - pub const Value = union(enum) { bitpos: u6, // 1 << bitpos - bit_vector: i32, // Combined flags & some vendor IDs - int: i32, alias: struct { - name: []const u8, - is_compat_alias: bool, - } }; + pub const Value = union(enum) { + bitpos: u6, // 1 << bitpos + bit_vector: i32, // Combined flags & some vendor IDs + int: i32, + alias: struct { + name: []const u8, + is_compat_alias: bool, + }, + }; pub const Field = struct { name: []const u8,