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.* = .{ self.* = .{
.step = Step.init(.custom, "resources", builder.allocator, make), .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, .builder = builder,
.package = .{ .package = .{
.name = "resources", .name = "resources",
.path = .{.generated = &self.output_file}, .path = .{ .generated = &self.output_file },
.dependencies = null, .dependencies = null,
}, },
.output_file = .{ .output_file = .{
@@ -40,14 +40,14 @@ pub const ResourceGenStep = struct {
} }
fn renderPath(self: *ResourceGenStep, path: []const u8, writer: anytype) void { 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; 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;
@@ -59,7 +59,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) {
bit_vector: i32, // Combined flags & some vendor IDs bitpos: u6, // 1 << bitpos
int: i32, alias: struct { bit_vector: i32, // Combined flags & some vendor IDs
name: []const u8, int: i32,
is_compat_alias: bool, alias: struct {
} }; name: []const u8,
is_compat_alias: bool,
},
};
pub const Field = struct { pub const Field = struct {
name: []const u8, name: []const u8,