diff --git a/packages/ludic.render3d/env.ludic b/packages/ludic.render3d/env.ludic index 446217d9..125ab03c 100644 --- a/packages/ludic.render3d/env.ludic +++ b/packages/ludic.render3d/env.ludic @@ -339,6 +339,8 @@ export state Render3dState { gvk_us_set: long = 0 gvk_us_draw: long = 0 gvk_n_draws: int = 0 + gvk_cb_draws: int = 0 # draws recorded into the frame's command buffer so far + gvk_cb_cap: int = -1 # a command buffer is submitted after this many (0 = never; -1 unread) gvk_n_asked: int = 0 # draws that reached gvk_draw_now: every one the renderer asked for gvk_n_flush: int = 0 gvk_prof_frames: int = 0 diff --git a/packages/ludic.render3d/gpu_vk_draw.ludic b/packages/ludic.render3d/gpu_vk_draw.ludic index fdb3bd3e..4be7dfa9 100644 --- a/packages/ludic.render3d/gpu_vk_draw.ludic +++ b/packages/ludic.render3d/gpu_vk_draw.ludic @@ -1248,6 +1248,13 @@ function gvk_set_view(render3d_st: mut Render3dState, cb: pointer) -> void { # first / count select vertices or indices; count 0 means the mesh's own count. instances >= 1. function gvk_draw(render3d_st: mut Render3dState, p: int, m: Mesh, st: GvkState, first: int, count: int, instances: int, tx: words, tx_w: int, tx_cap: int, rec: words, rec_o: int) -> void { if render3d_st.gvk_prog_var == null or p <= 0 or p >= len(render3d_st.gvk_prog_var) or render3d_st.gvk_prog_var[p] == null { return } + if render3d_st.gvk_cb_cap < 0 { + render3d_st.gvk_cb_cap = 0 + if r3d_env_has(render3d_st, "R3D_CB_DRAWS") { render3d_st.gvk_cb_cap = Text.to_int(r3d_env(render3d_st, "R3D_CB_DRAWS")) } + } + if render3d_st.gvk_cb_cap > 0 and render3d_st.gvk_cb_draws >= render3d_st.gvk_cb_cap { gvk_flush(render3d_st) } + if render3d_st.gvk_cb == null { render3d_st.gvk_cb_draws = 0 } + render3d_st.gvk_cb_draws += 1 let prof = gvk_prof(render3d_st) var t0: long = 0 if prof { t0 = gl_now_us() }