Skip to content

Commit

Permalink
include ifops in effective defs (#39)
Browse files Browse the repository at this point in the history
include `#if` directives in effective defs, plus test

fixes #38
  • Loading branch information
robtfm authored Aug 26, 2023
1 parent 07727b2 commit 3e7cb9c
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/compose/preprocess.rs
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,10 @@ impl Preprocessor {
let def = cap.get(2).unwrap();
effective_defs.insert(def.as_str().to_owned());
}
if let Some(cap) = self.ifop_regex.captures(&line) {
let def = cap.get(2).unwrap();
effective_defs.insert(def.as_str().to_owned());
}
}

effective_defs
Expand Down
80 changes: 80 additions & 0 deletions src/compose/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1083,6 +1083,86 @@ mod test {
output_eq!(wgsl, "tests/expected/conditional_import_b.txt");
}

#[cfg(feature = "test_shader")]
#[test]
fn effective_defs() {
let mut composer = Composer::default();

composer
.add_composable_module(ComposableModuleDescriptor {
source: include_str!("tests/effective_defs/mod.wgsl"),
file_path: "tests/effective_defs/mod.wgsl",
..Default::default()
})
.unwrap();

for (defs, expected) in [
(
vec![("DEF_THREE".to_owned(), ShaderDefValue::Bool(false))],
0.0,
),
(
vec![
("DEF_ONE".to_owned(), ShaderDefValue::Bool(true)),
("DEF_THREE".to_owned(), ShaderDefValue::Bool(false)),
],
1.0,
),
(
vec![
("DEF_TWO".to_owned(), ShaderDefValue::Bool(true)),
("DEF_THREE".to_owned(), ShaderDefValue::Bool(false)),
],
2.0,
),
(
vec![
("DEF_ONE".to_owned(), ShaderDefValue::Bool(true)),
("DEF_TWO".to_owned(), ShaderDefValue::Bool(true)),
("DEF_THREE".to_owned(), ShaderDefValue::Bool(false)),
],
3.0,
),
(
vec![("DEF_THREE".to_owned(), ShaderDefValue::Bool(true))],
4.0,
),
(
vec![
("DEF_ONE".to_owned(), ShaderDefValue::Bool(true)),
("DEF_THREE".to_owned(), ShaderDefValue::Bool(true)),
],
5.0,
),
(
vec![
("DEF_TWO".to_owned(), ShaderDefValue::Bool(true)),
("DEF_THREE".to_owned(), ShaderDefValue::Bool(true)),
],
6.0,
),
(
vec![
("DEF_ONE".to_owned(), ShaderDefValue::Bool(true)),
("DEF_TWO".to_owned(), ShaderDefValue::Bool(true)),
("DEF_THREE".to_owned(), ShaderDefValue::Bool(true)),
],
7.0,
),
] {
composer
.add_composable_module(ComposableModuleDescriptor {
source: include_str!("tests/effective_defs/top.wgsl"),
file_path: "tests/effective_defs/top.wgsl",
shader_defs: HashMap::from_iter(defs),
..Default::default()
})
.unwrap();

assert_eq!(test_shader(&mut composer), expected);
}
}

// actually run a shader and extract the result
// needs the composer to contain a module called "test_module", with a function called "entry_point" returning an f32.
fn test_shader(composer: &mut Composer) -> f32 {
Expand Down
19 changes: 19 additions & 0 deletions src/compose/tests/effective_defs/mod.wgsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#define_import_path mod

#ifdef DEF_ONE
const a: u32 = 1u;
#else
const a: u32 = 0u;
#endif

#ifndef DEF_TWO
const b: u32 = 0u;
#else
const b: u32 = 2u;
#endif

#if DEF_THREE == true
const c: u32 = 4u;
#else
const c: u32 = 0u;
#endif
6 changes: 6 additions & 0 deletions src/compose/tests/effective_defs/top.wgsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#define_import_path test_module
#import mod a, b, c

fn entry_point() -> f32 {
return f32(a + b + c);
}

0 comments on commit 3e7cb9c

Please sign in to comment.