From 05016ec6e9b1279ab631dd66b6a10fcfc4e6f784 Mon Sep 17 00:00:00 2001 From: Jerome Humbert Date: Tue, 30 Jul 2024 22:59:59 +0100 Subject: [PATCH] Fix shader binding bug (#356) Fix a bug where the render shader attempts to bind the `Spawner` storage buffer as read-only, but that struct is defined as containing an atomic variable, which according to the WGSL specification requires write access. Add a pipeline define `SPAWNER_READONLY` to redefine that struct field as non-atomic, to allow read-only binding. --- src/render/mod.rs | 2 +- src/render/vfx_common.wgsl | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/render/mod.rs b/src/render/mod.rs index 411757fd..0d919237 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -1154,7 +1154,7 @@ impl SpecializedRenderPipeline for ParticlesRenderPipeline { .create_bind_group_layout("hanabi:buffer_layout_render", &entries); let mut layout = vec![self.view_layout.clone(), particles_buffer_layout]; - let mut shader_defs = vec![]; + let mut shader_defs = vec!["SPAWNER_READONLY".into()]; // Key: PARTICLE_TEXTURE if key.has_image { diff --git a/src/render/vfx_common.wgsl b/src/render/vfx_common.wgsl index 93384675..645da962 100644 --- a/src/render/vfx_common.wgsl +++ b/src/render/vfx_common.wgsl @@ -22,7 +22,12 @@ struct Spawner { inverse_transform: mat3x4, // transposed (row-major) spawn: i32, seed: u32, + // Can't use storage with atomics +#ifdef SPAWNER_READONLY + count: i32, +#else count: atomic, +#endif effect_index: u32, #ifdef SPAWNER_PADDING {{SPAWNER_PADDING}}