Skip to content

Commit 250c64a

Browse files
geieredgarProfLander
authored andcommitted
Only execute #define if current scope is accepting lines (bevyengine#7798)
# Objective While working on bevyengine#7784, I noticed that a `#define VAR` in a `.wgsl` file is always effective, even if it its scope is not accepting lines. Example: ```c #define A #ifndef A #define B #endif ``` Currently, `B` will be defined although it shouldn't. This PR fixes that. ## Solution Move the branch responsible for `#define` lines into the last else branch, which is only evaluated if the current scope is accepting lines.
1 parent 49f74af commit 250c64a

File tree

1 file changed

+48
-20
lines changed
  • crates/bevy_render/src/render_resource

1 file changed

+48
-20
lines changed

crates/bevy_render/src/render_resource/shader.rs

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -556,26 +556,6 @@ impl ShaderProcessor {
556556
let current_valid = scopes.last().unwrap().is_accepting_lines();
557557

558558
scopes.push(Scope::new(current_valid && new_scope));
559-
} else if let Some(cap) = self.define_regex.captures(line) {
560-
let def = cap.get(1).unwrap();
561-
let name = def.as_str().to_string();
562-
563-
if let Some(val) = cap.get(2) {
564-
if let Ok(val) = val.as_str().parse::<u32>() {
565-
shader_defs_unique.insert(name.clone(), ShaderDefVal::UInt(name, val));
566-
} else if let Ok(val) = val.as_str().parse::<i32>() {
567-
shader_defs_unique.insert(name.clone(), ShaderDefVal::Int(name, val));
568-
} else if let Ok(val) = val.as_str().parse::<bool>() {
569-
shader_defs_unique.insert(name.clone(), ShaderDefVal::Bool(name, val));
570-
} else {
571-
return Err(ProcessShaderError::InvalidShaderDefDefinitionValue {
572-
shader_def_name: name,
573-
value: val.as_str().to_string(),
574-
});
575-
}
576-
} else {
577-
shader_defs_unique.insert(name.clone(), ShaderDefVal::Bool(name, true));
578-
}
579559
} else if let Some(cap) = self.else_ifdef_regex.captures(line) {
580560
// When should we accept the code in an
581561
//
@@ -680,6 +660,26 @@ impl ShaderProcessor {
680660
.is_match(line)
681661
{
682662
// ignore import path lines
663+
} else if let Some(cap) = self.define_regex.captures(line) {
664+
let def = cap.get(1).unwrap();
665+
let name = def.as_str().to_string();
666+
667+
if let Some(val) = cap.get(2) {
668+
if let Ok(val) = val.as_str().parse::<u32>() {
669+
shader_defs_unique.insert(name.clone(), ShaderDefVal::UInt(name, val));
670+
} else if let Ok(val) = val.as_str().parse::<i32>() {
671+
shader_defs_unique.insert(name.clone(), ShaderDefVal::Int(name, val));
672+
} else if let Ok(val) = val.as_str().parse::<bool>() {
673+
shader_defs_unique.insert(name.clone(), ShaderDefVal::Bool(name, val));
674+
} else {
675+
return Err(ProcessShaderError::InvalidShaderDefDefinitionValue {
676+
shader_def_name: name,
677+
value: val.as_str().to_string(),
678+
});
679+
}
680+
} else {
681+
shader_defs_unique.insert(name.clone(), ShaderDefVal::Bool(name, true));
682+
}
683683
} else {
684684
let mut line_with_defs = line.to_string();
685685
for capture in self.def_regex.captures_iter(line) {
@@ -2503,6 +2503,34 @@ defined at end
25032503
assert_eq!(result.get_wgsl_source().unwrap(), EXPECTED);
25042504
}
25052505

2506+
#[test]
2507+
fn process_shader_define_only_in_accepting_scopes() {
2508+
#[rustfmt::skip]
2509+
const WGSL: &str = r"
2510+
#define GUARD
2511+
#ifndef GUARD
2512+
#define GUARDED
2513+
#endif
2514+
#ifdef GUARDED
2515+
This should not be part of the result
2516+
#endif
2517+
";
2518+
2519+
#[rustfmt::skip]
2520+
const EXPECTED: &str = r"
2521+
";
2522+
let processor = ShaderProcessor::default();
2523+
let result = processor
2524+
.process(
2525+
&Shader::from_wgsl(WGSL),
2526+
&[],
2527+
&HashMap::default(),
2528+
&HashMap::default(),
2529+
)
2530+
.unwrap();
2531+
assert_eq!(result.get_wgsl_source().unwrap(), EXPECTED);
2532+
}
2533+
25062534
#[test]
25072535
fn process_shader_define_in_shader_with_value() {
25082536
#[rustfmt::skip]

0 commit comments

Comments
 (0)