fix(render3d): nothing allocated in the steady state - the Vulkan allocator reuses its records
gvk_mem_new made a one-slot []pointer per allocation, and turned the requirement's size and alignment into strings to read them as ints; gvk_list_drop_last rebuilt the spare-record list to drop its last entry; gvk_mem_id did the string round trip on every free. One slot is kept (gvk_map_slot), int() truncates a long, the spare list pops. Every Text.to_int(string(x)) in render3d is int(x) now. Vk.heap_bytes() (vk_mac.ll: malloc_zone_statistics' size_in_use; 0 on Windows) and examples/rendering/steady.ludic, in the suite: a buffer released and made again 5000 times and 600 whole frames gain 0 bytes each - the allocator before this, 1,120,000 over the 5000. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
3915af34c2
commit
866037a0d7
9 changed files with 119 additions and 19 deletions
|
|
@ -28,6 +28,8 @@ import "vk_api.ludic"
|
|||
# Once a frame: on macOS drains what MoltenVK and the layer autoreleased during the last one (a
|
||||
# program pumping its own events has no other pool); nothing elsewhere.
|
||||
extern function vk_frame_pool() = "lvk_frame_pool"
|
||||
# malloc's live bytes (macOS; 0 elsewhere): a test that a path allocates nothing, frame after frame
|
||||
extern function vk_heap_bytes() -> long = "lvk_heap_bytes"
|
||||
extern function vk_sl_prefer(on: int) = "lvk_sl_prefer"
|
||||
extern function vk_sl_active() -> int = "lvk_sl_active"
|
||||
extern function vk_sl_init(pref: pointer, sdk_version: long) -> int = "lsl_slInit"
|
||||
|
|
|
|||
|
|
@ -250,3 +250,17 @@ push:
|
|||
store ptr %p, ptr @lvk_pool
|
||||
ret void
|
||||
}
|
||||
|
||||
; ---- the heap in use --------------------------------------------------------------------------
|
||||
; malloc's live bytes across the default zones, for a test that proves a path allocates nothing in
|
||||
; its steady state (render3d's examples/rendering/steady.ludic). malloc_statistics_t is four
|
||||
; words: blocks_in_use (u32, padded), size_in_use, max_size_in_use, size_allocated.
|
||||
declare void @malloc_zone_statistics(ptr, ptr)
|
||||
define i64 @lvk_heap_bytes() {
|
||||
entry:
|
||||
%st = alloca [4 x i64], align 8
|
||||
call void @malloc_zone_statistics(ptr null, ptr %st)
|
||||
%p = getelementptr [4 x i64], ptr %st, i32 0, i32 1
|
||||
%n = load i64, ptr %p
|
||||
ret i64 %n
|
||||
}
|
||||
|
|
|
|||
|
|
@ -369,3 +369,9 @@ define void @lvk_frame_pool() {
|
|||
entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
; the heap's live bytes are asked for on the Mac only (vk_mac.ll); 0 here, and a test skips its check
|
||||
define i64 @lvk_heap_bytes() {
|
||||
entry:
|
||||
ret i64 0
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue