From 7506ddd37346f113231e51840130bebffb31f600 Mon Sep 17 00:00:00 2001 From: Jonathan Behrens Date: Sat, 23 Oct 2021 17:39:59 -0400 Subject: [PATCH] Add FindLsb / FindMsb --- src/back/glsl/mod.rs | 2 ++ src/back/hlsl/writer.rs | 2 ++ src/back/msl/writer.rs | 2 ++ src/back/spv/block.rs | 6 ++++++ src/front/glsl/builtins.rs | 5 ++++- src/front/spv/mod.rs | 2 ++ src/lib.rs | 2 ++ src/proc/mod.rs | 2 ++ src/proc/typifier.rs | 4 +++- src/valid/expression.rs | 2 +- 10 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/back/glsl/mod.rs b/src/back/glsl/mod.rs index e472c68268..94db467bd0 100644 --- a/src/back/glsl/mod.rs +++ b/src/back/glsl/mod.rs @@ -2443,6 +2443,8 @@ impl<'a, W: Write> Writer<'a, W> { Mf::ReverseBits => "bitfieldReverse", Mf::ExtractBits => "bitfieldExtract", Mf::InsertBits => "bitfieldInsert", + Mf::FindLsb => "findLSB", + Mf::FindMsb => "findMSB", // data packing Mf::Pack4x8snorm => "packSnorm4x8", Mf::Pack4x8unorm => "packUnorm4x8", diff --git a/src/back/hlsl/writer.rs b/src/back/hlsl/writer.rs index ce51a48236..94901c238c 100644 --- a/src/back/hlsl/writer.rs +++ b/src/back/hlsl/writer.rs @@ -1881,6 +1881,8 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { // bits Mf::CountOneBits => Function::Regular("countbits"), Mf::ReverseBits => Function::Regular("reversebits"), + Mf::FindLsb => Function::Regular("firstbit_lo"), + Mf::FindMsb => Function::Regular("firstbit_hi"), _ => return Err(Error::Unimplemented(format!("write_expr_math {:?}", fun))), }; diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index e35bee19b8..189baddb9c 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -1184,6 +1184,8 @@ impl Writer { Mf::ReverseBits => "reverse_bits", Mf::ExtractBits => "extract_bits", Mf::InsertBits => "insert_bits", + Mf::FindLsb => return Err(Error::UnsupportedCall(format!("{:?}", fun))), + Mf::FindMsb => return Err(Error::UnsupportedCall(format!("{:?}", fun))), // data packing Mf::Pack4x8snorm => "pack_float_to_unorm4x8", Mf::Pack4x8unorm => "pack_float_to_snorm4x8", diff --git a/src/back/spv/block.rs b/src/back/spv/block.rs index b65a58bb2d..b709595f1a 100644 --- a/src/back/spv/block.rs +++ b/src/back/spv/block.rs @@ -633,6 +633,12 @@ impl<'w> BlockContext<'w> { arg2_id, arg3_id, )), + Mf::FindLsb => MathOp::Ext(spirv::GLOp::FindILsb), + Mf::FindMsb => MathOp::Ext(match arg_scalar_kind { + Some(crate::ScalarKind::Uint) => spirv::GLOp::FindUMsb, + Some(crate::ScalarKind::Sint) => spirv::GLOp::FindSMsb, + other => unimplemented!("Unexpected findMSB({:?})", other), + }), Mf::Pack4x8unorm => MathOp::Ext(spirv::GLOp::PackUnorm4x8), Mf::Pack4x8snorm => MathOp::Ext(spirv::GLOp::PackSnorm4x8), Mf::Pack2x16float => MathOp::Ext(spirv::GLOp::PackHalf2x16), diff --git a/src/front/glsl/builtins.rs b/src/front/glsl/builtins.rs index ed220bc98b..21c9bd05a2 100644 --- a/src/front/glsl/builtins.rs +++ b/src/front/glsl/builtins.rs @@ -630,12 +630,15 @@ pub fn inject_builtin(declaration: &mut FunctionDeclaration, module: &mut Module )) } } - "bitCount" | "bitfieldReverse" | "bitfieldExtract" | "bitfieldInsert" => { + "bitCount" | "bitfieldReverse" | "bitfieldExtract" | "bitfieldInsert" | "findLSB" + | "findMSB" => { let fun = match name { "bitCount" => MathFunction::CountOneBits, "bitfieldReverse" => MathFunction::ReverseBits, "bitfieldExtract" => MathFunction::ExtractBits, "bitfieldInsert" => MathFunction::InsertBits, + "findLSB" => MathFunction::FindLsb, + "findMSB" => MathFunction::FindMsb, _ => unreachable!(), }; diff --git a/src/front/spv/mod.rs b/src/front/spv/mod.rs index 9ee0397f10..6ab05c5d67 100644 --- a/src/front/spv/mod.rs +++ b/src/front/spv/mod.rs @@ -2591,6 +2591,8 @@ impl> Parser { Glo::UnpackHalf2x16 => Mf::Unpack2x16float, Glo::UnpackUnorm2x16 => Mf::Unpack2x16unorm, Glo::UnpackSnorm2x16 => Mf::Unpack2x16snorm, + Glo::FindILsb => Mf::FindLsb, + Glo::FindUMsb | Glo::FindSMsb => Mf::FindMsb, _ => return Err(Error::UnsupportedExtInst(inst_id)), }; diff --git a/src/lib.rs b/src/lib.rs index 99b77b267d..0df4ff98dc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -938,6 +938,8 @@ pub enum MathFunction { ReverseBits, ExtractBits, InsertBits, + FindLsb, + FindMsb, // data packing Pack4x8snorm, Pack4x8unorm, diff --git a/src/proc/mod.rs b/src/proc/mod.rs index c9a66585c5..d94ef38d2f 100644 --- a/src/proc/mod.rs +++ b/src/proc/mod.rs @@ -247,6 +247,8 @@ impl super::MathFunction { Self::ReverseBits => 1, Self::ExtractBits => 3, Self::InsertBits => 4, + Self::FindLsb => 1, + Self::FindMsb => 1, // data packing Self::Pack4x8snorm => 1, Self::Pack4x8unorm => 1, diff --git a/src/proc/typifier.rs b/src/proc/typifier.rs index e1d2bd6b8d..e9d33f386c 100644 --- a/src/proc/typifier.rs +++ b/src/proc/typifier.rs @@ -784,7 +784,9 @@ impl<'a> ResolveContext<'a> { Mf::CountOneBits | Mf::ReverseBits | Mf::ExtractBits | - Mf::InsertBits => res_arg.clone(), + Mf::InsertBits | + Mf::FindLsb | + Mf::FindMsb => res_arg.clone(), // data packing Mf::Pack4x8snorm | Mf::Pack4x8unorm | diff --git a/src/valid/expression.rs b/src/valid/expression.rs index a9dab24cd6..25571ee97d 100644 --- a/src/valid/expression.rs +++ b/src/valid/expression.rs @@ -1194,7 +1194,7 @@ impl super::Validator { _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } - Mf::CountOneBits | Mf::ReverseBits => { + Mf::CountOneBits | Mf::ReverseBits | Mf::FindLsb | Mf::FindMsb => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); }