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}