Build pipelines before the layers that need them

Reviewing the previous fix, which was itself unreviewed. `update` gave
each list the bind group layout of the pipeline that draws it by zipping
the layer's lists against `self.primitives`, but built those pipelines
afterwards -- so on any pass where one did not exist yet the zip yielded
nothing, and those lists kept no bind group and drew nothing. Measured
on startup: four layers had content while `self.primitives` was still
empty. It only looked right because those layers were marked dirty again
on a later frame and rebuilt then.

`build_pipelines` now runs before the layers, and the pairing is indexed
rather than zipped, so a primitive drawn before it was registered panics
instead of silently leaving its list unbuilt.
This commit is contained in:
iris committed 2026-09-13 14:32:02 -04:00
1 parent a08f61a80c
commit 89491a5949
1 file changed
+10 -4
+10 -4
View File
@@ -118,6 +118,10 @@ impl UiRenderNode {
ui: &mut UiData,
ui_render: &mut UiRenderState,
) {
// Before the layers: a list is given the bind group layout of the
// pipeline that will draw it, so every registered primitive needs one
// by the time a layer is reached.
self.build_pipelines(device, &ui.primitives);
self.active.clear();
for (i, draws) in ui_render.layers.iter_mut() {
self.active.push(i);
@@ -139,13 +143,16 @@ impl UiRenderNode {
rlayer
.primitives
.resize_with(draws.primitives().len(), || ListBuffers::new(device));
for ((list, draws), pipeline) in rlayer
for (id, (list, draws)) in rlayer
.primitives
.iter_mut()
.zip(draws.primitives())
.zip(&self.primitives)
.enumerate()
{
list.update(device, queue, &pipeline.data_layout, draws);
// Indexed, not zipped: a missing pipeline should say so
// rather than quietly leave the list unbuilt.
let layout = &self.primitives[id].data_layout;
list.update(device, queue, layout, draws);
}
rlayer
.textures
@@ -160,7 +167,6 @@ impl UiRenderNode {
draws.updated = false;
}
}
self.build_pipelines(device, &ui.primitives);
if ui.masks.changed {
ui.masks.changed = false;
if self.masks.update(device, queue, &ui.masks[..]) {