Skip to content

Commit 7a47262

Browse files
committed
Fixup.
1 parent 8fcb601 commit 7a47262

4 files changed

Lines changed: 39 additions & 16 deletions

File tree

crates/processing_render/shaders/processing/filter.wesl

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ struct ProcessingFilter {
55
// Pass index (0-based) and total count.
66
pass_index: u32,
77
pass_count: u32,
8-
_pad: vec2<u32>,
98
}
109

1110
@group(0) @binding(0) var screen_texture: texture_2d<f32>;
1211
@group(0) @binding(1) var texture_sampler: sampler;
13-
@group(0) @binding(2) var<uniform> filter: ProcessingFilter;
12+
@group(0) @binding(2) var<uniform> params: ProcessingFilter;
1413

1514
struct FullscreenVertexOutput {
1615
@builtin(position) position: vec4<f32>,
@@ -21,7 +20,7 @@ fn sample(uv: vec2<f32>) -> vec4<f32> {
2120
return textureSample(screen_texture, texture_sampler, uv);
2221
}
2322

24-
fn resolution() -> vec2<f32> { return filter.resolution; }
25-
fn texel_size() -> vec2<f32> { return filter.texel_size; }
26-
fn pass_index() -> u32 { return filter.pass_index; }
27-
fn pass_count() -> u32 { return filter.pass_count; }
23+
fn resolution() -> vec2<f32> { return params.resolution; }
24+
fn texel_size() -> vec2<f32> { return params.texel_size; }
25+
fn pass_index() -> u32 { return params.pass_index; }
26+
fn pass_count() -> u32 { return params.pass_count; }

crates/processing_render/src/material/custom.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,12 @@ impl wesl::Resolver for ProcessingResolver<'_> {
120120

121121
match &path.origin {
122122
PathOrigin::Package(pkg) => {
123-
// self-referential package imports: within a package, imports to
124-
// the same package stack the name (e.g. "lygia/lygia/lygia/...").
125-
// collapse to the root package name before resolving.
126-
let root = pkg.split('/').next().unwrap();
123+
// wesl encodes a cross-package import as a synthetic "parent/child"
124+
// origin (e.g. importing processing from the entry module yields
125+
// "entry/processing"). The real package is the leaf.
126+
let leaf = pkg.rsplit('/').next().unwrap();
127127
let mut fixed = path.clone();
128-
fixed.origin = PathOrigin::Package(root.to_string());
128+
fixed.origin = PathOrigin::Package(leaf.to_string());
129129
self.pkg_resolver.resolve_source(&fixed)
130130
}
131131
_ => Err(wesl::ResolveError::ModuleNotFound(

crates/processing_render/src/render/filter.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@ use bevy::{
2222
},
2323
shader::Shader as ShaderAsset,
2424
};
25-
use bevy_naga_reflect::dynamic_shader::DynamicShader;
25+
use bevy_naga_reflect::{dynamic_shader::DynamicShader, reflect::ParameterCategory};
2626

2727
use crate::material::custom::{Shader, apply_reflect_field, find_param_containing_field};
2828
use processing_core::error::{ProcessingError, Result};
2929

30-
const INPUT_TEXTURE: &str = "screen_texture";
31-
const INPUT_SAMPLER: &str = "texture_sampler";
3230
const F_RESOLUTION: &str = "resolution";
3331
const F_TEXEL_SIZE: &str = "texel_size";
3432
const F_PASS_INDEX: &str = "pass_index";
@@ -343,14 +341,35 @@ fn run_pass(
343341
fill_system(&mut shader, F_PASS_COUNT, &passes);
344342
let has_pass_index = find_param_containing_field(&shader, F_PASS_INDEX).is_some();
345343

344+
// wesl mangles the imported `processing::filter` bindings, so the screen
345+
// texture and sampler are bound by their reflected (mangled) names, found by
346+
// category in group 0.
347+
let (input_texture, input_sampler) = {
348+
let reflection = shader.reflection();
349+
let mut texture = None;
350+
let mut sampler = None;
351+
for param in reflection.parameters().filter(|p| p.group() == 0) {
352+
match param.category() {
353+
ParameterCategory::Texture => texture = param.name().map(String::from),
354+
ParameterCategory::Sampler => sampler = param.name().map(String::from),
355+
_ => {}
356+
}
357+
}
358+
(texture, sampler)
359+
};
360+
346361
for pass in 0..passes {
347362
if has_pass_index {
348363
let _ = apply_reflect_field(&mut shader, F_PASS_INDEX, &pass);
349364
}
350365

351366
let post_process = view_target.post_process_write();
352-
shader.insert_texture_view(INPUT_TEXTURE, post_process.source.clone());
353-
shader.insert_sampler(INPUT_SAMPLER, filter_sampler.0.clone());
367+
if let Some(name) = &input_texture {
368+
shader.insert_texture_view(name, post_process.source.clone());
369+
}
370+
if let Some(name) = &input_sampler {
371+
shader.insert_sampler(name, filter_sampler.0.clone());
372+
}
354373

355374
let reflection = shader.reflection();
356375
let mut bind_groups = Vec::new();

examples/filter.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,17 @@ fn sketch() -> error::Result<()> {
3535
filter_set(threshold, "cutoff", ShaderValue::Float(0.5))?;
3636
let posterize = filter_posterize()?;
3737
filter_set(posterize, "levels", ShaderValue::UInt(4))?;
38+
let blur = filter_blur()?;
39+
filter_set(blur, "radius", ShaderValue::Float(4.0))?;
3840
let filters = [
3941
filter_invert()?,
4042
filter_gray()?,
4143
threshold,
4244
posterize,
4345
filter_opaque()?,
46+
filter_erode()?,
47+
filter_dilate()?,
48+
blur,
4449
];
4550

4651
let start = Instant::now();

0 commit comments

Comments
 (0)