[ir][spirv-writer] Handle fwidth* builtins
These map directly to SPIR-V instruction, but we need to add the
DerivativeControl capability for the `fine` and `coarse` variants.
Also remove the capability from the regular dpdx and dpdy instructions
which don't need it.
Bug: tint:1906
Change-Id: Iad71dad2f2f824cb59bbd2cd2c5f47148344591d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/142029
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/writer/generator_impl_ir.cc b/src/tint/lang/spirv/writer/generator_impl_ir.cc
index a1f7ace..2d7942b 100644
--- a/src/tint/lang/spirv/writer/generator_impl_ir.cc
+++ b/src/tint/lang/spirv/writer/generator_impl_ir.cc
@@ -1208,7 +1208,6 @@
glsl_ext_inst(GLSLstd450Distance);
break;
case builtin::Function::kDpdx:
- module_.PushCapability(SpvCapabilityDerivativeControl);
op = spv::Op::OpDPdx;
break;
case builtin::Function::kDpdxCoarse:
@@ -1220,7 +1219,6 @@
op = spv::Op::OpDPdxFine;
break;
case builtin::Function::kDpdy:
- module_.PushCapability(SpvCapabilityDerivativeControl);
op = spv::Op::OpDPdy;
break;
case builtin::Function::kDpdyCoarse:
@@ -1253,6 +1251,17 @@
case builtin::Function::kFrexp:
glsl_ext_inst(GLSLstd450FrexpStruct);
break;
+ case builtin::Function::kFwidth:
+ op = spv::Op::OpFwidth;
+ break;
+ case builtin::Function::kFwidthCoarse:
+ module_.PushCapability(SpvCapabilityDerivativeControl);
+ op = spv::Op::OpFwidthCoarse;
+ break;
+ case builtin::Function::kFwidthFine:
+ module_.PushCapability(SpvCapabilityDerivativeControl);
+ op = spv::Op::OpFwidthFine;
+ break;
case builtin::Function::kInsertBits:
op = spv::Op::OpBitFieldInsert;
break;
diff --git a/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc b/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc
index 7880ee1..561dd2a 100644
--- a/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc
+++ b/src/tint/lang/spirv/writer/generator_impl_ir_builtin_test.cc
@@ -98,6 +98,9 @@
BuiltinTestCase{kF16, builtin::Function::kFloor, "Floor"},
BuiltinTestCase{kF32, builtin::Function::kFract, "Fract"},
BuiltinTestCase{kF16, builtin::Function::kFract, "Fract"},
+ BuiltinTestCase{kF32, builtin::Function::kFwidth, "OpFwidth"},
+ BuiltinTestCase{kF32, builtin::Function::kFwidthCoarse, "OpFwidthCoarse"},
+ BuiltinTestCase{kF32, builtin::Function::kFwidthFine, "OpFwidthFine"},
BuiltinTestCase{kF32, builtin::Function::kInverseSqrt, "InverseSqrt"},
BuiltinTestCase{kF16, builtin::Function::kInverseSqrt, "InverseSqrt"},
BuiltinTestCase{kF32, builtin::Function::kLog, "Log"},