From 5be2422c848e9147ba28bba6dc3f1c3e3ddd4b0c Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Mon, 28 Sep 2026 19:22:01 +0300 Subject: [PATCH] render3d: a screenshot frees its read-back, header and row gvk_screenshot kept a buffer the size of the screen per shot (the valley scan's largest unreachable site), and its PPM header and row buffer; each goes on every way out now. Compiled (steady). Co-Authored-By: Claude Opus 5.5 --- packages/ludic.render3d/gpu_vk_draw.ludic | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/ludic.render3d/gpu_vk_draw.ludic b/packages/ludic.render3d/gpu_vk_draw.ludic index d5c37ff2..99410eea 100644 --- a/packages/ludic.render3d/gpu_vk_draw.ludic +++ b/packages/ludic.render3d/gpu_vk_draw.ludic @@ -1427,12 +1427,21 @@ function gvk_screenshot(render3d_st: mut Render3dState, path: string) -> bool { gvk_present(render3d_st) let w = render3d_st.gvk_screen_w let h = render3d_st.gvk_screen_h + # the read-back, the header and the row are this shot's own and go on every way out: a buffer the + # size of the screen was once kept per shot let px = bytes(w * h * 4) - if not gvk_tex_read(render3d_st, render3d_st.gvk_screen_color, GL_RGBA8, w, h, GL_RGBA, GL_UNSIGNED_BYTE, px) { return false } + if not gvk_tex_read(render3d_st, render3d_st.gvk_screen_color, GL_RGBA8, w, h, GL_RGBA, GL_UNSIGNED_BYTE, px) { + free(px) + return false + } let f = file_open(path, "wb") - if f == null { return false } + if f == null { + free(px) + return false + } let hdr = `P6\n{w} {h}\n255\n` file_write(f, hdr, len(hdr)) + free(hdr) let row = bytes(w * 3) var y = h - 1 while y >= 0 { @@ -1444,6 +1453,8 @@ function gvk_screenshot(render3d_st: mut Render3dState, path: string) -> bool { y -= 1 } file_close(f) + free(row) + free(px) return true }