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:
parent
22c104f766
commit
e235ec11f0
2 changed files with 9 additions and 1 deletions
|
|
@ -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
|
# 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) }
|
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_frame_reset(render3d_st)
|
||||||
|
gvk_prime_submit(render3d_st)
|
||||||
render3d_st.gvk_cb = gvk_once_begin(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
|
return render3d_st.gvk_cb
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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_h[render3d_st.gvk_prime_n] = buf
|
||||||
render3d_st.gvk_prime_n += 1
|
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 {
|
function gvk_prime_flush(render3d_st: mut Render3dState, cb: pointer) -> void {
|
||||||
if render3d_st.gvk_prime_n == 0 { return }
|
if render3d_st.gvk_prime_n == 0 { return }
|
||||||
if render3d_st.gvk_prime_dst == 0 and not gvk_prime_target(render3d_st) {
|
if render3d_st.gvk_prime_dst == 0 and not gvk_prime_target(render3d_st) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue