[ir][spirv-writer] Handle faceForward builtin
Bug: tint:1906
Change-Id: Idb07f25a49897a8b6ba0d3a9e3c09485cd677af4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/142366
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/writer/builtin_test.cc b/src/tint/lang/spirv/writer/builtin_test.cc
index 46f1b73..a398cf8 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -1000,6 +1000,38 @@
EXPECT_INST("%result = OpBitFieldInsert %v2uint %arg %newbits %offset %count");
}
+TEST_F(SpirvWriterTest, Builtin_FaceForward_F32) {
+ auto* arg1 = b.FunctionParam("arg1", ty.vec3<f32>());
+ auto* arg2 = b.FunctionParam("arg2", ty.vec3<f32>());
+ auto* arg3 = b.FunctionParam("arg3", ty.vec3<f32>());
+ auto* func = b.Function("foo", ty.vec3<f32>());
+ func->SetParams({arg1, arg2, arg3});
+ b.With(func->Block(), [&] {
+ auto* result = b.Call(ty.vec3<f32>(), builtin::Function::kFaceForward, arg1, arg2, arg3);
+ b.Return(func, result);
+ mod.SetName(result, "result");
+ });
+
+ ASSERT_TRUE(Generate()) << Error() << output_;
+ EXPECT_INST("%result = OpExtInst %v3float %10 FaceForward %arg1 %arg2 %arg3");
+}
+
+TEST_F(SpirvWriterTest, Builtin_FaceForward_F16) {
+ auto* arg1 = b.FunctionParam("arg1", ty.vec4<f16>());
+ auto* arg2 = b.FunctionParam("arg2", ty.vec4<f16>());
+ auto* arg3 = b.FunctionParam("arg3", ty.vec4<f16>());
+ auto* func = b.Function("foo", ty.vec4<f16>());
+ func->SetParams({arg1, arg2, arg3});
+ b.With(func->Block(), [&] {
+ auto* result = b.Call(ty.vec4<f16>(), builtin::Function::kFaceForward, arg1, arg2, arg3);
+ b.Return(func, result);
+ mod.SetName(result, "result");
+ });
+
+ ASSERT_TRUE(Generate()) << Error() << output_;
+ EXPECT_INST("%result = OpExtInst %v4half %10 FaceForward %arg1 %arg2 %arg3");
+}
+
TEST_F(SpirvWriterTest, Builtin_Mix_VectorOperands_ScalarFactor) {
auto* arg1 = b.FunctionParam("arg1", ty.vec4<f32>());
auto* arg2 = b.FunctionParam("arg2", ty.vec4<f32>());
diff --git a/src/tint/lang/spirv/writer/writer.cc b/src/tint/lang/spirv/writer/writer.cc
index b8db01b..90c338c 100644
--- a/src/tint/lang/spirv/writer/writer.cc
+++ b/src/tint/lang/spirv/writer/writer.cc
@@ -1238,6 +1238,9 @@
op = result_ty->is_signed_integer_scalar_or_vector() ? spv::Op::OpBitFieldSExtract
: spv::Op::OpBitFieldUExtract;
break;
+ case builtin::Function::kFaceForward:
+ glsl_ext_inst(GLSLstd450FaceForward);
+ break;
case builtin::Function::kFloor:
glsl_ext_inst(GLSLstd450Floor);
break;