diff --git a/generator/vulkan/parse.zig b/generator/vulkan/parse.zig index 789f966..40b8bdd 100644 --- a/generator/vulkan/parse.zig +++ b/generator/vulkan/parse.zig @@ -205,6 +205,18 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi members = allocator.shrink(members, i); + var maybe_extends: ?[][]const u8 = null; + if (ty.getAttribute("structextends")) |extends| { + const n_structs = std.mem.count(u8, extends, ",") + 1; + maybe_extends = try allocator.alloc([]const u8, n_structs); + var struct_extends = std.mem.split(extends, ","); + var j: usize = 0; + while (struct_extends.next()) |struct_extend| { + maybe_extends.?[j] = struct_extend; + j += 1; + } + } + it = ty.findChildrenByTag("member"); for (members) |*member| { const member_elem = it.next().?; @@ -218,6 +230,7 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi .stype = maybe_stype, .fields = members, .is_union = is_union, + .extends = maybe_extends, }, }, }; diff --git a/generator/vulkan/registry.zig b/generator/vulkan/registry.zig index 46c5b11..156ccff 100644 --- a/generator/vulkan/registry.zig +++ b/generator/vulkan/registry.zig @@ -65,6 +65,7 @@ pub const Container = struct { }; stype: ?[]const u8, + extends: ?[]const []const u8, fields: []Field, is_union: bool, }; diff --git a/generator/vulkan/render.zig b/generator/vulkan/render.zig index 89ae299..7df7a53 100644 --- a/generator/vulkan/render.zig +++ b/generator/vulkan/render.zig @@ -728,9 +728,20 @@ fn Renderer(comptime WriterType: type) type { try self.writer.writeAll(" = ."); try self.writeIdentifierWithCase(.snake, stype["VK_STRUCTURE_TYPE_".len..]); + } else if (field.field_type == .name and !container.is_union and mem.eql(u8, "VkBool32", field.field_type.name) and isFeatureStruct(container.extends)) { + try self.writer.writeAll(" = FALSE"); } } + fn isFeatureStruct(maybe_extends: ?[]const []const u8) bool { + if (maybe_extends) |extends| { + return for (extends) |extend| { + if (mem.eql(u8, extend, "VkDeviceCreateInfo")) break true; + } else false; + } + return false; + } + fn renderEnumFieldName(self: *Self, name: []const u8, field_name: []const u8) !void { try self.writeIdentifierWithCase(.snake, try self.extractEnumFieldName(name, field_name)); }