Skip to content

Commit 79d901a

Browse files
committed
Fix a whole bunch of issues exposed by ziglang/zig#9191
This also includes a workaround for the fact that @"type" refers to the builtin and not to a variable called "type". See ziglang/zig#2897.
1 parent de0a048 commit 79d901a

File tree

10 files changed

+82
-75
lines changed

10 files changed

+82
-75
lines changed

build.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub const ResourceGenStep = struct {
3939
return self;
4040
}
4141

42-
fn renderPath(self: *ResourceGenStep, path: []const u8, writer: anytype) void {
42+
fn renderPath(path: []const u8, writer: anytype) void {
4343
const separators = &[_]u8{ std.fs.path.sep_windows, std.fs.path.sep_posix };
4444
var i: usize = 0;
4545
while (std.mem.indexOfAnyPos(u8, path, i, separators)) |j| {
@@ -60,7 +60,7 @@ pub const ResourceGenStep = struct {
6060
var writer = self.resources.writer();
6161

6262
writer.print("pub const {s} = @embedFile(\"", .{name}) catch unreachable;
63-
self.renderPath(shader_out_path, writer);
63+
renderPath(shader_out_path, writer);
6464
writer.writeAll("\");\n") catch unreachable;
6565
}
6666

examples/graphics_context.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ pub const GraphicsContext = struct {
123123
self.vki = try InstanceDispatch.load(self.instance, c.glfwGetInstanceProcAddress);
124124
errdefer self.vki.destroyInstance(self.instance, null);
125125

126-
self.surface = try createSurface(self.vki, self.instance, window);
126+
self.surface = try createSurface(self.instance, window);
127127
errdefer self.vki.destroySurfaceKHR(self.instance, self.surface, null);
128128

129129
const candidate = try pickPhysicalDevice(self.vki, self.instance, allocator, self.surface);
@@ -182,7 +182,7 @@ pub const Queue = struct {
182182
}
183183
};
184184

185-
fn createSurface(vki: InstanceDispatch, instance: vk.Instance, window: *c.GLFWwindow) !vk.SurfaceKHR {
185+
fn createSurface(instance: vk.Instance, window: *c.GLFWwindow) !vk.SurfaceKHR {
186186
var surface: vk.SurfaceKHR = undefined;
187187
if (c.glfwCreateWindowSurface(instance, window, null, &surface) != .success) {
188188
return error.SurfaceInitFailed;

examples/triangle.zig

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ pub fn main() !void {
7878
const render_pass = try createRenderPass(&gc, swapchain);
7979
defer gc.vkd.destroyRenderPass(gc.dev, render_pass, null);
8080

81-
var pipeline = try createPipeline(&gc, extent, pipeline_layout, render_pass);
81+
var pipeline = try createPipeline(&gc, pipeline_layout, render_pass);
8282
defer gc.vkd.destroyPipeline(gc.dev, pipeline, null);
8383

8484
var framebuffers = try createFramebuffers(&gc, allocator, render_pass, swapchain);
@@ -104,7 +104,7 @@ pub fn main() !void {
104104
defer gc.vkd.freeMemory(gc.dev, memory, null);
105105
try gc.vkd.bindBufferMemory(gc.dev, buffer, memory, 0);
106106

107-
try uploadVertices(&gc, pool, buffer, memory);
107+
try uploadVertices(&gc, pool, buffer);
108108

109109
var cmdbufs = try createCommandBuffers(
110110
&gc,
@@ -157,7 +157,7 @@ pub fn main() !void {
157157
try swapchain.waitForAllFences();
158158
}
159159

160-
fn uploadVertices(gc: *const GraphicsContext, pool: vk.CommandPool, buffer: vk.Buffer, memory: vk.DeviceMemory) !void {
160+
fn uploadVertices(gc: *const GraphicsContext, pool: vk.CommandPool, buffer: vk.Buffer) !void {
161161
const staging_buffer = try gc.vkd.createBuffer(gc.dev, .{
162162
.flags = .{},
163163
.size = @sizeOf(@TypeOf(vertices)),
@@ -368,7 +368,6 @@ fn createRenderPass(gc: *const GraphicsContext, swapchain: Swapchain) !vk.Render
368368

369369
fn createPipeline(
370370
gc: *const GraphicsContext,
371-
extent: vk.Extent2D,
372371
layout: vk.PipelineLayout,
373372
render_pass: vk.RenderPass,
374373
) !vk.Pipeline {

generator/id_render.zig

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,41 @@ const std = @import("std");
22
const mem = std.mem;
33
const Allocator = mem.Allocator;
44

5+
pub fn isZigPrimitiveType(name: []const u8) bool {
6+
if (name.len > 1 and (name[0] == 'u' or name[0] == 'i')) {
7+
for (name[1..]) |c| {
8+
switch (c) {
9+
'0'...'9' => {},
10+
else => return false,
11+
}
12+
}
13+
return true;
14+
}
15+
16+
const primitives = [_][]const u8{ "void", "comptime_float", "comptime_int", "bool", "isize", "usize", "f16", "f32", "f64", "f128", "c_longdouble", "noreturn", "type", "anyerror", "c_short", "c_ushort", "c_int", "c_uint", "c_long", "c_ulong", "c_longlong", "c_ulonglong" };
17+
18+
for (primitives) |reserved| {
19+
if (mem.eql(u8, reserved, name)) {
20+
return true;
21+
}
22+
}
23+
24+
return false;
25+
}
26+
27+
fn needZigEscape(name: []const u8) bool {
28+
return !std.zig.fmt.isValidId(name) or isZigPrimitiveType(name);
29+
}
30+
31+
pub fn writeIdentifier(out: anytype, id: []const u8) !void {
32+
// https://github.com/ziglang/zig/issues/2897
33+
if (isZigPrimitiveType(id)) {
34+
try out.print("{s}_", .{id});
35+
} else {
36+
try out.print("{}", .{std.zig.fmtId(id)});
37+
}
38+
}
39+
540
pub const CaseStyle = enum {
641
snake,
742
screaming_snake,
@@ -138,14 +173,10 @@ pub const IdRenderer = struct {
138173
}
139174
}
140175

141-
pub fn render(self: IdRenderer, out: anytype, id: []const u8) !void {
142-
try out.print("{}", .{std.zig.fmtId(id)});
143-
}
144-
145176
pub fn renderFmt(self: *IdRenderer, out: anytype, comptime fmt: []const u8, args: anytype) !void {
146177
self.text_cache.items.len = 0;
147178
try std.fmt.format(self.text_cache.writer(), fmt, args);
148-
try out.print("{}", .{std.zig.fmtId(self.text_cache.items)});
179+
try writeIdentifier(out, self.text_cache.items);
149180
}
150181

151182
pub fn renderWithCase(self: *IdRenderer, out: anytype, case_style: CaseStyle, id: []const u8) !void {
@@ -162,7 +193,7 @@ pub const IdRenderer = struct {
162193
.camel => try self.renderCamel(false, adjusted_id, tag),
163194
}
164195

165-
try out.print("{}", .{std.zig.fmtId(self.text_cache.items)});
196+
try writeIdentifier(out, self.text_cache.items);
166197
}
167198

168199
pub fn getAuthorTag(self: IdRenderer, id: []const u8) ?[]const u8 {

generator/index.zig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
pub const generateVk = @import("vulkan/generator.zig").generate;
22
pub const VkGenerateStep = @import("vulkan/build_integration.zig").GenerateStep;
3-
pub const generateSpirv = @import("spirv/generator.zig").generate;
43
pub const ShaderCompileStep = @import("build_integration.zig").ShaderCompileStep;
54

65
test "main" {

generator/main.zig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const usage = "Usage: {s} [-h|--help] <spec xml path> <output zig source>\n";
55

66
pub fn main() !void {
77
const stderr = std.io.getStdErr();
8-
const stdout = std.io.getStdOut();
98

109
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
1110
defer arena.deinit();

generator/vulkan/c_parse.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ pub fn parseVersion(xctok: *XmlCTokenizer) ![4][]const u8 {
514514
return error.InvalidVersion;
515515
}
516516

517-
const name = try xctok.expect(.name);
517+
_ = try xctok.expect(.name);
518518
const vk_make_version = try xctok.expect(.type_name);
519519
if (!mem.eql(u8, vk_make_version.text, "VK_MAKE_API_VERSION")) {
520520
return error.NotVersion;

generator/vulkan/generator.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ pub const Generator = struct {
171171
if (e.is_bitmask and seen_bits.get(decl.name) == null)
172172
continue;
173173
},
174-
else => {}
174+
else => {},
175175
}
176176
self.registry.decls[i] = decl;
177177
i += 1;

generator/vulkan/parse.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ fn parseTypes(allocator: *Allocator, out: []registry.Declaration, types_elem: *x
7474
} else if (mem.eql(u8, category, "funcpointer")) {
7575
break :blk try parseFuncPointer(allocator, ty);
7676
} else if (mem.eql(u8, category, "enum")) {
77-
break :blk (try parseEnumAlias(allocator, ty)) orelse continue;
77+
break :blk (try parseEnumAlias(ty)) orelse continue;
7878
}
7979

8080
continue;
@@ -297,7 +297,7 @@ fn parsePointerMeta(fields: Fields, type_info: *registry.TypeInfo, elem: *xml.El
297297
}
298298
}
299299

300-
fn parseEnumAlias(allocator: *Allocator, elem: *xml.Element) !?registry.Declaration {
300+
fn parseEnumAlias(elem: *xml.Element) !?registry.Declaration {
301301
if (elem.getAttribute("alias")) |alias| {
302302
const name = elem.getAttribute("name") orelse return error.InvalidRegistry;
303303
return registry.Declaration{

generator/vulkan/render.zig

Lines changed: 34 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const preamble =
4040
\\ return fromInt(toInt(lhs) & toInt(rhs));
4141
\\ }
4242
\\ pub fn complement(self: FlagsType) FlagsType {
43-
\\ return fromInt(~toInt(lhs));
43+
\\ return fromInt(~toInt(self));
4444
\\ }
4545
\\ pub fn subtract(lhs: FlagsType, rhs: FlagsType) FlagsType {
4646
\\ return fromInt(toInt(lhs) & toInt(rhs.complement()));
@@ -214,7 +214,7 @@ fn Renderer(comptime WriterType: type) type {
214214
}
215215

216216
fn writeIdentifier(self: Self, id: []const u8) !void {
217-
try self.id_renderer.render(self.writer, id);
217+
try id_render.writeIdentifier(self.writer, id);
218218
}
219219

220220
fn writeIdentifierWithCase(self: *Self, case: CaseStyle, id: []const u8) !void {
@@ -242,7 +242,7 @@ fn Renderer(comptime WriterType: type) type {
242242
}
243243
}
244244

245-
fn extractBitflagFieldName(self: Self, bitflag_name: BitflagName, field_name: []const u8) ![]const u8 {
245+
fn extractBitflagFieldName(bitflag_name: BitflagName, field_name: []const u8) ![]const u8 {
246246
var flag_it = id_render.SegmentIterator.init(bitflag_name.base_name);
247247
var field_it = id_render.SegmentIterator.init(field_name);
248248

@@ -295,16 +295,6 @@ fn Renderer(comptime WriterType: type) type {
295295
return mem.endsWith(u8, base_name, "Flags");
296296
}
297297

298-
fn containerHasField(self: Self, container: *const reg.Container, field_name: []const u8) bool {
299-
for (container.fields) |field| {
300-
if (mem.eql(u8, field, field_name)) {
301-
return true;
302-
}
303-
}
304-
305-
return false;
306-
}
307-
308298
fn isInOutPointer(self: Self, ptr: reg.Pointer) !bool {
309299
if (ptr.child.* != .name) {
310300
return false;
@@ -373,7 +363,7 @@ fn Renderer(comptime WriterType: type) type {
373363
}
374364
},
375365
.name => |name| {
376-
if ((try self.extractBitflagName(param.param_type.name)) != null or self.isFlags(param.param_type.name)) {
366+
if ((try self.extractBitflagName(name)) != null or self.isFlags(name)) {
377367
return .bitflags;
378368
}
379369
},
@@ -387,7 +377,7 @@ fn Renderer(comptime WriterType: type) type {
387377
return .other;
388378
}
389379

390-
fn classifyCommandDispatch(self: Self, name: []const u8, command: reg.Command) CommandDispatchType {
380+
fn classifyCommandDispatch(name: []const u8, command: reg.Command) CommandDispatchType {
391381
const device_handles = std.ComptimeStringMap(void, .{
392382
.{ "VkDevice", {} },
393383
.{ "VkCommandBuffer", {} },
@@ -710,37 +700,6 @@ fn Renderer(comptime WriterType: type) type {
710700
try self.writeIdentifierWithCase(.snake, try self.extractEnumFieldName(name, field_name));
711701
}
712702

713-
fn renderEnumerationValue(self: *Self, enum_name: []const u8, enumeration: reg.Enum, value: reg.Enum.Value) !void {
714-
var current_value = value;
715-
var maybe_alias_of: ?[]const u8 = null;
716-
717-
while (true) {
718-
switch (current_value) {
719-
.int => |int| try self.writer.print(" = {}, ", .{int}),
720-
.bitpos => |pos| try self.writer.print(" = 1 << {}, ", .{pos}),
721-
.bit_vector => |bv| try self.writer.print("= 0x{X}, ", .{bv}),
722-
.alias => |alias| {
723-
// Find the alias
724-
current_value = for (enumeration.fields) |field| {
725-
if (mem.eql(u8, field.name, alias.name)) {
726-
maybe_alias_of = field.name;
727-
break field.value;
728-
}
729-
} else return error.InvalidRegistry; // There is no alias
730-
continue;
731-
},
732-
}
733-
734-
break;
735-
}
736-
737-
if (maybe_alias_of) |alias_of| {
738-
try self.writer.writeAll("// alias of ");
739-
try self.renderEnumFieldName(enum_name, alias_of);
740-
try self.writer.writeByte('\n');
741-
}
742-
}
743-
744703
fn renderEnumeration(self: *Self, name: []const u8, enumeration: reg.Enum) !void {
745704
if (enumeration.is_bitmask) {
746705
try self.renderBitmaskBits(name, enumeration);
@@ -749,17 +708,37 @@ fn Renderer(comptime WriterType: type) type {
749708

750709
try self.writer.writeAll("pub const ");
751710
try self.renderName(name);
752-
try self.writer.writeAll(" = extern enum(i32) {");
711+
try self.writer.writeAll(" = enum(c_int) {");
712+
713+
for (enumeration.fields) |field| {
714+
if (field.value == .alias)
715+
continue;
716+
717+
try self.renderEnumFieldName(name, field.name);
718+
switch (field.value) {
719+
.int => |int| try self.writer.print(" = {}, ", .{int}),
720+
.bitpos => |pos| try self.writer.print(" = 1 << {}, ", .{pos}),
721+
.bit_vector => |bv| try self.writer.print("= 0x{X}, ", .{bv}),
722+
.alias => unreachable,
723+
}
724+
}
725+
726+
try self.writer.writeAll("_,");
753727

754728
for (enumeration.fields) |field| {
755-
if (field.value == .alias and field.value.alias.is_compat_alias)
729+
if (field.value != .alias or field.value.alias.is_compat_alias)
756730
continue;
757731

732+
try self.writer.writeAll("pub const ");
758733
try self.renderEnumFieldName(name, field.name);
759-
try self.renderEnumerationValue(name, enumeration, field.value);
734+
try self.writer.writeAll(" = ");
735+
try self.renderName(name);
736+
try self.writer.writeByte('.');
737+
try self.renderEnumFieldName(name, field.value.alias.name);
738+
try self.writer.writeAll(";\n");
760739
}
761740

762-
try self.writer.writeAll("_,};\n");
741+
try self.writer.writeAll("};\n");
763742
}
764743

765744
fn bitmaskFlagsType(bitwidth: u8) ![]const u8 {
@@ -797,7 +776,7 @@ fn Renderer(comptime WriterType: type) type {
797776

798777
for (flags_by_bitpos[0..bits.bitwidth]) |maybe_flag_name, bitpos| {
799778
if (maybe_flag_name) |flag_name| {
800-
const field_name = try self.extractBitflagFieldName(bitflag_name, flag_name);
779+
const field_name = try extractBitflagFieldName(bitflag_name, flag_name);
801780
try self.writeIdentifierWithCase(.snake, field_name);
802781
} else {
803782
try self.writer.print("_reserved_bit_{}", .{bitpos});
@@ -843,7 +822,7 @@ fn Renderer(comptime WriterType: type) type {
843822

844823
try self.writer.writeAll("pub const ");
845824
try self.renderName(name);
846-
try self.writer.print(" = extern enum({s}) {{null_handle = 0, _}};\n", .{backing_type});
825+
try self.writer.print(" = enum({s}) {{null_handle = 0, _}};\n", .{backing_type});
847826
}
848827

849828
fn renderAlias(self: *Self, name: []const u8, alias: reg.Alias) !void {
@@ -948,7 +927,7 @@ fn Renderer(comptime WriterType: type) type {
948927
for (self.registry.decls) |decl| {
949928
if (decl.decl_type == .command) {
950929
const command = decl.decl_type.command;
951-
if (self.classifyCommandDispatch(decl.name, command) == dispatch_type) {
930+
if (classifyCommandDispatch(decl.name, command) == dispatch_type) {
952931
try self.renderWrapper(decl.name, decl.decl_type.command);
953932
}
954933
}
@@ -1208,13 +1187,13 @@ fn Renderer(comptime WriterType: type) type {
12081187
try self.writer.writeAll(") {\n");
12091188

12101189
for (command.success_codes) |success| {
1211-
try self.writer.writeByte('.');
1190+
try self.writer.writeAll("Result.");
12121191
try self.renderEnumFieldName("VkResult", success);
12131192
try self.writer.writeAll(" => {},");
12141193
}
12151194

12161195
for (command.error_codes) |err| {
1217-
try self.writer.writeByte('.');
1196+
try self.writer.writeAll("Result.");
12181197
try self.renderEnumFieldName("VkResult", err);
12191198
try self.writer.writeAll(" => return error.");
12201199
try self.renderResultAsErrorName(err);

0 commit comments

Comments
 (0)