From 94bd97c0fb2f7bb91e09127add14cd7e6670c070 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Sat, 13 Feb 2021 00:14:46 -0500 Subject: [PATCH] [wgsl] early depth test attribute --- src/front/wgsl/conv.rs | 10 ++++++++++ src/front/wgsl/mod.rs | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/front/wgsl/conv.rs b/src/front/wgsl/conv.rs index a9362f3e58..0aa14dbaa3 100644 --- a/src/front/wgsl/conv.rs +++ b/src/front/wgsl/conv.rs @@ -184,3 +184,13 @@ pub fn map_standard_fun(word: &str) -> Option { _ => return None, }) } + +pub fn map_conservative_depth(word: &str) -> Result> { + use crate::ConservativeDepth as Cd; + match word { + "greater_equal" => Ok(Cd::GreaterEqual), + "less_equal" => Ok(Cd::LessEqual), + "unchanged" => Ok(Cd::Unchanged), + _ => Err(Error::UnknownConservativeDepth(word)), + } +} diff --git a/src/front/wgsl/mod.rs b/src/front/wgsl/mod.rs index e2ed3c88ce..551c9da6cf 100644 --- a/src/front/wgsl/mod.rs +++ b/src/front/wgsl/mod.rs @@ -86,6 +86,8 @@ pub enum Error<'a> { UnknownFunction(&'a str), #[error("unknown storage format: `{0}`")] UnknownStorageFormat(&'a str), + #[error("unknown conservative depth: `{0}`")] + UnknownConservativeDepth(&'a str), #[error("array stride must not be 0")] ZeroStride, #[error("not a composite type: {0:?}")] @@ -1932,6 +1934,7 @@ impl Parser { let mut stage = None; let mut is_block = false; let mut workgroup_size = [0u32; 3]; + let mut early_depth_test = None; if lexer.skip(Token::DoubleParen('[')) { let (mut bind_index, mut bind_group) = (None, None); @@ -1994,6 +1997,16 @@ impl Parser { } } } + "early_depth_test" => { + let conservative = if lexer.skip(Token::Paren('(')) { + let value = conv::map_conservative_depth(lexer.next_ident()?)?; + lexer.expect(Token::Paren(')'))?; + Some(value) + } else { + None + }; + early_depth_test = Some(crate::EarlyDepthTest { conservative }); + } word => return Err(Error::UnknownDecoration(word)), } match lexer.next() { @@ -2103,7 +2116,7 @@ impl Parser { .insert( (stage, name.to_string()), crate::EntryPoint { - early_depth_test: None, + early_depth_test, workgroup_size, function, },