From d046ace4d8c5134875546f78775f097c5c099c25 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sat, 15 Mar 2025 13:24:36 +0100 Subject: [PATCH] default initialize packed flag structs to 0 --- src/vulkan/generator.zig | 8 +++++++- src/vulkan/parse.zig | 7 ++++++- src/vulkan/render.zig | 13 +++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/vulkan/generator.zig b/src/vulkan/generator.zig index e89f740..b8d9138 100644 --- a/src/vulkan/generator.zig +++ b/src/vulkan/generator.zig @@ -199,7 +199,13 @@ pub const Api = reg.Api; /// and the resulting binding is written to `writer`. `allocator` will be used to allocate temporary /// internal datastructures - mostly via an ArenaAllocator, but sometimes a hashmap uses this allocator /// directly. `api` is the API to generate the bindings for, usually `.vulkan`. -pub fn generate(allocator: Allocator, api: Api, spec_xml: []const u8, maybe_video_spec_xml: ?[]const u8, writer: anytype) !void { +pub fn generate( + allocator: Allocator, + api: Api, + spec_xml: []const u8, + maybe_video_spec_xml: ?[]const u8, + writer: anytype, +) !void { const spec = xml.parse(allocator, spec_xml) catch |err| switch (err) { error.InvalidDocument, error.UnexpectedEof, diff --git a/src/vulkan/parse.zig b/src/vulkan/parse.zig index 4607e5a..548572b 100644 --- a/src/vulkan/parse.zig +++ b/src/vulkan/parse.zig @@ -417,7 +417,12 @@ fn parseEnumAlias(elem: *xml.Element) !?registry.Declaration { return null; } -fn parseEnums(allocator: Allocator, root: *xml.Element, api: registry.Api, decls: *std.ArrayListUnmanaged(registry.Declaration)) !void { +fn parseEnums( + allocator: Allocator, + root: *xml.Element, + api: registry.Api, + decls: *std.ArrayListUnmanaged(registry.Declaration), +) !void { var it = root.findChildrenByTag("enums"); while (it.next()) |enums| { const name = enums.getAttribute("name") orelse return error.InvalidRegistry; diff --git a/src/vulkan/render.zig b/src/vulkan/render.zig index a573d08..9639586 100644 --- a/src/vulkan/render.zig +++ b/src/vulkan/render.zig @@ -993,11 +993,16 @@ fn Renderer(comptime WriterType: type) type { fn renderSimpleBitContainer(self: *Self, container: reg.Container) !bool { var total_bits: usize = 0; + var is_flags_container = true; for (container.fields) |field| { - total_bits += field.bits orelse { + const bits = field.bits orelse { // C abi type - not a packed struct. return false; }; + total_bits += bits; + if (bits != 1) { + is_flags_container = false; + } } try self.writer.writeAll("packed struct(u32) {"); @@ -1012,7 +1017,11 @@ fn Renderer(comptime WriterType: type) type { try self.writer.print(" u{} = 0,\n", .{field.bits.?}); } else if (bits == 1) { // Assume its a flag. - try self.writer.writeAll(" bool,\n"); + if (is_flags_container) { + try self.writer.writeAll(" bool = false,\n"); + } else { + try self.writer.writeAll(" bool,\n"); + } } else { try self.writer.print(" u{},\n", .{field.bits.?}); }