From a718992acbcc344bcc4cd7d6722effc230535ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Mon, 19 Oct 2020 14:40:30 +0100 Subject: [PATCH] Added new external functions to the glsl backend to make it on par with the typifier (#240) --- README.md | 2 +- src/back/glsl.rs | 35 ++++++++++++++--------------------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index d0672f6362..e09db9182a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ SPIR-V (binary) | :construction: | | WGSL | | | Metal | :construction: | | HLSL | | | -GLSL | | | +GLSL | :construction: | | AIR | | | DXIR | | | DXIL | | | diff --git a/src/back/glsl.rs b/src/back/glsl.rs index 3884282a5e..c4cb2c340b 100644 --- a/src/back/glsl.rs +++ b/src/back/glsl.rs @@ -1245,17 +1245,22 @@ fn write_expression<'a, 'b>( origin: crate::FunctionOrigin::External(ref name), ref arguments, } => match name.as_str() { - "cos" | "normalize" | "sin" => { + "cos" | "normalize" | "sin" | "length" | "abs" | "floor" | "inverse" => { let expr = write_expression(&builder.expressions[arguments[0]], module, builder)?; Cow::Owned(format!("{}({})", name, expr)) } - "fclamp" => { - let val = write_expression(&builder.expressions[arguments[0]], module, builder)?; - let min = write_expression(&builder.expressions[arguments[1]], module, builder)?; - let max = write_expression(&builder.expressions[arguments[2]], module, builder)?; + "fclamp" | "clamp" | "mix" | "smoothstep" => { + let x = write_expression(&builder.expressions[arguments[0]], module, builder)?; + let y = write_expression(&builder.expressions[arguments[1]], module, builder)?; + let a = write_expression(&builder.expressions[arguments[2]], module, builder)?; - Cow::Owned(format!("clamp({}, {}, {})", val, min, max)) + let name = match name.as_str() { + "fclamp" => "clamp", + name => name, + }; + + Cow::Owned(format!("{}({}, {}, {})", name, x, y, a)) } "atan2" => { let x = write_expression(&builder.expressions[arguments[0]], module, builder)?; @@ -1263,23 +1268,11 @@ fn write_expression<'a, 'b>( Cow::Owned(format!("atan({}, {})", y, x)) } - "distance" => { - let p0 = write_expression(&builder.expressions[arguments[0]], module, builder)?; - let p1 = write_expression(&builder.expressions[arguments[1]], module, builder)?; - - Cow::Owned(format!("distance({}, {})", p0, p1)) - } - "length" => { + "distance" | "dot" | "min" | "max" | "reflect" | "pow" | "step" | "cross" => { let x = write_expression(&builder.expressions[arguments[0]], module, builder)?; + let y = write_expression(&builder.expressions[arguments[1]], module, builder)?; - Cow::Owned(format!("length({})", x)) - } - "mix" => { - let x = write_expression(&builder.expressions[arguments[0]], module, builder)?; - let y = write_expression(&builder.expressions[arguments[0]], module, builder)?; - let a = write_expression(&builder.expressions[arguments[0]], module, builder)?; - - Cow::Owned(format!("mix({}, {}, {})", x, y, a)) + Cow::Owned(format!("{}({}, {})", name, x, y)) } other => { return Err(Error::Custom(format!(