diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-09 15:20:09 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-09 15:20:09 +0100 |
| commit | af55c4a7a54a90d4c252aa4fe354e7bf8624072e (patch) | |
| tree | 6aef045c1f52f0df766e5b091cfb61a950d48c3f | |
| parent | ff4108b383e8b543a298debdb3518a19e08d74ab (diff) | |
refactor: Deduplicate CommonUniforms with #include in WGSL shaders
Replace redundant CommonUniforms struct definitions across 13 shaders
with #include "common_uniforms" directive. Integrate ShaderComposer
preprocessing into all shader creation pipelines.
Changes:
- Replace 9-line CommonUniforms definitions with single #include line
- Add ShaderComposer.Compose() to create_post_process_pipeline()
- Add ShaderComposer.Compose() to gpu_create_render_pass()
- Add ShaderComposer.Compose() to gpu_create_compute_pass()
- Add InitShaderComposer() calls to test_effect_base and test_demo_effects
- Update test_shader_compilation to compose shaders before validation
Net reduction: 83 lines of duplicate code eliminated
All 35 tests passing (100%)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
| -rw-r--r-- | assets/final/shaders/chroma_aberration.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/circle_mask_compute.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/circle_mask_render.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/distort.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/ellipse.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/gaussian_blur.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/main_shader.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/particle_compute.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/particle_render.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/particle_spray_compute.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/passthrough.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/solarize.wgsl | 10 | ||||
| -rw-r--r-- | assets/final/shaders/vignette.wgsl | 12 | ||||
| -rw-r--r-- | src/gpu/effects/post_process_helper.cc | 5 | ||||
| -rw-r--r-- | src/gpu/gpu.cc | 11 | ||||
| -rw-r--r-- | src/tests/test_demo_effects.cc | 3 | ||||
| -rw-r--r-- | src/tests/test_effect_base.cc | 3 | ||||
| -rw-r--r-- | src/tests/test_shader_compilation.cc | 7 |
18 files changed, 39 insertions, 122 deletions
diff --git a/assets/final/shaders/chroma_aberration.wgsl b/assets/final/shaders/chroma_aberration.wgsl index f84a393..6c942b7 100644 --- a/assets/final/shaders/chroma_aberration.wgsl +++ b/assets/final/shaders/chroma_aberration.wgsl @@ -1,15 +1,7 @@ @group(0) @binding(0) var smplr: sampler; @group(0) @binding(1) var txt: texture_2d<f32>; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" struct ChromaAberrationParams { offset_scale: f32, angle: f32, diff --git a/assets/final/shaders/circle_mask_compute.wgsl b/assets/final/shaders/circle_mask_compute.wgsl index fefb287..484d3dd 100644 --- a/assets/final/shaders/circle_mask_compute.wgsl +++ b/assets/final/shaders/circle_mask_compute.wgsl @@ -1,15 +1,7 @@ // Circle mask compute shader // Generates a circular mask (1.0 inside, 0.0 outside) -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" struct CircleMaskParams { radius: f32, _pad0: f32, diff --git a/assets/final/shaders/circle_mask_render.wgsl b/assets/final/shaders/circle_mask_render.wgsl index ce98f9c..cfa002e 100644 --- a/assets/final/shaders/circle_mask_render.wgsl +++ b/assets/final/shaders/circle_mask_render.wgsl @@ -4,15 +4,7 @@ @group(0) @binding(0) var mask_tex: texture_2d<f32>; @group(0) @binding(1) var mask_sampler: sampler; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(2) var<uniform> uniforms: CommonUniforms; diff --git a/assets/final/shaders/distort.wgsl b/assets/final/shaders/distort.wgsl index 4de8441..5d35129 100644 --- a/assets/final/shaders/distort.wgsl +++ b/assets/final/shaders/distort.wgsl @@ -1,15 +1,7 @@ @group(0) @binding(0) var smplr: sampler; @group(0) @binding(1) var txt: texture_2d<f32>; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" struct DistortParams { strength: f32, diff --git a/assets/final/shaders/ellipse.wgsl b/assets/final/shaders/ellipse.wgsl index 9c6b0d9..05dfcfc 100644 --- a/assets/final/shaders/ellipse.wgsl +++ b/assets/final/shaders/ellipse.wgsl @@ -1,12 +1,4 @@ -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(0) var<uniform> uniforms: CommonUniforms; diff --git a/assets/final/shaders/gaussian_blur.wgsl b/assets/final/shaders/gaussian_blur.wgsl index 2a887a4..02156f7 100644 --- a/assets/final/shaders/gaussian_blur.wgsl +++ b/assets/final/shaders/gaussian_blur.wgsl @@ -1,15 +1,7 @@ @group(0) @binding(0) var smplr: sampler; @group(0) @binding(1) var txt: texture_2d<f32>; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" struct GaussianBlurParams { strength: f32, _pad: f32, diff --git a/assets/final/shaders/main_shader.wgsl b/assets/final/shaders/main_shader.wgsl index 7155a6d..ab0278c 100644 --- a/assets/final/shaders/main_shader.wgsl +++ b/assets/final/shaders/main_shader.wgsl @@ -1,12 +1,4 @@ -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(0) var<uniform> uniforms: CommonUniforms; diff --git a/assets/final/shaders/particle_compute.wgsl b/assets/final/shaders/particle_compute.wgsl index 38a95e1..ae513c8 100644 --- a/assets/final/shaders/particle_compute.wgsl +++ b/assets/final/shaders/particle_compute.wgsl @@ -5,15 +5,7 @@ struct Particle { color: vec4<f32>, }; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(0) var<storage, read_write> particles: array<Particle>; @group(0) @binding(1) var<uniform> uniforms: CommonUniforms; diff --git a/assets/final/shaders/particle_render.wgsl b/assets/final/shaders/particle_render.wgsl index 9030a3a..6a2b636 100644 --- a/assets/final/shaders/particle_render.wgsl +++ b/assets/final/shaders/particle_render.wgsl @@ -5,15 +5,7 @@ struct Particle { color: vec4<f32>, }; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(0) var<storage, read> particles: array<Particle>; @group(0) @binding(1) var<uniform> uniforms: CommonUniforms; diff --git a/assets/final/shaders/particle_spray_compute.wgsl b/assets/final/shaders/particle_spray_compute.wgsl index b165971..a4041f2 100644 --- a/assets/final/shaders/particle_spray_compute.wgsl +++ b/assets/final/shaders/particle_spray_compute.wgsl @@ -5,15 +5,7 @@ struct Particle { color: vec4<f32>, }; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(0) var<storage, read_write> particles: array<Particle>; @group(0) @binding(1) var<uniform> uniforms: CommonUniforms; diff --git a/assets/final/shaders/passthrough.wgsl b/assets/final/shaders/passthrough.wgsl index dfdacf4..266e231 100644 --- a/assets/final/shaders/passthrough.wgsl +++ b/assets/final/shaders/passthrough.wgsl @@ -1,15 +1,7 @@ @group(0) @binding(0) var smplr: sampler; @group(0) @binding(1) var txt: texture_2d<f32>; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(2) var<uniform> uniforms: CommonUniforms; @vertex fn vs_main(@builtin(vertex_index) i: u32) -> @builtin(position) vec4<f32> { diff --git a/assets/final/shaders/solarize.wgsl b/assets/final/shaders/solarize.wgsl index 645fb9a..de15dfc 100644 --- a/assets/final/shaders/solarize.wgsl +++ b/assets/final/shaders/solarize.wgsl @@ -1,15 +1,7 @@ @group(0) @binding(0) var smplr: sampler; @group(0) @binding(1) var txt: texture_2d<f32>; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -}; +#include "common_uniforms" @group(0) @binding(2) var<uniform> uniforms: CommonUniforms; diff --git a/assets/final/shaders/vignette.wgsl b/assets/final/shaders/vignette.wgsl index 93e8a8c..b129883 100644 --- a/assets/final/shaders/vignette.wgsl +++ b/assets/final/shaders/vignette.wgsl @@ -1,14 +1,8 @@ @group(0) @binding(0) var input_sampler: sampler; @group(0) @binding(1) var input_tex: texture_2d<f32>; -struct CommonUniforms { - resolution: vec2<f32>, - _pad0: f32, - _pad1: f32, - aspect_ratio: f32, - time: f32, - beat: f32, - audio_intensity: f32, -};struct VignetteParams { +#include "common_uniforms" + +struct VignetteParams { radius: f32, softness: f32, }; diff --git a/src/gpu/effects/post_process_helper.cc b/src/gpu/effects/post_process_helper.cc index bc66448..e99467f 100644 --- a/src/gpu/effects/post_process_helper.cc +++ b/src/gpu/effects/post_process_helper.cc @@ -4,16 +4,19 @@ #include "post_process_helper.h" #include "../demo_effects.h" #include "gpu/gpu.h" +#include "gpu/effects/shader_composer.h" #include <cstring> // Helper to create a standard post-processing pipeline WGPURenderPipeline create_post_process_pipeline(WGPUDevice device, WGPUTextureFormat format, const char* shader_code) { + std::string composed_shader = ShaderComposer::Get().Compose({}, shader_code); + WGPUShaderModuleDescriptor shader_desc = {}; WGPUShaderSourceWGSL wgsl_src = {}; wgsl_src.chain.sType = WGPUSType_ShaderSourceWGSL; - wgsl_src.code = str_view(shader_code); + wgsl_src.code = str_view(composed_shader.c_str()); shader_desc.nextInChain = &wgsl_src.chain; WGPUShaderModule shader_module = wgpuDeviceCreateShaderModule(device, &shader_desc); diff --git a/src/gpu/gpu.cc b/src/gpu/gpu.cc index fde241d..e89a2f0 100644 --- a/src/gpu/gpu.cc +++ b/src/gpu/gpu.cc @@ -5,6 +5,7 @@ #include "gpu.h" #include "effect.h" #include "gpu/effects/shaders.h" +#include "gpu/effects/shader_composer.h" #include "platform/platform.h" #include <cassert> @@ -55,10 +56,13 @@ RenderPass gpu_create_render_pass(WGPUDevice device, WGPUTextureFormat format, ResourceBinding* bindings, int num_bindings) { RenderPass pass = {}; + // Compose shader to resolve #include directives + std::string composed_shader = ShaderComposer::Get().Compose({}, shader_code); + // Create Shader Module WGPUShaderSourceWGSL wgsl_src = {}; wgsl_src.chain.sType = WGPUSType_ShaderSourceWGSL; - wgsl_src.code = str_view(shader_code); + wgsl_src.code = str_view(composed_shader.c_str()); WGPUShaderModuleDescriptor shader_desc = {}; shader_desc.nextInChain = &wgsl_src.chain; WGPUShaderModule shader_module = @@ -156,9 +160,12 @@ ComputePass gpu_create_compute_pass(WGPUDevice device, const char* shader_code, int num_bindings) { ComputePass pass = {}; + // Compose shader to resolve #include directives + std::string composed_shader = ShaderComposer::Get().Compose({}, shader_code); + WGPUShaderSourceWGSL wgsl_src = {}; wgsl_src.chain.sType = WGPUSType_ShaderSourceWGSL; - wgsl_src.code = str_view(shader_code); + wgsl_src.code = str_view(composed_shader.c_str()); WGPUShaderModuleDescriptor shader_desc = {}; shader_desc.nextInChain = &wgsl_src.chain; WGPUShaderModule shader_module = diff --git a/src/tests/test_demo_effects.cc b/src/tests/test_demo_effects.cc index d0163c2..0d2b09a 100644 --- a/src/tests/test_demo_effects.cc +++ b/src/tests/test_demo_effects.cc @@ -197,6 +197,9 @@ static void test_effect_type_classification() { int main() { fprintf(stdout, "=== Demo Effects Tests ===\n"); + extern void InitShaderComposer(); + InitShaderComposer(); + test_post_process_effects(); test_scene_effects(); test_effect_type_classification(); diff --git a/src/tests/test_effect_base.cc b/src/tests/test_effect_base.cc index e280e05..612e9da 100644 --- a/src/tests/test_effect_base.cc +++ b/src/tests/test_effect_base.cc @@ -249,6 +249,9 @@ static void test_pixel_helpers() { int main() { fprintf(stdout, "=== Effect Base Tests ===\n"); + extern void InitShaderComposer(); + InitShaderComposer(); + test_webgpu_fixture(); test_offscreen_render_target(); test_effect_construction(); diff --git a/src/tests/test_shader_compilation.cc b/src/tests/test_shader_compilation.cc index e2c0adc..a322e8a 100644 --- a/src/tests/test_shader_compilation.cc +++ b/src/tests/test_shader_compilation.cc @@ -115,16 +115,19 @@ static bool test_shader_compilation(const char* name, const char* shader_code) { return true; // Not a failure, just skipped } + // Compose shader to resolve #include directives + std::string composed_shader = ShaderComposer::Get().Compose({}, shader_code); + #if defined(DEMO_CROSS_COMPILE_WIN32) WGPUShaderModuleWGSLDescriptor wgsl_desc = {}; wgsl_desc.chain.sType = WGPUSType_ShaderModuleWGSLDescriptor; - wgsl_desc.code = shader_code; + wgsl_desc.code = composed_shader.c_str(); WGPUShaderModuleDescriptor shader_desc = {}; shader_desc.nextInChain = (const WGPUChainedStruct*)&wgsl_desc.chain; #else WGPUShaderSourceWGSL wgsl_desc = {}; wgsl_desc.chain.sType = WGPUSType_ShaderSourceWGSL; - wgsl_desc.code = str_view(shader_code); + wgsl_desc.code = str_view(composed_shader.c_str()); WGPUShaderModuleDescriptor shader_desc = {}; shader_desc.nextInChain = (const WGPUChainedStruct*)&wgsl_desc.chain; #endif |
