Fix another vk.xml moment

This commit is contained in:
Robin Voetter
2021-06-14 20:49:09 +02:00
parent 419e541a16
commit b63533d95b
3 changed files with 45 additions and 14 deletions

View File

@@ -38,11 +38,11 @@ pub const ResourceGenStep = struct {
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; var i: usize = 0;
while (std.mem.indexOfAnyPos(u8, path, i, separators)) |j| { 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) { switch (std.fs.path.sep) {
std.fs.path.sep_windows => writer.writeAll("\\\\") catch unreachable, std.fs.path.sep_windows => writer.writeAll("\\\\") catch unreachable,
std.fs.path.sep_posix => writer.writeByte(std.fs.path.sep_posix) catch unreachable, std.fs.path.sep_posix => writer.writeByte(std.fs.path.sep_posix) catch unreachable,
else => unreachable else => unreachable,
} }
i = j + 1; i = j + 1;
@@ -54,7 +54,7 @@ pub const ResourceGenStep = struct {
const shader_out_path = self.shader_step.add(source); const shader_out_path = self.shader_step.add(source);
var writer = self.resources.writer(); 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); self.renderPath(shader_out_path, writer);
writer.writeAll("\");\n") catch unreachable; writer.writeAll("\");\n") catch unreachable;
} }

View File

@@ -147,10 +147,37 @@ pub const Generator = struct {
try merger.merge(); try merger.merge();
} }
fn fixupTags(self: *Generator) !void { // https://github.com/KhronosGroup/Vulkan-Docs/pull/1556
var fixer_upper = TagFixerUpper.init(self.gpa, &self.registry, &self.id_renderer); fn fixupBitFlags(self: *Generator) !void {
defer fixer_upper.deinit(); var seen_bits = std.StringArrayHashMap(void).init(&self.reg_arena.allocator);
try fixer_upper.fixup(); 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 { 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(); defer gen.deinit();
try gen.mergeEnumFields(); try gen.mergeEnumFields();
try gen.fixupBitFlags();
try gen.render(writer); try gen.render(writer);
} }

View File

@@ -70,12 +70,15 @@ pub const Container = struct {
}; };
pub const Enum = struct { pub const Enum = struct {
pub const Value = union(enum) { bitpos: u6, // 1 << bitpos pub const Value = union(enum) {
bitpos: u6, // 1 << bitpos
bit_vector: i32, // Combined flags & some vendor IDs bit_vector: i32, // Combined flags & some vendor IDs
int: i32, alias: struct { int: i32,
alias: struct {
name: []const u8, name: []const u8,
is_compat_alias: bool, is_compat_alias: bool,
} }; },
};
pub const Field = struct { pub const Field = struct {
name: []const u8, name: []const u8,