// CNN v2 Effect - Parametric Static Features // Multi-pass post-processing with 7D feature input #pragma once #include "gpu/effect.h" #include class CNNv2Effect : public PostProcessEffect { public: explicit CNNv2Effect(const GpuContext& ctx); ~CNNv2Effect(); void init(MainSequence* demo) override; void resize(int width, int height) override; void compute(WGPUCommandEncoder encoder, const CommonPostProcessUniforms& uniforms) override; void render(WGPURenderPassEncoder pass, const CommonPostProcessUniforms& uniforms) override; void update_bind_group(WGPUTextureView input_view) override; private: struct LayerInfo { uint32_t kernel_size; uint32_t in_channels; uint32_t out_channels; uint32_t weight_offset; uint32_t weight_count; }; struct LayerParams { uint32_t kernel_size; uint32_t in_channels; uint32_t out_channels; uint32_t weight_offset; uint32_t is_output_layer; }; void create_textures(); void create_pipelines(); void load_weights(); void cleanup(); // Static features compute WGPUComputePipeline static_pipeline_; WGPUBindGroup static_bind_group_; WGPUTexture static_features_tex_; WGPUTextureView static_features_view_; // CNN layers (storage buffer architecture) WGPUComputePipeline layer_pipeline_; // Single pipeline for all layers WGPUBuffer weights_buffer_; // Storage buffer for weights WGPUBuffer layer_params_buffer_; // Uniform buffer for per-layer params std::vector layer_info_; // Layer metadata std::vector layer_bind_groups_; // Per-layer bind groups std::vector layer_textures_; // Ping-pong buffers std::vector layer_views_; // Input mips WGPUTexture input_mip_tex_; WGPUTextureView input_mip_view_[3]; WGPUTextureView current_input_view_; bool initialized_; };