[ir][spirv-writer] Handle refract builtin
Bug: tint:1906
Change-Id: Id026baea4d83ec8db2c1cacc6bbbbe73486b5954
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/142365
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 cc6a364..46f1b73 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -1035,6 +1035,40 @@
EXPECT_INST("%result = OpExtInst %v4float %10 FMix %arg1 %arg2 %factor");
}
+TEST_F(SpirvWriterTest, Builtin_Refract_F32) {
+ auto* arg1 = b.FunctionParam("arg1", ty.vec4<f32>());
+ auto* arg2 = b.FunctionParam("arg2", ty.vec4<f32>());
+ auto* i = b.FunctionParam("i", ty.f32());
+ auto* func = b.Function("foo", ty.vec4<f32>());
+ func->SetParams({arg1, arg2, i});
+
+ b.With(func->Block(), [&] {
+ auto* result = b.Call(ty.vec4<f32>(), builtin::Function::kRefract, arg1, arg2, i);
+ b.Return(func, result);
+ mod.SetName(result, "result");
+ });
+
+ ASSERT_TRUE(Generate()) << Error() << output_;
+ EXPECT_INST("%result = OpExtInst %v4float %10 Refract %arg1 %arg2 %i");
+}
+
+TEST_F(SpirvWriterTest, Builtin_Refract_F16) {
+ auto* arg1 = b.FunctionParam("arg1", ty.vec4<f16>());
+ auto* arg2 = b.FunctionParam("arg2", ty.vec4<f16>());
+ auto* i = b.FunctionParam("i", ty.f16());
+ auto* func = b.Function("foo", ty.vec4<f16>());
+ func->SetParams({arg1, arg2, i});
+
+ b.With(func->Block(), [&] {
+ auto* result = b.Call(ty.vec4<f16>(), builtin::Function::kRefract, arg1, arg2, i);
+ b.Return(func, result);
+ mod.SetName(result, "result");
+ });
+
+ ASSERT_TRUE(Generate()) << Error() << output_;
+ EXPECT_INST("%result = OpExtInst %v4half %10 Refract %arg1 %arg2 %i");
+}
+
TEST_F(SpirvWriterTest, Builtin_Select_ScalarCondition_ScalarOperands) {
auto* argf = b.FunctionParam("argf", ty.i32());
auto* argt = b.FunctionParam("argt", ty.i32());
diff --git a/src/tint/lang/spirv/writer/writer.cc b/src/tint/lang/spirv/writer/writer.cc
index b6961f1..b8db01b 100644
--- a/src/tint/lang/spirv/writer/writer.cc
+++ b/src/tint/lang/spirv/writer/writer.cc
@@ -1333,6 +1333,9 @@
case builtin::Function::kReflect:
glsl_ext_inst(GLSLstd450Reflect);
break;
+ case builtin::Function::kRefract:
+ glsl_ext_inst(GLSLstd450Refract);
+ break;
case builtin::Function::kReverseBits:
op = spv::Op::OpBitReverse;
break;