From fe008df92f7a68d81c9bedb4328da7001e0775f0 Mon Sep 17 00:00:00 2001 From: skal Date: Sat, 21 Mar 2026 08:52:53 +0100 Subject: feat(cnn_v3): Phase 4 complete — CNNv3Effect C++ + FiLM uniform upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cnn_v3/src/cnn_v3_effect.{h,cc}: full Effect subclass with 5 compute passes (enc0→enc1→bottleneck→dec1→dec0), shared weights storage buffer, per-pass uniform buffers, set_film_params() API - Fixed WGSL/C++ struct alignment: vec3u has align=16, so CnnV3Params4ch is 64 bytes and CnnV3ParamsEnc1 is 96 bytes (not 48/80) - Weight offsets computed as explicit formulas (e.g. 20*4*9+4) for clarity - Registered in CMake, shaders.h/cc, demo_effects.h, test_demo_effects.cc - 35/35 tests pass handoff(Gemini): CNN v3 Phase 5 next — parity validation (Python ref vs WGSL) --- src/effects/shaders.cc | 5 +++++ src/effects/shaders.h | 7 +++++++ src/gpu/demo_effects.h | 3 ++- src/tests/gpu/test_demo_effects.cc | 5 +++++ 4 files changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/effects/shaders.cc b/src/effects/shaders.cc index 22c6a6d..f64e135 100644 --- a/src/effects/shaders.cc +++ b/src/effects/shaders.cc @@ -117,6 +117,11 @@ const char* ntsc_rgb_shader_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_NTSC_RGB); const char* ntsc_yiq_shader_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_NTSC_YIQ); const char* gbuf_raster_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_GBUF_RASTER); const char* gbuf_pack_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_GBUF_PACK); +const char* cnn_v3_enc0_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_CNN_V3_ENC0); +const char* cnn_v3_enc1_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_CNN_V3_ENC1); +const char* cnn_v3_bottleneck_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_CNN_V3_BOTTLENECK); +const char* cnn_v3_dec1_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_CNN_V3_DEC1); +const char* cnn_v3_dec0_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_CNN_V3_DEC0); // Compute shaders const char* gen_noise_compute_wgsl = diff --git a/src/effects/shaders.h b/src/effects/shaders.h index cf095fb..4a77597 100644 --- a/src/effects/shaders.h +++ b/src/effects/shaders.h @@ -24,6 +24,13 @@ extern const char* ntsc_yiq_shader_wgsl; extern const char* gbuf_raster_wgsl; extern const char* gbuf_pack_wgsl; +// CNN v3 inference shaders +extern const char* cnn_v3_enc0_wgsl; +extern const char* cnn_v3_enc1_wgsl; +extern const char* cnn_v3_bottleneck_wgsl; +extern const char* cnn_v3_dec1_wgsl; +extern const char* cnn_v3_dec0_wgsl; + // Compute shaders extern const char* gen_noise_compute_wgsl; extern const char* gen_perlin_compute_wgsl; diff --git a/src/gpu/demo_effects.h b/src/gpu/demo_effects.h index 91ab6f2..66b920c 100644 --- a/src/gpu/demo_effects.h +++ b/src/gpu/demo_effects.h @@ -32,8 +32,9 @@ #include "effects/scratch_effect.h" #include "effects/ntsc_effect.h" -// CNN v3 G-buffer +// CNN v3 G-buffer + inference #include "../../cnn_v3/src/gbuffer_effect.h" +#include "../../cnn_v3/src/cnn_v3_effect.h" // TODO: Port CNN effects // #include "../../cnn_v1/src/cnn_v1_effect.h" diff --git a/src/tests/gpu/test_demo_effects.cc b/src/tests/gpu/test_demo_effects.cc index c2588f2..f5af5a9 100644 --- a/src/tests/gpu/test_demo_effects.cc +++ b/src/tests/gpu/test_demo_effects.cc @@ -84,6 +84,11 @@ static void test_effects() { fixture.ctx(), std::vector{"source"}, std::vector{"gbuf_feat0", "gbuf_feat1"}, 0.0f, 1000.0f)}, + {"CNNv3Effect", + std::make_shared( + fixture.ctx(), + std::vector{"gbuf_feat0", "gbuf_feat1"}, + std::vector{"cnn_v3_output"}, 0.0f, 1000.0f)}, }; int passed = 0; -- cgit v1.2.3