# A hand-written node. `rust:` names the type in `crate::ops` that implements # `Operation`; its descriptor, its parameters and its passes come from that # type rather than from this file. # # It appears here anyway so that `ops/` lists the whole pipeline in order — # including the neighbourhood operations, which run as a group after every # point operation but are still ordered among themselves. id: noise_reduction order: 110 attributes: [detail] rust: NoiseReduction why_rust: | A kernel, not four facts. The declarative schema hands a fragment a colour and no coordinate, which is precisely what a denoiser cannot work with — it is defined by what the neighbouring pixels are doing. It is therefore a `DetailStage` (see `../src/detail.rs`), which means deciding at every render how many dispatches to emit, converting a radius stated in *source* pixels into the render pixels this frame is being drawn at, and declaring the halo the tile scheduler needs. None of that is expressible as a uniform expression, and stretching the schema to cover it would produce a worse language than Rust aimed at one caller. placement: | First among the detail operations, because denoising is a repair and everything else in this stage is an enhancement: sharpening or adding clarity to a noisy frame amplifies the grain along with the detail, and no later pass can separate them again. Its position relative to the point operations is not this number's to decide — the whole detail stage runs after the fused pass, in linear light, before the output transform.