From 86bb611905ce16c315f2de14bf2beff9cc603697 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Thu, 11 Feb 2021 15:25:20 -0500 Subject: [PATCH] [wgsl] support select() --- src/front/wgsl/conv.rs | 1 + src/front/wgsl/mod.rs | 13 +++++++++++++ src/front/wgsl/tests.rs | 18 +++++++++++++++--- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/front/wgsl/conv.rs b/src/front/wgsl/conv.rs index c159684849..a9362f3e58 100644 --- a/src/front/wgsl/conv.rs +++ b/src/front/wgsl/conv.rs @@ -99,6 +99,7 @@ pub fn get_scalar_type(word: &str) -> Option<(crate::ScalarKind, crate::Bytes)> "f32" => Some((crate::ScalarKind::Float, 4)), "i32" => Some((crate::ScalarKind::Sint, 4)), "u32" => Some((crate::ScalarKind::Uint, 4)), + "bool" => Some((crate::ScalarKind::Bool, 1)), _ => None, } } diff --git a/src/front/wgsl/mod.rs b/src/front/wgsl/mod.rs index 32123deece..38aaf4095b 100644 --- a/src/front/wgsl/mod.rs +++ b/src/front/wgsl/mod.rs @@ -443,6 +443,19 @@ impl Parser { arg1, arg2, }) + } else if name == "select" { + lexer.expect(Token::Paren('('))?; + let accept = self.parse_general_expression(lexer, ctx.reborrow())?; + lexer.expect(Token::Separator(','))?; + let reject = self.parse_general_expression(lexer, ctx.reborrow())?; + lexer.expect(Token::Separator(','))?; + let condition = self.parse_general_expression(lexer, ctx.reborrow())?; + lexer.expect(Token::Paren(')'))?; + Some(crate::Expression::Select { + condition, + accept, + reject, + }) } else { // texture sampling match name { diff --git a/src/front/wgsl/tests.rs b/src/front/wgsl/tests.rs index 72238dc1ae..c0408415e1 100644 --- a/src/front/wgsl/tests.rs +++ b/src/front/wgsl/tests.rs @@ -197,7 +197,19 @@ fn parse_texture_query() { #[test] fn parse_postfix() { - parse_str("fn foo() { const x: f32 = vec4(1.0, 2.0, 3.0, 4.0).xyz.rgbr.aaaa.wz.g; }") - .unwrap(); - parse_str("fn foo() { const x: f32 = fract(vec2(0.5, 1.0)).x; }").unwrap(); + parse_str( + "fn foo() { + const x: f32 = vec4(1.0, 2.0, 3.0, 4.0).xyz.rgbr.aaaa.wz.g; + const y: f32 = fract(vec2(0.5, x)).x; + }", + ) + .unwrap(); +} + +#[test] +fn parse_expressions() { + parse_str("fn foo() { + const x: f32 = select(0.0, 1.0, true); + const y: vec2 = select(vec2(1.0, 1.0), vec2(x, x), vec2(x < 0.5, x > 0.5)); + }").unwrap(); }