Fix another vk.xml moment

This commit is contained in:
Robin Voetter
2021-06-14 20:49:09 +02:00
parent 511211f038
commit de0a048f45
3 changed files with 47 additions and 16 deletions

View File

@@ -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 = .{
@@ -43,11 +43,11 @@ pub const ResourceGenStep = struct {
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;
}

View File

@@ -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);
}

View File

@@ -70,12 +70,15 @@ pub const Container = 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
int: i32, alias: struct {
int: i32,
alias: struct {
name: []const u8,
is_compat_alias: bool,
} };
},
};
pub const Field = struct {
name: []const u8,