fix(render3d): the Vulkan renderer stops leaking as it loads and draws
- every texture upload malloc'd a CPU copy of its pixels and never freed it (236 MB over the valley's boot, and again for every model loaded later): the pixels are converted straight into the mapped staging buffer - the per-level and per-layer views gvk_view_of made outlived their texture, and on MoltenVK a view keeps its Metal texture alive: a released texture takes its views with it, and the cache is keyed by numbers instead of a string built on every call - the Vulkan structs filled for a draw, pass, barrier, descriptor set, buffer, allocation or upload (about sixty call sites) come from a reused 1 MB scratch ring (gvk_tmp) - the descriptor-set cache and the retired buffers are emptied in place, not replaced; the grass cull's dispatch arguments are made once - macOS drains an autorelease pool each frame (Vk.frame_pool, lvk_frame_pool in vk_mac.ll) - R3D_VK_PROF reports Vulkan objects made and destroyed by kind, and every cache's length - examples/rendering/smooth presents through render3d, so it runs on Vulkan too The full valley on headless Vulkan loads to 2.18 GB and holds (it passed 8 GB while loading before). ludic-dev test 305/305, selfhost-test 33/33. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
9539f7bcec
commit
80764f85c1
11 changed files with 284 additions and 113 deletions
|
|
@ -201,7 +201,7 @@ function gpu_query_new(render3d_st: mut Render3dState, n: int, ids: words) -> vo
|
|||
function gpu_query_begin(render3d_st: mut Render3dState, id: int) -> void { if render3d_st.gpu_kind == GPU_VK { gvk_query_begin(render3d_st, id); return }; gl_begin_query(GL_TIME_ELAPSED, id) }
|
||||
function gpu_query_end(render3d_st: mut Render3dState) -> void { if render3d_st.gpu_kind == GPU_VK { gvk_query_end(render3d_st); return }; gl_end_query(GL_TIME_ELAPSED) }
|
||||
# true once the query has its result; the nanoseconds (low 32 bits) are then in out[0]
|
||||
function gpu_query_result(render3d_st: Render3dState, id: int, out: words) -> bool {
|
||||
function gpu_query_result(render3d_st: mut Render3dState, id: int, out: words) -> bool {
|
||||
if render3d_st.gpu_kind == GPU_VK { return gvk_query_result(render3d_st, id, out) }
|
||||
gl_get_query_objectiv(id, GL_QUERY_RESULT_AVAILABLE, out)
|
||||
if out[0] == 0 { return false }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue