entering the world no longer crashes on Linux and Windows

- entering the world no longer aborts on Vulkan, which is every Linux build and Windows by default: the world's draw inside the UI pass had opened a second GPU query span, and wgpu allows one at a time (2258)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-09-16 06:44:38 +07:00
co-authored by Claude Fable 5.1
parent 60bb2e3d6d
commit 66388278d4
2 changed files with 9 additions and 6 deletions
+2 -1
View File
@@ -120,7 +120,8 @@ enum GpuBucket {
Transparent,
/// The `ffx_glow` chain: the quarter-res downsample, the two Gauss taps — and a bake's
/// combine. The world's combine is the first draw of the UI camera's main pass since 2234,
/// nested under `main_transparent_pass_2d`, so it lands in [`Self::Ui`] with that pass.
/// inside `main_transparent_pass_2d`'s own span (it has none of its own — 2258), so it lands
/// in [`Self::Ui`] with that pass.
Glow,
/// The full-screen tail on every camera: tonemapping, upscaling, the MSAA writeback.
Post,
+7 -5
View File
@@ -1366,14 +1366,16 @@ impl ViewNode for FfxTransparent2dNode {
render_pass.set_camera_viewport(viewport);
}
if let Some((combine, bind)) = ground.as_ref() {
// Its own span inside the pass, so the per-pass split (`WOW_GPU_PASSES`)
// still reads one `ffx_glow_combine` a frame on a device that times inside
// a pass; on one that does not, the transparent pass carries it.
let ground_span = diagnostics.pass_span(&mut render_pass, "ffx_glow_combine");
// No span of its own. A `pass_span` is a pipeline-statistics query as well
// as a timestamp pair, and wgpu allows ONE such query active at a time: a
// second one opened inside the pass's own was the validation error that
// aborted every Vulkan build of the 09-15 sync on its first world frame
// (B390, 2258) — and only Vulkan exposes the feature, so Metal and DX12
// never nested anything and no gate saw it. The transparent pass's number
// carries the combine; the journal never read a nested span.
render_pass.set_render_pipeline(combine);
render_pass.set_bind_group(0, bind, &[]);
render_pass.draw(0..3, 0..1);
ground_span.end(&mut render_pass);
}
if !transparent_phase.items.is_empty() {
if let Err(err) = transparent_phase.render(&mut render_pass, world, view_entity)