Add workaround for incorrect StdVideoH265HrdParameters encoding

See https://github.com/KhronosGroup/Vulkan-Docs/issues/2557
This commit is contained in:
Robin Voetter
2025-07-19 13:26:20 +02:00
parent 9e6c4640bf
commit 2a1dba26ff
2 changed files with 34 additions and 20 deletions

View File

@@ -110,24 +110,30 @@ pub fn main() !void {
var out_buffer = std.ArrayList(u8).init(allocator); var out_buffer = std.ArrayList(u8).init(allocator);
var w = out_buffer.writer().adaptToNewApi(); var w = out_buffer.writer().adaptToNewApi();
generator.generate(allocator, api, xml_src, maybe_video_xml_src, &w.new_interface) catch |err| switch (err) { generator.generate(allocator, api, xml_src, maybe_video_xml_src, &w.new_interface) catch |err| {
error.InvalidXml => { if (debug) {
std.log.err("invalid vulkan registry - invalid xml", .{}); return err;
std.log.err("please check that the correct vk.xml file is passed", .{}); }
std.process.exit(1);
}, switch (err) {
error.InvalidRegistry => { error.InvalidXml => {
std.log.err("invalid vulkan registry - registry is valid xml but contents are invalid", .{}); std.log.err("invalid vulkan registry - invalid xml", .{});
std.log.err("please check that the correct vk.xml file is passed", .{}); std.log.err("please check that the correct vk.xml file is passed", .{});
std.process.exit(1); std.process.exit(1);
}, },
error.UnhandledBitfieldStruct => { error.InvalidRegistry => {
std.log.err("unhandled struct with bit fields detected in vk.xml", .{}); std.log.err("invalid vulkan registry - registry is valid xml but contents are invalid", .{});
std.log.err("this is a bug in vulkan-zig", .{}); std.log.err("please check that the correct vk.xml file is passed", .{});
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.UnhandledBitfieldStruct => {
error.OutOfMemory, error.WriteFailed => @panic("oom"), std.log.err("unhandled struct with bit fields detected in vk.xml", .{});
std.log.err("this is a bug in vulkan-zig", .{});
std.log.err("please make a bug report at https://github.com/Snektron/vulkan-zig/issues/", .{});
std.process.exit(1);
},
error.OutOfMemory, error.WriteFailed => @panic("oom"),
}
}; };
out_buffer.append(0) catch @panic("oom"); out_buffer.append(0) catch @panic("oom");

View File

@@ -365,10 +365,18 @@ fn parsePointerMeta(fields: Fields, type_info: *registry.TypeInfo, elem: *xml.El
else => break, else => break,
}; };
if (it.next()) |_| { if (it.next()) |_| ignore: {
// There are more elements in the `len` attribute than there are pointers // There are more elements in the `len` attribute than there are pointers
// Something probably went wrong // Something probably went wrong
std.log.err("len: {s}", .{lens}); switch (current_type_info.*) {
.name => |name| if (std.mem.eql(u8, name, "StdVideoH265SubLayerHrdParameters")) {
// Known issue: https://github.com/KhronosGroup/Vulkan-Docs/issues/2557
break :ignore;
},
else => {},
}
std.log.err("excessive pointer lengths: {s}", .{lens});
return error.InvalidRegistry; return error.InvalidRegistry;
} }
} }