render3d: buffer primes in a command buffer of their own (as r3d/prime-fix)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-28 14:03:36 +03:00
parent 22c104f766
commit e235ec11f0
2 changed files with 9 additions and 1 deletions

View file

@ -1012,8 +1012,8 @@ function gvk_frame_cb(render3d_st: mut Render3dState) -> pointer {
# the frame in flight uses the other half of the ring and the other pool, unless it has this slot
if render3d_st.gvk_frame_pending and (render3d_st.gvk_frame_pending_no & 1) == (render3d_st.gvk_frame_no & 1) { gvk_frame_wait(render3d_st) }
gvk_frame_reset(render3d_st)
gvk_prime_submit(render3d_st)
render3d_st.gvk_cb = gvk_once_begin(render3d_st)
gvk_prime_flush(render3d_st, render3d_st.gvk_cb)
}
return render3d_st.gvk_cb
}

View file

@ -775,6 +775,14 @@ function gvk_prime(render3d_st: mut Render3dState, b: int, buf: long) -> void {
render3d_st.gvk_prime_h[render3d_st.gvk_prime_n] = buf
render3d_st.gvk_prime_n += 1
}
# In a command buffer of their own, submitted and waited for at once: recorded into the frame's, a
# buffer released later in that frame (a guest loading its models) was destroyed before the copy ran.
function gvk_prime_submit(render3d_st: mut Render3dState) -> void {
if render3d_st.gvk_prime_n == 0 { return }
let cb = gvk_once_begin(render3d_st)
gvk_prime_flush(render3d_st, cb)
gvk_once_end(render3d_st, cb)
}
function gvk_prime_flush(render3d_st: mut Render3dState, cb: pointer) -> void {
if render3d_st.gvk_prime_n == 0 { return }
if render3d_st.gvk_prime_dst == 0 and not gvk_prime_target(render3d_st) {