From 057fa336a8ae3e2006717460307fd6f8a7026bcb Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Mon, 29 Mar 2021 00:43:46 -0400 Subject: [PATCH] [spv-in] derivative ops --- src/front/spv/mod.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/front/spv/mod.rs b/src/front/spv/mod.rs index 3242558131..8d7442b316 100644 --- a/src/front/spv/mod.rs +++ b/src/front/spv/mod.rs @@ -580,6 +580,31 @@ impl> Parser { Ok(()) } + fn parse_expr_derivative( + &mut self, + expressions: &mut Arena, + axis: crate::DerivativeAxis, + ) -> Result<(), Error> { + let result_type_id = self.next()?; + let result_id = self.next()?; + let arg_id = self.next()?; + + let arg_lexp = self.lookup_expression.lookup(arg_id)?; + + let expr = crate::Expression::Derivative { + axis, + expr: arg_lexp.handle, + }; + self.lookup_expression.insert( + result_id, + LookupExpression { + handle: expressions.append(expr), + type_id: result_type_id, + }, + ); + Ok(()) + } + fn insert_composite( &self, root_expr: Handle, @@ -1654,6 +1679,15 @@ impl> Parser { continue_block_id, }); } + Op::DPdx | Op::DPdxFine | Op::DPdxCoarse => { + self.parse_expr_derivative(expressions, crate::DerivativeAxis::X)?; + } + Op::DPdy | Op::DPdyFine | Op::DPdyCoarse => { + self.parse_expr_derivative(expressions, crate::DerivativeAxis::Y)?; + } + Op::Fwidth | Op::FwidthFine | Op::FwidthCoarse => { + self.parse_expr_derivative(expressions, crate::DerivativeAxis::Width)?; + } _ => return Err(Error::UnsupportedInstruction(self.state, inst.op)), } };