From 7fdb6eaad30703caff05a3aa265f124247340825 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Thu, 26 Nov 2020 15:47:04 +0100 Subject: [PATCH] Parse & render sType from spec (fixes #3) --- generator/vulkan/parse.zig | 8 ++++++++ generator/vulkan/registry.zig | 1 + generator/vulkan/render.zig | 15 ++++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/generator/vulkan/parse.zig b/generator/vulkan/parse.zig index 9e88ffc..805fe07 100644 --- a/generator/vulkan/parse.zig +++ b/generator/vulkan/parse.zig @@ -171,9 +171,16 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi var i: usize = 0; var it = ty.findChildrenByTag("member"); + var maybe_stype: ?[]const u8 = null; while (it.next()) |member| { var xctok = cparse.XmlCTokenizer.init(member); members[i] = try cparse.parseMember(allocator, &xctok); + if (mem.eql(u8, members[i].name, "sType")) { + if (member.getAttribute("values")) |stype| { + maybe_stype = stype; + } + } + i += 1; } @@ -194,6 +201,7 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi .name = name, .decl_type = .{ .container = .{ + .stype = maybe_stype, .fields = members, .is_union = is_union, } diff --git a/generator/vulkan/registry.zig b/generator/vulkan/registry.zig index b65d89c..244377a 100644 --- a/generator/vulkan/registry.zig +++ b/generator/vulkan/registry.zig @@ -64,6 +64,7 @@ pub const Container = struct { is_buffer_len: bool, }; + stype: ?[]const u8, fields: []Field, is_union: bool, }; diff --git a/generator/vulkan/render.zig b/generator/vulkan/render.zig index 21ead56..2678d18 100644 --- a/generator/vulkan/render.zig +++ b/generator/vulkan/render.zig @@ -638,7 +638,7 @@ fn Renderer(comptime WriterType: type) type { } } else { try self.renderTypeInfo(field.field_type); - try self.renderContainerDefaultField(name, field); + try self.renderContainerDefaultField(container, field); try self.writer.writeAll(", "); } } @@ -646,12 +646,21 @@ fn Renderer(comptime WriterType: type) type { try self.writer.writeAll("};\n"); } - fn renderContainerDefaultField(self: *Self, name: []const u8, field: reg.Container.Field) !void { + fn renderContainerDefaultField(self: *Self, container: reg.Container, field: reg.Container.Field) !void { if (mem.eql(u8, field.name, "pNext")) { try self.writer.writeAll(" = null"); } else if (mem.eql(u8, field.name, "sType")) { + if (container.stype == null) { + return; + } + + const stype = container.stype.?; + if (!mem.startsWith(u8, stype, "VK_STRUCTURE_TYPE_")) { + return error.InvalidRegistry; + } + try self.writer.writeAll(" = ."); - try self.writeIdentifierWithCase(.snake, trimVkNamespace(name)); + try self.writeIdentifierWithCase(.snake, stype["VK_STRUCTURE_TYPE_".len ..]); } }