8 Commits

Author SHA1 Message Date
Robin Voetter
571c59180d replace vk.Bool32 with enum 2025-08-26 23:06:23 +02:00
Robin Voetter
8322c9593f Merge pull request #201 from i-pj/fix-issue-200
Format function signature
2025-08-24 21:05:12 +02:00
Parth Jain
33407b8e4e update format function 2025-08-24 14:04:13 +05:30
Robin Voetter
93bc6f1ac3 Merge pull request #198 from flut2/update-zig-1
update to 0.15.0-dev.1518+749f10af4
2025-08-15 10:37:02 +02:00
flut2
bed9e2d224 update to 0.15.0-dev.1518+749f10af4 2025-08-15 06:48:14 +01:00
Robin Voetter
ed429842b8 Merge pull request #196 from mozbeel/android-fix
isARM -> isArm (Android)
2025-08-01 00:12:29 +02:00
mozbeel
cb618dea81 Fixed isARM -> isArm 2025-08-01 00:03:25 +02:00
Robin Voetter
e492b17810 Merge pull request #195 from Snektron/fix-windowresize
fix window extent after creating
2025-07-20 11:47:10 +02:00
11 changed files with 120 additions and 95 deletions

View File

@@ -2,7 +2,7 @@
.name = .vulkan, .name = .vulkan,
.fingerprint = 0xbe155a03c72db6af, .fingerprint = 0xbe155a03c72db6af,
.version = "0.0.0", .version = "0.0.0",
.minimum_zig_version = "0.14.0-dev.1359+e9a00ba7f", .minimum_zig_version = "0.15.0-dev.1518+749f10af4",
.paths = .{ .paths = .{
"build.zig", "build.zig",
"LICENSE", "LICENSE",

View File

@@ -49,16 +49,16 @@ pub const GraphicsContext = struct {
self.allocator = allocator; self.allocator = allocator;
self.vkb = BaseWrapper.load(c.glfwGetInstanceProcAddress); self.vkb = BaseWrapper.load(c.glfwGetInstanceProcAddress);
var extension_names = std.ArrayList([*:0]const u8).init(allocator); var extension_names: std.ArrayList([*:0]const u8) = .empty;
defer extension_names.deinit(); defer extension_names.deinit(allocator);
// these extensions are to support vulkan in mac os // these extensions are to support vulkan in mac os
// see https://github.com/glfw/glfw/issues/2335 // see https://github.com/glfw/glfw/issues/2335
try extension_names.append("VK_KHR_portability_enumeration"); try extension_names.append(allocator, "VK_KHR_portability_enumeration");
try extension_names.append("VK_KHR_get_physical_device_properties2"); try extension_names.append(allocator, "VK_KHR_get_physical_device_properties2");
var glfw_exts_count: u32 = 0; var glfw_exts_count: u32 = 0;
const glfw_exts = c.glfwGetRequiredInstanceExtensions(&glfw_exts_count); const glfw_exts = c.glfwGetRequiredInstanceExtensions(&glfw_exts_count);
try extension_names.appendSlice(@ptrCast(glfw_exts[0..glfw_exts_count])); try extension_names.appendSlice(allocator, @ptrCast(glfw_exts[0..glfw_exts_count]));
const instance = try self.vkb.createInstance(&.{ const instance = try self.vkb.createInstance(&.{
.p_application_info = &.{ .p_application_info = &.{
@@ -253,7 +253,7 @@ fn allocateQueues(instance: Instance, pdev: vk.PhysicalDevice, allocator: Alloca
graphics_family = family; graphics_family = family;
} }
if (present_family == null and (try instance.getPhysicalDeviceSurfaceSupportKHR(pdev, family, surface)) == vk.TRUE) { if (present_family == null and (try instance.getPhysicalDeviceSurfaceSupportKHR(pdev, family, surface)) == .true) {
present_family = family; present_family = family;
} }
} }

View File

@@ -60,7 +60,7 @@ pub const Swapchain = struct {
.pre_transform = caps.current_transform, .pre_transform = caps.current_transform,
.composite_alpha = .{ .opaque_bit_khr = true }, .composite_alpha = .{ .opaque_bit_khr = true },
.present_mode = present_mode, .present_mode = present_mode,
.clipped = vk.TRUE, .clipped = .true,
.old_swapchain = old_handle, .old_swapchain = old_handle,
}, null) catch { }, null) catch {
return error.SwapchainCreationFailed; return error.SwapchainCreationFailed;
@@ -261,7 +261,7 @@ const SwapImage = struct {
} }
fn waitForFence(self: SwapImage, gc: *const GraphicsContext) !void { fn waitForFence(self: SwapImage, gc: *const GraphicsContext) !void {
_ = try gc.dev.waitForFences(1, @ptrCast(&self.frame_fence), vk.TRUE, std.math.maxInt(u64)); _ = try gc.dev.waitForFences(1, @ptrCast(&self.frame_fence), .true, std.math.maxInt(u64));
} }
}; };

View File

@@ -414,7 +414,7 @@ fn createPipeline(
const piasci = vk.PipelineInputAssemblyStateCreateInfo{ const piasci = vk.PipelineInputAssemblyStateCreateInfo{
.topology = .triangle_list, .topology = .triangle_list,
.primitive_restart_enable = vk.FALSE, .primitive_restart_enable = .false,
}; };
const pvsci = vk.PipelineViewportStateCreateInfo{ const pvsci = vk.PipelineViewportStateCreateInfo{
@@ -425,12 +425,12 @@ fn createPipeline(
}; };
const prsci = vk.PipelineRasterizationStateCreateInfo{ const prsci = vk.PipelineRasterizationStateCreateInfo{
.depth_clamp_enable = vk.FALSE, .depth_clamp_enable = .false,
.rasterizer_discard_enable = vk.FALSE, .rasterizer_discard_enable = .false,
.polygon_mode = .fill, .polygon_mode = .fill,
.cull_mode = .{ .back_bit = true }, .cull_mode = .{ .back_bit = true },
.front_face = .clockwise, .front_face = .clockwise,
.depth_bias_enable = vk.FALSE, .depth_bias_enable = .false,
.depth_bias_constant_factor = 0, .depth_bias_constant_factor = 0,
.depth_bias_clamp = 0, .depth_bias_clamp = 0,
.depth_bias_slope_factor = 0, .depth_bias_slope_factor = 0,
@@ -439,14 +439,14 @@ fn createPipeline(
const pmsci = vk.PipelineMultisampleStateCreateInfo{ const pmsci = vk.PipelineMultisampleStateCreateInfo{
.rasterization_samples = .{ .@"1_bit" = true }, .rasterization_samples = .{ .@"1_bit" = true },
.sample_shading_enable = vk.FALSE, .sample_shading_enable = .false,
.min_sample_shading = 1, .min_sample_shading = 1,
.alpha_to_coverage_enable = vk.FALSE, .alpha_to_coverage_enable = .false,
.alpha_to_one_enable = vk.FALSE, .alpha_to_one_enable = .false,
}; };
const pcbas = vk.PipelineColorBlendAttachmentState{ const pcbas = vk.PipelineColorBlendAttachmentState{
.blend_enable = vk.FALSE, .blend_enable = .false,
.src_color_blend_factor = .one, .src_color_blend_factor = .one,
.dst_color_blend_factor = .zero, .dst_color_blend_factor = .zero,
.color_blend_op = .add, .color_blend_op = .add,
@@ -457,7 +457,7 @@ fn createPipeline(
}; };
const pcbsci = vk.PipelineColorBlendStateCreateInfo{ const pcbsci = vk.PipelineColorBlendStateCreateInfo{
.logic_op_enable = vk.FALSE, .logic_op_enable = .false,
.logic_op = .copy, .logic_op = .copy,
.attachment_count = 1, .attachment_count = 1,
.p_attachments = @ptrCast(&pcbas), .p_attachments = @ptrCast(&pcbas),

View File

@@ -121,12 +121,12 @@ pub const SegmentIterator = struct {
pub const IdRenderer = struct { pub const IdRenderer = struct {
tags: []const []const u8, tags: []const []const u8,
text_cache: std.ArrayList(u8), text_cache: std.io.Writer.Allocating,
pub fn init(allocator: Allocator, tags: []const []const u8) IdRenderer { pub fn init(allocator: Allocator, tags: []const []const u8) IdRenderer {
return .{ return .{
.tags = tags, .tags = tags,
.text_cache = std.ArrayList(u8).init(allocator), .text_cache = .init(allocator),
}; };
} }
@@ -142,19 +142,19 @@ pub const IdRenderer = struct {
if (first) { if (first) {
first = false; first = false;
} else { } else {
try self.text_cache.append('_'); try self.text_cache.writer.writeByte('_');
} }
for (segment) |c| { for (segment) |c| {
try self.text_cache.append(if (screaming) std.ascii.toUpper(c) else std.ascii.toLower(c)); try self.text_cache.writer.writeByte(if (screaming) std.ascii.toUpper(c) else std.ascii.toLower(c));
} }
} }
if (tag) |name| { if (tag) |name| {
try self.text_cache.append('_'); try self.text_cache.writer.writeByte('_');
for (name) |c| { for (name) |c| {
try self.text_cache.append(if (screaming) std.ascii.toUpper(c) else std.ascii.toLower(c)); try self.text_cache.writer.writeByte(if (screaming) std.ascii.toUpper(c) else std.ascii.toLower(c));
} }
} }
} }
@@ -166,7 +166,7 @@ pub const IdRenderer = struct {
while (it.next()) |segment| { while (it.next()) |segment| {
var i: usize = 0; var i: usize = 0;
while (i < segment.len and std.ascii.isDigit(segment[i])) { while (i < segment.len and std.ascii.isDigit(segment[i])) {
try self.text_cache.append(segment[i]); try self.text_cache.writer.writeByte(segment[i]);
i += 1; i += 1;
} }
@@ -175,26 +175,26 @@ pub const IdRenderer = struct {
} }
if (i == 0 and lower_first) { if (i == 0 and lower_first) {
try self.text_cache.append(std.ascii.toLower(segment[i])); try self.text_cache.writer.writeByte(std.ascii.toLower(segment[i]));
} else { } else {
try self.text_cache.append(std.ascii.toUpper(segment[i])); try self.text_cache.writer.writeByte(std.ascii.toUpper(segment[i]));
} }
lower_first = false; lower_first = false;
for (segment[i + 1 ..]) |c| { for (segment[i + 1 ..]) |c| {
try self.text_cache.append(std.ascii.toLower(c)); try self.text_cache.writer.writeByte(std.ascii.toLower(c));
} }
} }
if (tag) |name| { if (tag) |name| {
try self.text_cache.appendSlice(name); try self.text_cache.writer.writeAll(name);
} }
} }
pub fn renderFmt(self: *IdRenderer, out: *std.Io.Writer, comptime fmt: []const u8, args: anytype) !void { pub fn renderFmt(self: *IdRenderer, out: *std.Io.Writer, comptime fmt: []const u8, args: anytype) !void {
self.text_cache.items.len = 0; _ = self.text_cache.writer.consumeAll();
try std.fmt.format(self.text_cache.writer(), fmt, args); try self.text_cache.writer.print(fmt, args);
try writeIdentifier(out, self.text_cache.items); try writeIdentifier(out, self.text_cache.writer.buffered());
} }
pub fn renderWithCase(self: *IdRenderer, out: *std.Io.Writer, case_style: CaseStyle, id: []const u8) !void { pub fn renderWithCase(self: *IdRenderer, out: *std.Io.Writer, case_style: CaseStyle, id: []const u8) !void {
@@ -202,7 +202,7 @@ pub const IdRenderer = struct {
// The trailing underscore doesn't need to be removed here as its removed by the SegmentIterator. // The trailing underscore doesn't need to be removed here as its removed by the SegmentIterator.
const adjusted_id = if (tag) |name| id[0 .. id.len - name.len] else id; const adjusted_id = if (tag) |name| id[0 .. id.len - name.len] else id;
self.text_cache.items.len = 0; _ = self.text_cache.writer.consumeAll();
switch (case_style) { switch (case_style) {
.snake => try self.renderSnake(false, adjusted_id, tag), .snake => try self.renderSnake(false, adjusted_id, tag),
@@ -211,7 +211,7 @@ pub const IdRenderer = struct {
.camel => try self.renderCamel(false, adjusted_id, tag), .camel => try self.renderCamel(false, adjusted_id, tag),
} }
try writeIdentifier(out, self.text_cache.items); try writeIdentifier(out, self.text_cache.writer.buffered());
} }
pub fn getAuthorTag(self: IdRenderer, id: []const u8) ?[]const u8 { pub fn getAuthorTag(self: IdRenderer, id: []const u8) ?[]const u8 {

View File

@@ -1,4 +1,5 @@
const std = @import("std"); const std = @import("std");
const generator = @import("vulkan/generator.zig"); const generator = @import("vulkan/generator.zig");
fn invalidUsage(prog_name: []const u8, comptime fmt: []const u8, args: anytype) noreturn { fn invalidUsage(prog_name: []const u8, comptime fmt: []const u8, args: anytype) noreturn {
@@ -23,13 +24,17 @@ fn reportParseErrors(tree: std.zig.Ast) !void {
} }
} }
fn oomPanic() noreturn {
@panic("Out of memory");
}
pub fn main() !void { pub fn main() !void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit(); defer arena.deinit();
const allocator = arena.allocator(); const allocator = arena.allocator();
var args = std.process.argsWithAllocator(allocator) catch |err| switch (err) { var args = std.process.argsWithAllocator(allocator) catch |err| switch (err) {
error.OutOfMemory => @panic("OOM"), error.OutOfMemory => oomPanic(),
}; };
const prog_name = args.next() orelse "vulkan-zig-generator"; const prog_name = args.next() orelse "vulkan-zig-generator";
@@ -108,9 +113,8 @@ pub fn main() !void {
else else
null; null;
var out_buffer = std.ArrayList(u8).init(allocator); var aw: std.io.Writer.Allocating = .init(allocator);
var w = out_buffer.writer().adaptToNewApi(); generator.generate(allocator, api, xml_src, maybe_video_xml_src, &aw.writer) catch |err| {
generator.generate(allocator, api, xml_src, maybe_video_xml_src, &w.new_interface) catch |err| {
if (debug) { if (debug) {
return err; return err;
} }
@@ -132,15 +136,16 @@ pub fn main() !void {
std.log.err("please make a bug report at https://github.com/Snektron/vulkan-zig/issues/", .{}); std.log.err("please make a bug report at https://github.com/Snektron/vulkan-zig/issues/", .{});
std.process.exit(1); std.process.exit(1);
}, },
error.OutOfMemory, error.WriteFailed => @panic("oom"), error.OutOfMemory, error.WriteFailed => oomPanic(),
} }
}; };
out_buffer.append(0) catch @panic("oom"); aw.writer.writeByte(0) catch oomPanic();
const src = out_buffer.items[0 .. out_buffer.items.len - 1 :0]; const buffered = aw.writer.buffered();
const src = buffered[0 .. buffered.len - 1 :0];
const tree = std.zig.Ast.parse(allocator, src, .zig) catch |err| switch (err) { const tree = std.zig.Ast.parse(allocator, src, .zig) catch |err| switch (err) {
error.OutOfMemory => @panic("oom"), error.OutOfMemory => oomPanic(),
}; };
const formatted = if (tree.errors.len > 0) blk: { const formatted = if (tree.errors.len > 0) blk: {
@@ -158,7 +163,7 @@ pub fn main() !void {
} }
std.process.exit(1); std.process.exit(1);
} else tree.renderAlloc(allocator) catch |err| switch (err) { } else tree.renderAlloc(allocator) catch |err| switch (err) {
error.OutOfMemory => @panic("oom"), error.OutOfMemory => oomPanic(),
}; };
if (std.fs.path.dirname(out_path)) |dir| { if (std.fs.path.dirname(out_path)) |dir| {

View File

@@ -457,8 +457,8 @@ fn parseFnPtrSuffix(allocator: Allocator, xctok: *XmlCTokenizer, return_type: Ty
// There is no good way to estimate the number of parameters beforehand. // There is no good way to estimate the number of parameters beforehand.
// Fortunately, there are usually a relatively low number of parameters to a function pointer, // Fortunately, there are usually a relatively low number of parameters to a function pointer,
// so an ArrayList backed by an arena allocator is good enough. // so an ArrayList backed by an arena allocator is good enough.
var params = std.ArrayList(registry.Command.Param).init(allocator); var params: std.ArrayList(registry.Command.Param) = .empty;
try params.append(.{ try params.append(allocator, .{
.name = first_param.name.?, .name = first_param.name.?,
.param_type = first_param.decl_type, .param_type = first_param.decl_type,
.is_buffer_len = false, .is_buffer_len = false,
@@ -473,7 +473,7 @@ fn parseFnPtrSuffix(allocator: Allocator, xctok: *XmlCTokenizer, return_type: Ty
} }
const decl = try parseDeclaration(allocator, xctok, ptrs_optional); const decl = try parseDeclaration(allocator, xctok, ptrs_optional);
try params.append(.{ try params.append(allocator, .{
.name = decl.name orelse return error.MissingTypeIdentifier, .name = decl.name orelse return error.MissingTypeIdentifier,
.param_type = decl.decl_type, .param_type = decl.decl_type,
.is_buffer_len = false, .is_buffer_len = false,
@@ -482,7 +482,7 @@ fn parseFnPtrSuffix(allocator: Allocator, xctok: *XmlCTokenizer, return_type: Ty
} }
_ = try xctok.nextNoEof(); _ = try xctok.nextNoEof();
command_ptr.decl_type.command_ptr.params = try params.toOwnedSlice(); command_ptr.decl_type.command_ptr.params = try params.toOwnedSlice(allocator);
return command_ptr; return command_ptr;
} }

View File

@@ -32,7 +32,7 @@ const EnumFieldMerger = struct {
fn putEnumExtension(self: *EnumFieldMerger, enum_name: []const u8, field: reg.Enum.Field) !void { fn putEnumExtension(self: *EnumFieldMerger, enum_name: []const u8, field: reg.Enum.Field) !void {
const res = try self.enum_extensions.getOrPut(self.arena, enum_name); const res = try self.enum_extensions.getOrPut(self.arena, enum_name);
if (!res.found_existing) { if (!res.found_existing) {
res.value_ptr.* = std.ArrayListUnmanaged(reg.Enum.Field){}; res.value_ptr.* = .empty;
} }
try res.value_ptr.append(self.arena, field); try res.value_ptr.append(self.arena, field);

View File

@@ -28,11 +28,11 @@ pub fn parseXml(
const allocator = arena.allocator(); const allocator = arena.allocator();
var decls: std.ArrayListUnmanaged(registry.Declaration) = .{}; var decls: std.ArrayList(registry.Declaration) = .empty;
var api_constants: std.ArrayListUnmanaged(registry.ApiConstant) = .{}; var api_constants: std.ArrayList(registry.ApiConstant) = .empty;
var tags: std.ArrayListUnmanaged(registry.Tag) = .{}; var tags: std.ArrayList(registry.Tag) = .empty;
var features: std.ArrayListUnmanaged(registry.Feature) = .{}; var features: std.ArrayList(registry.Feature) = .empty;
var extensions: std.ArrayListUnmanaged(registry.Extension) = .{}; var extensions: std.ArrayList(registry.Extension) = .empty;
try parseDeclarations(allocator, root, api, &decls); try parseDeclarations(allocator, root, api, &decls);
try parseApiConstants(allocator, root, api, &api_constants); try parseApiConstants(allocator, root, api, &api_constants);
@@ -66,7 +66,7 @@ fn parseDeclarations(
allocator: Allocator, allocator: Allocator,
root: *xml.Element, root: *xml.Element,
api: registry.Api, api: registry.Api,
decls: *std.ArrayListUnmanaged(registry.Declaration), decls: *std.ArrayList(registry.Declaration),
) !void { ) !void {
const types_elem = root.findChildByTag("types") orelse return error.InvalidRegistry; const types_elem = root.findChildByTag("types") orelse return error.InvalidRegistry;
try decls.ensureUnusedCapacity(allocator, types_elem.children.len); try decls.ensureUnusedCapacity(allocator, types_elem.children.len);
@@ -84,7 +84,7 @@ fn parseTypes(
allocator: Allocator, allocator: Allocator,
types_elem: *xml.Element, types_elem: *xml.Element,
api: registry.Api, api: registry.Api,
decls: *std.ArrayListUnmanaged(registry.Declaration), decls: *std.ArrayList(registry.Declaration),
) !void { ) !void {
var it = types_elem.findChildrenByTag("type"); var it = types_elem.findChildrenByTag("type");
while (it.next()) |ty| { while (it.next()) |ty| {
@@ -429,7 +429,7 @@ fn parseEnums(
allocator: Allocator, allocator: Allocator,
root: *xml.Element, root: *xml.Element,
api: registry.Api, api: registry.Api,
decls: *std.ArrayListUnmanaged(registry.Declaration), decls: *std.ArrayList(registry.Declaration),
) !void { ) !void {
var it = root.findChildrenByTag("enums"); var it = root.findChildrenByTag("enums");
while (it.next()) |enums| { while (it.next()) |enums| {
@@ -519,7 +519,7 @@ fn parseCommands(
allocator: Allocator, allocator: Allocator,
commands_elem: *xml.Element, commands_elem: *xml.Element,
api: registry.Api, api: registry.Api,
decls: *std.ArrayListUnmanaged(registry.Declaration), decls: *std.ArrayList(registry.Declaration),
) !void { ) !void {
var it = commands_elem.findChildrenByTag("command"); var it = commands_elem.findChildrenByTag("command");
while (it.next()) |elem| { while (it.next()) |elem| {
@@ -630,7 +630,7 @@ fn parseApiConstants(
allocator: Allocator, allocator: Allocator,
root: *xml.Element, root: *xml.Element,
api: registry.Api, api: registry.Api,
api_constants: *std.ArrayListUnmanaged(registry.ApiConstant), api_constants: *std.ArrayList(registry.ApiConstant),
) !void { ) !void {
const maybe_enums = blk: { const maybe_enums = blk: {
var it = root.findChildrenByTag("enums"); var it = root.findChildrenByTag("enums");
@@ -672,7 +672,7 @@ fn parseDefines(
allocator: Allocator, allocator: Allocator,
types: *xml.Element, types: *xml.Element,
api: registry.Api, api: registry.Api,
api_constants: *std.ArrayListUnmanaged(registry.ApiConstant), api_constants: *std.ArrayList(registry.ApiConstant),
) !void { ) !void {
var it = types.findChildrenByTag("type"); var it = types.findChildrenByTag("type");
while (it.next()) |ty| { while (it.next()) |ty| {
@@ -703,7 +703,7 @@ fn parseDefines(
fn parseTags( fn parseTags(
allocator: Allocator, allocator: Allocator,
root: *xml.Element, root: *xml.Element,
tags: *std.ArrayListUnmanaged(registry.Tag), tags: *std.ArrayList(registry.Tag),
) !void { ) !void {
var tags_elem = root.findChildByTag("tags") orelse return; var tags_elem = root.findChildByTag("tags") orelse return;
try tags.ensureUnusedCapacity(allocator, tags_elem.children.len); try tags.ensureUnusedCapacity(allocator, tags_elem.children.len);
@@ -717,7 +717,7 @@ fn parseTags(
} }
} }
fn parseFeatures(allocator: Allocator, root: *xml.Element, api: registry.Api, features: *std.ArrayListUnmanaged(registry.Feature)) !void { fn parseFeatures(allocator: Allocator, root: *xml.Element, api: registry.Api, features: *std.ArrayList(registry.Feature)) !void {
var it = root.findChildrenByTag("feature"); var it = root.findChildrenByTag("feature");
while (it.next()) |feature| { while (it.next()) |feature| {
if (!requiredByApi(feature, api)) if (!requiredByApi(feature, api))
@@ -881,7 +881,7 @@ fn parseExtensions(
allocator: Allocator, allocator: Allocator,
root: *xml.Element, root: *xml.Element,
api: registry.Api, api: registry.Api,
extensions: *std.ArrayListUnmanaged(registry.Extension), extensions: *std.ArrayList(registry.Extension),
) !void { ) !void {
const extensions_elem = root.findChildByTag("extensions") orelse return error.InvalidRegistry; const extensions_elem = root.findChildByTag("extensions") orelse return error.InvalidRegistry;
try extensions.ensureUnusedCapacity(allocator, extensions_elem.children.len); try extensions.ensureUnusedCapacity(allocator, extensions_elem.children.len);

View File

@@ -1,11 +1,12 @@
const std = @import("std"); const std = @import("std");
const reg = @import("registry.zig");
const id_render = @import("../id_render.zig");
const cparse = @import("c_parse.zig");
const mem = std.mem; const mem = std.mem;
const Allocator = mem.Allocator; const Allocator = mem.Allocator;
const id_render = @import("../id_render.zig");
const CaseStyle = id_render.CaseStyle; const CaseStyle = id_render.CaseStyle;
const IdRenderer = id_render.IdRenderer; const IdRenderer = id_render.IdRenderer;
const cparse = @import("c_parse.zig");
const reg = @import("registry.zig");
const preamble = const preamble =
\\// This file is generated from the Khronos Vulkan XML API registry by vulkan-zig. \\// This file is generated from the Khronos Vulkan XML API registry by vulkan-zig.
@@ -18,7 +19,7 @@ const preamble =
\\ \\
\\pub const vulkan_call_conv: std.builtin.CallingConvention = if (builtin.os.tag == .windows and builtin.cpu.arch == .x86) \\pub const vulkan_call_conv: std.builtin.CallingConvention = if (builtin.os.tag == .windows and builtin.cpu.arch == .x86)
\\ .winapi \\ .winapi
\\ else if (builtin.abi == .android and (builtin.cpu.arch.isARM() or builtin.cpu.arch.isThumb()) and std.Target.arm.featureSetHas(builtin.cpu.features, .has_v7) and builtin.cpu.arch.ptrBitWidth() == 32) \\ else if (builtin.abi == .android and (builtin.cpu.arch.isArm() or builtin.cpu.arch.isThumb()) and std.Target.arm.featureSetHas(builtin.cpu.features, .has_v7) and builtin.cpu.arch.ptrBitWidth() == 32)
\\ // On Android 32-bit ARM targets, Vulkan functions use the "hardfloat" \\ // On Android 32-bit ARM targets, Vulkan functions use the "hardfloat"
\\ // calling convention, i.e. float parameters are passed in registers. This \\ // calling convention, i.e. float parameters are passed in registers. This
\\ // is true even if the rest of the application passes floats on the stack, \\ // is true even if the rest of the application passes floats on the stack,
@@ -58,8 +59,6 @@ const preamble =
\\ return struct { \\ return struct {
\\ pub fn format( \\ pub fn format(
\\ self: FlagsType, \\ self: FlagsType,
\\ comptime _: []const u8,
\\ _: std.fmt.FormatOptions,
\\ writer: anytype, \\ writer: anytype,
\\ ) !void { \\ ) !void {
\\ try writer.writeAll(@typeName(FlagsType) ++ "{"); \\ try writer.writeAll(@typeName(FlagsType) ++ "{");
@@ -849,6 +848,10 @@ const Renderer = struct {
} }
fn renderDecl(self: *Self, decl: reg.Declaration) !void { fn renderDecl(self: *Self, decl: reg.Declaration) !void {
if (try self.renderSpecial(decl.name)) {
return;
}
switch (decl.decl_type) { switch (decl.decl_type) {
.container => |container| try self.renderContainer(decl.name, container), .container => |container| try self.renderContainer(decl.name, container),
.enumeration => |enumeration| try self.renderEnumeration(decl.name, enumeration), .enumeration => |enumeration| try self.renderEnumeration(decl.name, enumeration),
@@ -862,10 +865,27 @@ const Renderer = struct {
} }
} }
fn renderSpecialContainer(self: *Self, name: []const u8) !bool { fn renderAssign(self: *Self, name: []const u8) !void {
try self.writer.writeAll("pub const ");
try self.renderName(name);
try self.writer.writeAll(" = ");
}
fn renderSpecial(self: *Self, name: []const u8) !bool {
const maybe_author = self.id_renderer.getAuthorTag(name); const maybe_author = self.id_renderer.getAuthorTag(name);
const basename = self.id_renderer.stripAuthorTag(name); const basename = self.id_renderer.stripAuthorTag(name);
if (std.mem.eql(u8, basename, "VkAccelerationStructureInstance")) { if (std.mem.eql(u8, basename, "VkBool32")) {
try self.renderAssign(name);
try self.writer.writeAll(
\\enum(i32) {
\\ false,
\\ true,
\\ _,
\\};
\\
);
} else if (std.mem.eql(u8, basename, "VkAccelerationStructureInstance")) {
try self.renderAssign(name);
try self.writer.print( try self.writer.print(
\\extern struct {{ \\extern struct {{
\\ transform: TransformMatrix{s}, \\ transform: TransformMatrix{s},
@@ -883,8 +903,8 @@ const Renderer = struct {
, ,
.{maybe_author orelse ""}, .{maybe_author orelse ""},
); );
return true;
} else if (std.mem.eql(u8, basename, "VkAccelerationStructureSRTMotionInstance")) { } else if (std.mem.eql(u8, basename, "VkAccelerationStructureSRTMotionInstance")) {
try self.renderAssign(name);
try self.writer.print( try self.writer.print(
\\extern struct {{ \\extern struct {{
\\ transform_t0: SRTData{0s}, \\ transform_t0: SRTData{0s},
@@ -903,8 +923,8 @@ const Renderer = struct {
, ,
.{maybe_author orelse ""}, .{maybe_author orelse ""},
); );
return true;
} else if (std.mem.eql(u8, basename, "VkAccelerationStructureMatrixMotionInstance")) { } else if (std.mem.eql(u8, basename, "VkAccelerationStructureMatrixMotionInstance")) {
try self.renderAssign(name);
try self.writer.print( try self.writer.print(
\\extern struct {{ \\extern struct {{
\\ transform_t0: TransformMatrix{0s}, \\ transform_t0: TransformMatrix{0s},
@@ -923,8 +943,8 @@ const Renderer = struct {
, ,
.{maybe_author orelse ""}, .{maybe_author orelse ""},
); );
return true;
} else if (std.mem.eql(u8, basename, "VkClusterAccelerationStructureBuildTriangleClusterInfo")) { } else if (std.mem.eql(u8, basename, "VkClusterAccelerationStructureBuildTriangleClusterInfo")) {
try self.renderAssign(name);
try self.writer.print( try self.writer.print(
\\extern struct {{ \\extern struct {{
\\ cluster_id: u32, \\ cluster_id: u32,
@@ -950,8 +970,8 @@ const Renderer = struct {
, ,
.{maybe_author orelse ""}, .{maybe_author orelse ""},
); );
return true;
} else if (std.mem.eql(u8, basename, "VkClusterAccelerationStructureBuildTriangleClusterTemplateInfo")) { } else if (std.mem.eql(u8, basename, "VkClusterAccelerationStructureBuildTriangleClusterTemplateInfo")) {
try self.renderAssign(name);
try self.writer.print( try self.writer.print(
\\extern struct {{ \\extern struct {{
\\ cluster_id: u32, \\ cluster_id: u32,
@@ -978,8 +998,8 @@ const Renderer = struct {
, ,
.{maybe_author orelse ""}, .{maybe_author orelse ""},
); );
return true;
} else if (std.mem.eql(u8, basename, "VkClusterAccelerationStructureInstantiateClusterInfo")) { } else if (std.mem.eql(u8, basename, "VkClusterAccelerationStructureInstantiateClusterInfo")) {
try self.renderAssign(name);
try self.writer.print( try self.writer.print(
\\extern struct {{ \\extern struct {{
\\ cluster_id_offset: u32, \\ cluster_id_offset: u32,
@@ -993,10 +1013,11 @@ const Renderer = struct {
, ,
.{maybe_author orelse ""}, .{maybe_author orelse ""},
); );
return true; } else {
return false;
} }
return false; return true;
} }
fn renderSimpleBitContainer(self: *Self, container: reg.Container) !bool { fn renderSimpleBitContainer(self: *Self, container: reg.Container) !bool {
@@ -1052,10 +1073,6 @@ const Renderer = struct {
return; return;
} }
if (try self.renderSpecialContainer(name)) {
return;
}
for (container.fields) |field| { for (container.fields) |field| {
if (field.bits != null) { if (field.bits != null) {
return error.UnhandledBitfieldStruct; return error.UnhandledBitfieldStruct;
@@ -1110,7 +1127,7 @@ const Renderer = struct {
try self.writer.writeAll(" = ."); try self.writer.writeAll(" = .");
try self.writeIdentifierWithCase(.snake, stype["VK_STRUCTURE_TYPE_".len..]); try self.writeIdentifierWithCase(.snake, stype["VK_STRUCTURE_TYPE_".len..]);
} else if (field.field_type == .name and mem.eql(u8, "VkBool32", field.field_type.name) and isFeatureStruct(name, container.extends)) { } else if (field.field_type == .name and mem.eql(u8, "VkBool32", field.field_type.name) and isFeatureStruct(name, container.extends)) {
try self.writer.writeAll(" = FALSE"); try self.writer.writeAll(" = .false");
} else if (field.is_optional) { } else if (field.is_optional) {
if (field.field_type == .name) { if (field.field_type == .name) {
const field_type_name = field.field_type.name; const field_type_name = field.field_type.name;
@@ -1121,6 +1138,8 @@ const Renderer = struct {
try self.writer.writeAll(" = .{}"); try self.writer.writeAll(" = .{}");
} else if (decl_type == .typedef and decl_type.typedef == .command_ptr) { } else if (decl_type == .typedef and decl_type.typedef == .command_ptr) {
try self.writer.writeAll(" = null"); try self.writer.writeAll(" = null");
} else if (mem.eql(u8, "VkBool32", field.field_type.name)) {
try self.writer.writeAll(" = .false");
} else if ((decl_type == .typedef and builtin_types.has(decl_type.typedef.name)) or } else if ((decl_type == .typedef and builtin_types.has(decl_type.typedef.name)) or
(decl_type == .foreign and builtin_types.has(field_type_name))) (decl_type == .foreign and builtin_types.has(field_type_name)))
{ {
@@ -1810,12 +1829,13 @@ const Renderer = struct {
} }
fn extractReturns(self: *Self, command: reg.Command) ![]const ReturnValue { fn extractReturns(self: *Self, command: reg.Command) ![]const ReturnValue {
var returns = std.ArrayList(ReturnValue).init(self.allocator); const allocator = self.allocator;
var returns: std.ArrayList(ReturnValue) = .empty;
if (command.return_type.* == .name) { if (command.return_type.* == .name) {
const return_name = command.return_type.name; const return_name = command.return_type.name;
if (!mem.eql(u8, return_name, "void") and !mem.eql(u8, return_name, "VkResult")) { if (!mem.eql(u8, return_name, "void") and !mem.eql(u8, return_name, "VkResult")) {
try returns.append(.{ try returns.append(allocator, .{
.name = "return_value", .name = "return_value",
.return_value_type = command.return_type.*, .return_value_type = command.return_type.*,
.origin = .inner_return_value, .origin = .inner_return_value,
@@ -1828,7 +1848,7 @@ const Renderer = struct {
return error.InvalidRegistry; return error.InvalidRegistry;
} }
try returns.append(.{ try returns.append(allocator, .{
.name = "result", .name = "result",
.return_value_type = command.return_type.*, .return_value_type = command.return_type.*,
.origin = .inner_return_value, .origin = .inner_return_value,
@@ -1839,7 +1859,7 @@ const Renderer = struct {
for (command.params) |param| { for (command.params) |param| {
if ((try self.classifyParam(param)) == .out_pointer) { if ((try self.classifyParam(param)) == .out_pointer) {
try returns.append(.{ try returns.append(allocator, .{
.name = derefName(param.name), .name = derefName(param.name),
.return_value_type = param.param_type.pointer.child.*, .return_value_type = param.param_type.pointer.child.*,
.origin = .parameter, .origin = .parameter,
@@ -1847,7 +1867,7 @@ const Renderer = struct {
} }
} }
return try returns.toOwnedSlice(); return try returns.toOwnedSlice(allocator);
} }
fn renderReturnStructName(self: *Self, command_name: []const u8) !void { fn renderReturnStructName(self: *Self, command_name: []const u8) !void {

View File

@@ -439,15 +439,15 @@ fn parseElement(parser: *Parser, alloc: Allocator, comptime kind: ElementKind) !
}, },
}; };
var attributes = std.ArrayList(Attribute).init(alloc); var attributes: std.ArrayList(Attribute) = .empty;
defer attributes.deinit(); defer attributes.deinit(alloc);
var children = std.ArrayList(Content).init(alloc); var children: std.ArrayList(Content) = .empty;
defer children.deinit(); defer children.deinit(alloc);
while (parser.eatWs()) { while (parser.eatWs()) {
const attr = (try parseAttr(parser, alloc)) orelse break; const attr = (try parseAttr(parser, alloc)) orelse break;
try attributes.append(attr); try attributes.append(alloc, attr);
} }
switch (kind) { switch (kind) {
@@ -464,7 +464,7 @@ fn parseElement(parser: *Parser, alloc: Allocator, comptime kind: ElementKind) !
} }
const content = try parseContent(parser, alloc); const content = try parseContent(parser, alloc);
try children.append(content); try children.append(alloc, content);
} }
const closing_tag = try parseNameNoDupe(parser); const closing_tag = try parseNameNoDupe(parser);
@@ -481,8 +481,8 @@ fn parseElement(parser: *Parser, alloc: Allocator, comptime kind: ElementKind) !
const element = try alloc.create(Element); const element = try alloc.create(Element);
element.* = .{ element.* = .{
.tag = try alloc.dupe(u8, tag), .tag = try alloc.dupe(u8, tag),
.attributes = try attributes.toOwnedSlice(), .attributes = try attributes.toOwnedSlice(alloc),
.children = try children.toOwnedSlice(), .children = try children.toOwnedSlice(alloc),
}; };
return element; return element;
} }