fix(render3d): a refused pipeline is not retried every draw, and an evicted chunk is freed whole
gvk_pipeline_fast cached only pipelines it made, so one the driver refused was attempted again on every draw, each attempt building its key string and create structs anew; the refusal is cached too (a Vulkan program's variants are fixed when it is made, so it would fail the same way). stream_evict made a new chunk list per eviction and never freed the evicted chunks' records; it compacts the list in place and frees each evicted chunk with its data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
6dd1810038
commit
70a92a8862
2 changed files with 15 additions and 6 deletions
|
|
@ -1903,8 +1903,9 @@ function gvk_pipeline_fast(render3d_st: mut Render3dState, p: int, m: Mesh, st:
|
|||
return render3d_st.gvk_pc_pipe[k]
|
||||
}
|
||||
}
|
||||
# a pipeline the driver refused is remembered as 0 too: retried on every draw, each try built its
|
||||
# key and its create structs again and gave none of them back
|
||||
let pipe = gvk_pipeline(render3d_st, p, m, st, n_color, color_fmt, depth_fmt, samples)
|
||||
if pipe == 0 { return pipe }
|
||||
push(render3d_st.gvk_pc_prog, p); push(render3d_st.gvk_pc_layout, layout); push(render3d_st.gvk_pc_state, state)
|
||||
push(render3d_st.gvk_pc_bias, bias); push(render3d_st.gvk_pc_pass, pass); push(render3d_st.gvk_pc_pipe, pipe)
|
||||
if p < 4096 { render3d_st.gvk_pc_last[p] = len(render3d_st.gvk_pc_prog) - 1 }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue