perf(render): single-pass viewport wire classification and partitioning

- Add fast classify_wire to bypass circle/ellipse extraction for the 95%+ of wires that are straight/polylines.
- Implement single-pass partition_wires extracting regular wires, mesh edges, block wires, circles, and ellipses in one traversal.
- Upload circle and ellipse instances directly from pre-extracted buffers in PersistentWireArena and build_wire_buffers without redundant iteration.
This commit is contained in:
Karim Jerbi committed 2026-09-07 13:55:16 +01:00
1 parent 0425f979f9
commit dd061a55ed
3 files changed
+200 -63

No files matched your search

+7 -12
View File
@@ -839,34 +839,29 @@ impl shader::Primitive for Primitive {
gpus.extend(arena.wire_gpus());
}
inner.gpu_wires = std::sync::Arc::new(gpus);
// Blocks keep their own cached geometry and placements.
let instanced: Vec<&crate::scene::WireModel> = vp_wires
.iter()
.filter(|w| w.render_instance.is_some())
.collect();
let partitioned =
wire_arena::partition_wires(&vp_wires, &draw_depths);
inner.gpu_block_wires = std::sync::Arc::new(
inner.upload_block_wires(
device,
queue,
&instanced,
&partitioned.instanced,
&draw_depths,
&mut pipeline.block_geometry,
),
);
inner.gpu_circles = std::sync::Arc::new(
inner.upload_circles(
inner.upload_circles_from_instances(
device,
queue,
&vp_wires,
&draw_depths,
&partitioned.circle_instances,
),
);
inner.gpu_ellipses = std::sync::Arc::new(
inner.upload_ellipses(
inner.upload_ellipses_from_instances(
device,
queue,
&vp_wires,
&draw_depths,
&partitioned.ellipse_instances,
),
);
if _patched {