diff options
| author | skal <pascal.massimino@gmail.com> | 2026-03-23 07:54:18 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-03-23 07:54:18 +0100 |
| commit | 491a3c1ccbd0f46be655e97d2e3697135df6e3a2 (patch) | |
| tree | 57e9d7d8732fe7a0625d99641e780b38ace4c765 /cnn_v3/src | |
| parent | 1e3813355e37f903314ec2069ff788c6f69becfd (diff) | |
feat(gbuffer): wire_dag() + find_downstream_output() for temporal feedback
- Add Effect::wire_dag() virtual (called from init_effect_nodes after full DAG built)
- Add Effect::find_downstream_output() protected helper (first downstream consumer output)
- GBufferEffect::wire_dag() auto-sets cnn_output_node_ via find_downstream_output,
guarding against sink (external view, null texture)
- GBufferEffect::post_render() null-checks src texture before CopyTextureToTexture
- Tests: find_downstream_output cases + wire_dag integration in test_effect_base
- Doc: SEQUENCE.md updated with wire_dag pattern, helper contract, and sink guard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'cnn_v3/src')
| -rw-r--r-- | cnn_v3/src/gbuffer_effect.cc | 10 | ||||
| -rw-r--r-- | cnn_v3/src/gbuffer_effect.h | 4 |
2 files changed, 13 insertions, 1 deletions
diff --git a/cnn_v3/src/gbuffer_effect.cc b/cnn_v3/src/gbuffer_effect.cc index 512843c..1bfd685 100644 --- a/cnn_v3/src/gbuffer_effect.cc +++ b/cnn_v3/src/gbuffer_effect.cc @@ -773,10 +773,18 @@ void GBufferEffect::update_raster_bind_group(NodeRegistry& nodes) { wgpuBindGroupLayoutRelease(bgl); } +void GBufferEffect::wire_dag(const std::vector<EffectDAGNode>& dag) { + const std::string out = find_downstream_output(dag); + // "sink" is an external view (no owned texture) — not a valid copy source. + if (out != "sink") cnn_output_node_ = out; +} + void GBufferEffect::post_render(WGPUCommandEncoder encoder, NodeRegistry& nodes) { if (cnn_output_node_.empty() || !nodes.has_node(cnn_output_node_)) return; + WGPUTexture src_tex = nodes.get_texture(cnn_output_node_); + if (!src_tex) return; // external view (e.g. sink) — no owned texture to copy WGPUTexelCopyTextureInfo src = {}; - src.texture = nodes.get_texture(cnn_output_node_); + src.texture = src_tex; src.mipLevel = 0; WGPUTexelCopyTextureInfo dst = {}; dst.texture = nodes.get_texture(node_prev_tex_); diff --git a/cnn_v3/src/gbuffer_effect.h b/cnn_v3/src/gbuffer_effect.h index 8e777f8..76d4347 100644 --- a/cnn_v3/src/gbuffer_effect.h +++ b/cnn_v3/src/gbuffer_effect.h @@ -49,6 +49,10 @@ class GBufferEffect : public Effect { // Copies cnn_output_node_ → node_prev_tex_ after all effects have rendered. void post_render(WGPUCommandEncoder encoder, NodeRegistry& nodes) override; + // Auto-wires cnn_output_node_: finds the first downstream effect whose + // input_nodes intersect our output_nodes, and uses its output_nodes[0]. + void wire_dag(const std::vector<EffectDAGNode>& dag) override; + // Populate the internal scene with ~20 rotating cubes and a few pumping // spheres. Must be called once before the first render(). void set_scene(); |
