From 4fb82bd9554d1aa4d9eb4d8a17723f62bbc5457e Mon Sep 17 00:00:00 2001 From: Lain-dono Date: Mon, 15 Mar 2021 02:39:36 +0300 Subject: [PATCH] [spv-out] implement derivatives --- src/back/spv/instructions.rs | 24 ++++++++++++++++++++++++ src/back/spv/writer.rs | 12 ++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/back/spv/instructions.rs b/src/back/spv/instructions.rs index f8366b96c5..b1033c8023 100644 --- a/src/back/spv/instructions.rs +++ b/src/back/spv/instructions.rs @@ -683,6 +683,30 @@ impl super::Instruction { // Derivative Instructions // + pub(super) fn derive_x(result_type_id: Word, id: Word, expr_id: Word) -> Self { + let mut instruction = Self::new(Op::DPdx); + instruction.set_type(result_type_id); + instruction.set_result(id); + instruction.add_operand(expr_id); + instruction + } + + pub(super) fn derive_y(result_type_id: Word, id: Word, expr_id: Word) -> Self { + let mut instruction = Self::new(Op::DPdy); + instruction.set_type(result_type_id); + instruction.set_result(id); + instruction.add_operand(expr_id); + instruction + } + + pub(super) fn derive_width(result_type_id: Word, id: Word, expr_id: Word) -> Self { + let mut instruction = Self::new(Op::Fwidth); + instruction.set_type(result_type_id); + instruction.set_result(id); + instruction.add_operand(expr_id); + instruction + } + // // Control-Flow Instructions // diff --git a/src/back/spv/writer.rs b/src/back/spv/writer.rs index 59fe3b5cdb..db143edabb 100644 --- a/src/back/spv/writer.rs +++ b/src/back/spv/writer.rs @@ -1901,6 +1901,18 @@ impl Writer { block.body.push(instruction); id } + crate::Expression::Derivative { axis, expr } => { + use crate::DerivativeAxis; + + let id = self.generate_id(); + let expr_id = self.cached[expr]; + block.body.push(match axis { + DerivativeAxis::X => Instruction::derive_x(result_type_id, id, expr_id), + DerivativeAxis::Y => Instruction::derive_y(result_type_id, id, expr_id), + DerivativeAxis::Width => Instruction::derive_width(result_type_id, id, expr_id), + }); + id + } ref other => { log::error!("unimplemented {:?}", other); return Err(Error::FeatureNotImplemented("expression"));