ailloli_ui_render_wgpu/
backdrop_blur.rs

1//! backdrop filter: backdrop blur (distinct from content `run_effect_chain`).
2
3use crate::effect_chain::EffectPipelines;
4
5/// Separable blur on a captured backdrop texture (in-place on `view`).
6///
7/// A nonpositive or NaN radius is a no-op. Positive radii execute the same
8/// horizontal-then-vertical chain used for isolated content; `width` and
9/// `height` are physical pixels and should match `view`.
10///
11/// # Examples
12///
13/// ```no_run
14/// use ailloli_ui_render_wgpu::{backdrop_blur::run_backdrop_blur,
15///     effect_chain::EffectPipelines};
16/// fn blur(device: &wgpu::Device, encoder: &mut wgpu::CommandEncoder,
17///     pipelines: &EffectPipelines, view: &wgpu::TextureView) {
18///     run_backdrop_blur(device, encoder, pipelines, wgpu::TextureFormat::Rgba8Unorm,
19///         view, 64, 64, 8.0, 1);
20/// }
21/// ```
22#[allow(clippy::too_many_arguments)]
23pub fn run_backdrop_blur(
24    device: &wgpu::Device,
25    encoder: &mut wgpu::CommandEncoder,
26    pipelines: &EffectPipelines,
27    format: wgpu::TextureFormat,
28    view: &wgpu::TextureView,
29    width: u32,
30    height: u32,
31    radius_px: f32,
32    pass_id: u16,
33) {
34    if radius_px <= 0.0 {
35        return;
36    }
37    let chain = crate::isolated_plan::IsolatedEffectChain {
38        effects: vec![crate::isolated_plan::IsolatedEffect::Blur { radius_px }],
39    };
40    crate::effect_chain::run_effect_chain(
41        device, encoder, pipelines, format, view, width, height, &chain, pass_id,
42    );
43}