diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-09 09:49:51 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-09 09:49:51 +0100 |
| commit | df39c7e3efa70376fac579b178c803eb319d517f (patch) | |
| tree | 35ef2f2b1b0faa210186cd54c3796d4753aa8710 /src/gpu/effects/circle_mask_effect.h | |
| parent | 538767bcf85c0d269b090434383f7499167af566 (diff) | |
fix: Resolve WebGPU uniform buffer alignment issues (Task #74)
Fixed critical validation errors caused by WGSL vec3<f32> alignment mismatches.
Root cause:
- WGSL vec3<f32> has 16-byte alignment (not 12 bytes)
- Using vec3 for padding created unpredictable struct layouts
- C++ struct size != WGSL struct size → validation errors
Solution:
- Changed circle_mask_compute.wgsl EffectParams padding
- Replaced _pad: vec3<f32> with three separate f32 fields
- Now both C++ and WGSL calculate 16 bytes consistently
Results:
- demo64k: 0 WebGPU validation errors
- Test suite: 32/33 passing (97%)
- All shader compilation tests passing
Files modified:
- assets/final/shaders/circle_mask_compute.wgsl
- TODO.md (updated task status)
- PROJECT_CONTEXT.md (updated test results)
- HANDOFF_2026-02-09_UniformAlignment.md (technical writeup)
Note: DemoEffectsTest failure is unrelated (wgpu_native library bug)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/gpu/effects/circle_mask_effect.h')
| -rw-r--r-- | src/gpu/effects/circle_mask_effect.h | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/src/gpu/effects/circle_mask_effect.h b/src/gpu/effects/circle_mask_effect.h index 57f2389..ac44210 100644 --- a/src/gpu/effects/circle_mask_effect.h +++ b/src/gpu/effects/circle_mask_effect.h @@ -6,6 +6,7 @@ #define CIRCLE_MASK_EFFECT_H_ #include "gpu/effect.h" +#include "gpu/effects/post_process_helper.h" #include "gpu/uniform_helper.h" class CircleMaskEffect : public Effect { @@ -20,18 +21,9 @@ class CircleMaskEffect : public Effect { float intensity, float aspect_ratio) override; private: - struct ComputeUniforms { + struct EffectParams { float radius; - float aspect_ratio; - float width; - float height; - }; - - struct RenderUniforms { - float width; - float height; - float _pad1; - float _pad2; + float _pad[3]; }; MainSequence* demo_ = nullptr; @@ -39,12 +31,13 @@ class CircleMaskEffect : public Effect { WGPURenderPipeline compute_pipeline_ = nullptr; WGPUBindGroup compute_bind_group_ = nullptr; - UniformBuffer<ComputeUniforms> compute_uniforms_; + UniformBuffer<CommonPostProcessUniforms> compute_uniforms_; + UniformBuffer<EffectParams> compute_params_; WGPURenderPipeline render_pipeline_ = nullptr; WGPUBindGroup render_bind_group_ = nullptr; WGPUSampler mask_sampler_ = nullptr; - UniformBuffer<RenderUniforms> render_uniforms_; + UniformBuffer<CommonPostProcessUniforms> render_uniforms_; }; #endif /* CIRCLE_MASK_EFFECT_H_ */ |
