From 59e39970565375678da093b458efdfa00efbfa92 Mon Sep 17 00:00:00 2001 From: Lorenzo Torres Date: Mon, 4 Aug 2025 14:19:29 +0200 Subject: [PATCH] Fixed gltf parser memory leak --- src/renderer/Mesh.zig | 4 ++++ src/renderer/gltf.zig | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/renderer/Mesh.zig b/src/renderer/Mesh.zig index 6b2d98f..6684efc 100644 --- a/src/renderer/Mesh.zig +++ b/src/renderer/Mesh.zig @@ -44,6 +44,8 @@ pub fn createVertexBuffer(allocator: Allocator, device: anytype) !vk.Buffer { const gltf_data = try gltf.parseFile(allocator, "assets/models/block.glb"); const vertices = gltf_data.vertices; + defer allocator.free(vertices); + defer allocator.free(gltf_data.indices); var data: [*c]?*anyopaque = null; @@ -77,6 +79,8 @@ pub fn createVertexBuffer(allocator: Allocator, device: anytype) !vk.Buffer { pub fn createIndexBuffer(allocator: Allocator, device: anytype) !vk.Buffer { const gltf_data = try gltf.parseFile(allocator, "assets/models/block.glb"); const indices = gltf_data.indices; + defer allocator.free(indices); + defer allocator.free(gltf_data.vertices); //const indices = [_]u16{ 0, 1, 2, 3, 0, 2 }; var data: [*c]?*anyopaque = null; diff --git a/src/renderer/gltf.zig b/src/renderer/gltf.zig index e65ec85..7afeb72 100644 --- a/src/renderer/gltf.zig +++ b/src/renderer/gltf.zig @@ -152,9 +152,13 @@ pub const Model = struct { pub fn parseFile(allocator: Allocator, name: []const u8) !struct { vertices: [][3]f32, indices: []u16 } { const file = try std.fs.cwd().openFile(name, .{}); const all = try file.readToEndAlloc(allocator, 1_000_000); + defer allocator.free(all); const json_chunk = std.mem.bytesAsValue(Model.Chunk, all[Model.Header.offset..]); - const data = (try std.json.parseFromSlice(Model.JsonChunk, allocator, @constCast(all[Model.Chunk.offset .. Model.Chunk.offset + json_chunk.length]), .{ .ignore_unknown_fields = true })).value; + const parsed = try std.json.parseFromSlice(Model.JsonChunk, allocator, @constCast(all[Model.Chunk.offset .. Model.Chunk.offset + json_chunk.length]), .{ .ignore_unknown_fields = true }); + defer parsed.deinit(); + + const data = parsed.value; const binary = Model.Binary{ .data = all[Model.Chunk.offset + json_chunk.length + 8 ..] }; const vertices = try binary.readVec3(allocator, data.bufferViews.?[data.meshes.?[0].primitives.?[0].attributes.?.POSITION.?], data.accessors.?[data.meshes.?[0].primitives.?[0].attributes.?.POSITION.?].count);