[tint] Polyfill vector clamp via scalarization
Some backend compilers (qq Adreno) have issues in the implementation
of NClamp for vectors with nan inputs.
Scalarization works around these issues and since NClamp is an
extended SPIRV instruction the polyfill is only in the spirv backend
of tint.
Bug:407109052
Change-Id: I9c766e895420a26cbc1d4d6a6ba9522e5a543077
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/240495
Reviewed-by: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp
index d1adc69..0815ee8 100644
--- a/src/dawn/native/Toggles.cpp
+++ b/src/dawn/native/Toggles.cpp
@@ -639,6 +639,9 @@
{Toggle::UseVulkanMemoryModel,
{"use_vulkan_memory_model", "Use the Vulkan Memory Model if available.",
"https://crbug.com/392606604", ToggleStage::Adapter}},
+ {Toggle::VulkanScalarizeClampBuiltin,
+ {"vulkan_scalarize_clamp_builtin", "Scalarize calls to the clamp builtin.",
+ "https://crbug.com/407109052", ToggleStage::Device}},
{Toggle::VulkanAddWorkToEmptyResolvePass,
{"vulkan_add_work_to_empty_resolve_pass",
"Adds a small amount of work to empty render passes which perform a resolve. This toggle is "
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index a761e87..ffd3695 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -151,6 +151,7 @@
D3D12RelaxMinSubgroupSizeTo8,
D3D12RelaxBufferTextureCopyPitchAndOffsetAlignment,
UseVulkanMemoryModel,
+ VulkanScalarizeClampBuiltin,
VulkanAddWorkToEmptyResolvePass,
// Unresolved issues.
diff --git a/src/dawn/native/vulkan/ShaderModuleVk.cpp b/src/dawn/native/vulkan/ShaderModuleVk.cpp
index 5e6634e..258567c 100644
--- a/src/dawn/native/vulkan/ShaderModuleVk.cpp
+++ b/src/dawn/native/vulkan/ShaderModuleVk.cpp
@@ -308,6 +308,8 @@
GetDevice()->IsToggleEnabled(Toggle::DisablePolyfillsOnIntegerDivisonAndModulo);
req.tintOptions.use_vulkan_memory_model =
GetDevice()->IsToggleEnabled(Toggle::UseVulkanMemoryModel);
+ req.tintOptions.scalarize_clamp_builtin =
+ GetDevice()->IsToggleEnabled(Toggle::VulkanScalarizeClampBuiltin);
// Pass matrices to user functions by pointer on Qualcomm devices to workaround a known bug.
// See crbug.com/tint/2045.
diff --git a/src/tint/lang/spirv/writer/common/options.h b/src/tint/lang/spirv/writer/common/options.h
index 164fde6..5baa8b6 100644
--- a/src/tint/lang/spirv/writer/common/options.h
+++ b/src/tint/lang/spirv/writer/common/options.h
@@ -198,6 +198,9 @@
/// Set to `true` if the Vulkan Memory Model should be used
bool use_vulkan_memory_model = false;
+ /// Set to `true` if the clamp builtin should be scalarized for vector operations
+ bool scalarize_clamp_builtin = false;
+
/// Offsets of the minDepth and maxDepth push constants.
std::optional<RangeOffsets> depth_range_offsets = std::nullopt;
@@ -220,6 +223,7 @@
polyfill_pack_unpack_4x8_norm,
disable_polyfill_integer_div_mod,
use_vulkan_memory_model,
+ scalarize_clamp_builtin,
depth_range_offsets);
};
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
index 662b8b9..ca2efd5 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
@@ -30,6 +30,7 @@
#include <utility>
#include "spirv/unified1/spirv.h"
+#include "src/tint/lang/core/builtin_fn.h"
#include "src/tint/lang/core/fluent_types.h"
#include "src/tint/lang/core/ir/builder.h"
#include "src/tint/lang/core/ir/module.h"
@@ -153,8 +154,7 @@
/// The IR module.
core::ir::Module& ir;
- /// If we should use the vulkan memory model
- bool use_vulkan_memory_model = false;
+ PolyfillConfig config;
/// The IR builder.
core::ir::Builder b{ir};
@@ -231,6 +231,12 @@
worklist.Push(builtin);
}
break;
+ case core::BuiltinFn::kClamp:
+ if (config.scalarize_clamp_builtin &&
+ builtin->Result()->Type()->Is<core::type::Vector>()) {
+ worklist.Push(builtin);
+ }
+ break;
default:
break;
}
@@ -269,6 +275,9 @@
case core::BuiltinFn::kSelect:
Select(builtin);
break;
+ case core::BuiltinFn::kClamp:
+ Clamp(builtin);
+ break;
case core::BuiltinFn::kSubgroupBroadcast:
SubgroupBroadcast(builtin);
break;
@@ -547,6 +556,34 @@
builtin->Destroy();
}
+ /// Handle a `clamp()` builtin when scalarization is required.
+ /// @param builtin the builtin call instruction
+ void Clamp(core::ir::CoreBuiltinCall* builtin) {
+ auto* e = builtin->Args()[0];
+ auto* vec = e->Type()->As<core::type::Vector>();
+ if (!vec) {
+ // Already is a scalar. No change required.
+ return;
+ }
+
+ b.InsertBefore(builtin, [&] {
+ auto* low = builtin->Args()[1];
+ auto* high = builtin->Args()[2];
+ auto* type = vec->DeepestElement();
+ Vector<core::ir::Value*, 4> args;
+ for (uint32_t i = 0; i < vec->Width(); i++) {
+ auto* access_e = b.Access(type, e, u32(i));
+ auto* access_low = b.Access(type, low, u32(i));
+ auto* access_high = b.Access(type, high, u32(i));
+ auto* scalar_call =
+ b.Call(type, core::BuiltinFn::kClamp, access_e, access_low, access_high);
+ args.Push(scalar_call->Result());
+ }
+ b.ConstructWithResult(builtin->DetachResult(), std::move(args));
+ });
+ builtin->Destroy();
+ }
+
/// ImageOperands represents the optional image operands for an image instruction.
struct ImageOperands {
/// Bias
@@ -579,7 +616,7 @@
args.Push(nullptr);
// Append the NonPrivateTexel flag to Read/Write storage textures when we load/store them.
- if (use_vulkan_memory_model) {
+ if (config.use_vulkan_memory_model) {
if (insertion_point->Func() == core::BuiltinFn::kTextureLoad ||
insertion_point->Func() == core::BuiltinFn::kTextureStore) {
if (auto* st = insertion_point->Args()[0]->Type()->As<spirv::type::Image>()) {
@@ -1238,13 +1275,13 @@
} // namespace
-Result<SuccessType> BuiltinPolyfill(core::ir::Module& ir, bool use_vulkan_memory_model) {
+Result<SuccessType> BuiltinPolyfill(core::ir::Module& ir, PolyfillConfig config) {
auto result = ValidateAndDumpIfNeeded(ir, "spirv.BuiltinPolyfill");
if (result != Success) {
return result.Failure();
}
- State{ir, use_vulkan_memory_model}.Process();
+ State{ir, config}.Process();
return Success;
}
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.h b/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
index 79459db..8cf90ae 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
@@ -38,13 +38,18 @@
namespace tint::spirv::writer::raise {
+struct PolyfillConfig {
+ bool use_vulkan_memory_model = false;
+ bool scalarize_clamp_builtin = false;
+};
+
/// BuiltinPolyfill is a transform that replaces calls to builtins with polyfills and calls to
/// SPIR-V backend intrinsic functions. It replaces core types with SPIR-V specific types at the
/// same time to produce valid IR (e.g. texture types to spirv.image).
/// @param module the module to transform
-/// @param use_vulkan_memory_model set `true` to use the vulkan memory model
+/// @param config the configuration used in the polyfill function
/// @returns success or failure
-Result<SuccessType> BuiltinPolyfill(core::ir::Module& module, bool use_vulkan_memory_model);
+Result<SuccessType> BuiltinPolyfill(core::ir::Module& module, PolyfillConfig config);
} // namespace tint::spirv::writer::raise
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
index 3137682..edf95e0 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
@@ -106,8 +106,8 @@
}
}
)";
-
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -177,7 +177,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -246,8 +247,8 @@
}
}
)";
-
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -293,7 +294,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -337,7 +339,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -381,7 +384,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -442,7 +446,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -486,7 +491,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -528,7 +534,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -572,7 +579,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -616,7 +624,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -660,7 +669,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -704,7 +714,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -748,7 +759,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -792,7 +804,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -836,7 +849,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -880,7 +894,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -915,7 +930,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -956,7 +972,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1005,7 +1022,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1040,7 +1058,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1075,7 +1094,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1111,7 +1131,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1147,7 +1168,172 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
+
+ EXPECT_EQ(expect, str());
+}
+
+TEST_F(SpirvWriter_BuiltinPolyfillTest, Clamp_VectorOperands_Scalarize) {
+ auto* x = b.FunctionParam("x", ty.vec2<f32>());
+ auto* low = b.FunctionParam("low", ty.vec2<f32>());
+ auto* high = b.FunctionParam("high", ty.vec2<f32>());
+ auto* func = b.Function("foo", ty.vec2<f32>());
+ func->SetParams({x, low, high});
+
+ b.Append(func->Block(), [&] {
+ auto* result = b.Call(ty.vec2<f32>(), core::BuiltinFn::kClamp, x, low, high);
+ b.Return(func, result);
+ });
+
+ auto* src = R"(
+%foo = func(%x:vec2<f32>, %low:vec2<f32>, %high:vec2<f32>):vec2<f32> {
+ $B1: {
+ %5:vec2<f32> = clamp %x, %low, %high
+ ret %5
+ }
+}
+)";
+ EXPECT_EQ(src, str());
+
+ auto* expect = R"(
+%foo = func(%x:vec2<f32>, %low:vec2<f32>, %high:vec2<f32>):vec2<f32> {
+ $B1: {
+ %5:f32 = access %x, 0u
+ %6:f32 = access %low, 0u
+ %7:f32 = access %high, 0u
+ %8:f32 = clamp %5, %6, %7
+ %9:f32 = access %x, 1u
+ %10:f32 = access %low, 1u
+ %11:f32 = access %high, 1u
+ %12:f32 = clamp %9, %10, %11
+ %13:vec2<f32> = construct %8, %12
+ ret %13
+ }
+}
+)";
+
+ PolyfillConfig config{.scalarize_clamp_builtin = true};
+ Run(BuiltinPolyfill, config);
+
+ EXPECT_EQ(expect, str());
+}
+
+TEST_F(SpirvWriter_BuiltinPolyfillTest, Clamp_VectorOperands_Scalarize_f16) {
+ auto* x = b.FunctionParam("x", ty.vec2<f16>());
+ auto* low = b.FunctionParam("low", ty.vec2<f16>());
+ auto* high = b.FunctionParam("high", ty.vec2<f16>());
+ auto* func = b.Function("foo", ty.vec2<f16>());
+ func->SetParams({x, low, high});
+
+ b.Append(func->Block(), [&] {
+ auto* result = b.Call(ty.vec2<f16>(), core::BuiltinFn::kClamp, x, low, high);
+ b.Return(func, result);
+ });
+
+ auto* src = R"(
+%foo = func(%x:vec2<f16>, %low:vec2<f16>, %high:vec2<f16>):vec2<f16> {
+ $B1: {
+ %5:vec2<f16> = clamp %x, %low, %high
+ ret %5
+ }
+}
+)";
+ EXPECT_EQ(src, str());
+
+ auto* expect = R"(
+%foo = func(%x:vec2<f16>, %low:vec2<f16>, %high:vec2<f16>):vec2<f16> {
+ $B1: {
+ %5:f16 = access %x, 0u
+ %6:f16 = access %low, 0u
+ %7:f16 = access %high, 0u
+ %8:f16 = clamp %5, %6, %7
+ %9:f16 = access %x, 1u
+ %10:f16 = access %low, 1u
+ %11:f16 = access %high, 1u
+ %12:f16 = clamp %9, %10, %11
+ %13:vec2<f16> = construct %8, %12
+ ret %13
+ }
+}
+)";
+
+ PolyfillConfig config{.scalarize_clamp_builtin = true};
+ Run(BuiltinPolyfill, config);
+
+ EXPECT_EQ(expect, str());
+}
+
+TEST_F(SpirvWriter_BuiltinPolyfillTest, Clamp_VectorOperands_Scalarize_AlreadyScalar) {
+ auto* x = b.FunctionParam("x", ty.f32());
+ auto* low = b.FunctionParam("low", ty.f32());
+ auto* high = b.FunctionParam("high", ty.f32());
+ auto* func = b.Function("foo", ty.f32());
+ func->SetParams({x, low, high});
+
+ b.Append(func->Block(), [&] {
+ auto* result = b.Call(ty.f32(), core::BuiltinFn::kClamp, x, low, high);
+ b.Return(func, result);
+ });
+
+ auto* src = R"(
+%foo = func(%x:f32, %low:f32, %high:f32):f32 {
+ $B1: {
+ %5:f32 = clamp %x, %low, %high
+ ret %5
+ }
+}
+)";
+ EXPECT_EQ(src, str());
+
+ auto* expect = R"(
+%foo = func(%x:f32, %low:f32, %high:f32):f32 {
+ $B1: {
+ %5:f32 = clamp %x, %low, %high
+ ret %5
+ }
+}
+)";
+
+ PolyfillConfig config{.scalarize_clamp_builtin = true};
+ Run(BuiltinPolyfill, config);
+
+ EXPECT_EQ(expect, str());
+}
+
+TEST_F(SpirvWriter_BuiltinPolyfillTest, Clamp_VectorOperands_DisabledScalarize) {
+ auto* x = b.FunctionParam("x", ty.vec2<f32>());
+ auto* low = b.FunctionParam("low", ty.vec2<f32>());
+ auto* high = b.FunctionParam("high", ty.vec2<f32>());
+ auto* func = b.Function("foo", ty.vec2<f32>());
+ func->SetParams({x, low, high});
+
+ b.Append(func->Block(), [&] {
+ auto* result = b.Call(ty.vec2<f32>(), core::BuiltinFn::kClamp, x, low, high);
+ b.Return(func, result);
+ });
+
+ auto* src = R"(
+%foo = func(%x:vec2<f32>, %low:vec2<f32>, %high:vec2<f32>):vec2<f32> {
+ $B1: {
+ %5:vec2<f32> = clamp %x, %low, %high
+ ret %5
+ }
+}
+)";
+ EXPECT_EQ(src, str());
+
+ auto* expect = R"(
+%foo = func(%x:vec2<f32>, %low:vec2<f32>, %high:vec2<f32>):vec2<f32> {
+ $B1: {
+ %5:vec2<f32> = clamp %x, %low, %high
+ ret %5
+ }
+}
+)";
+
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1184,7 +1370,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1220,7 +1407,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1260,7 +1448,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1300,7 +1489,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1341,7 +1531,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1378,7 +1569,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1415,7 +1607,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1452,7 +1645,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1489,7 +1683,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1526,7 +1721,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1563,7 +1759,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1601,7 +1798,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1643,7 +1841,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1682,7 +1881,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1721,7 +1921,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1764,7 +1965,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1801,8 +2003,8 @@
}
}
)";
-
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1841,7 +2043,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1883,7 +2086,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1922,7 +2126,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -1961,7 +2166,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2003,7 +2209,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2043,7 +2250,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2083,7 +2291,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2127,7 +2336,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2166,7 +2376,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2205,7 +2416,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2248,7 +2460,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2287,7 +2500,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2326,7 +2540,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2369,7 +2584,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2406,7 +2622,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2445,7 +2662,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2484,7 +2702,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2526,7 +2745,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2564,7 +2784,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2602,7 +2823,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2642,7 +2864,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2683,7 +2906,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2717,7 +2941,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2752,7 +2977,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2788,7 +3014,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2823,7 +3050,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2857,7 +3085,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2891,7 +3120,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2926,7 +3156,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2960,7 +3191,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -2995,7 +3227,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3030,7 +3263,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3064,7 +3298,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3098,7 +3333,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3132,7 +3368,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3166,7 +3403,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3201,7 +3439,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3236,7 +3475,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3272,7 +3512,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3308,7 +3549,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3343,7 +3585,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3378,7 +3621,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3415,7 +3659,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3442,7 +3687,8 @@
auto* expect = src;
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3484,7 +3730,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3518,7 +3765,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3552,7 +3800,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3585,7 +3834,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3618,7 +3868,8 @@
}
)";
- Run(BuiltinPolyfill, false);
+ PolyfillConfig config;
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3654,7 +3905,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3690,7 +3942,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3725,7 +3978,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3760,7 +4014,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3797,7 +4052,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3834,7 +4090,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3871,7 +4128,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3908,7 +4166,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3945,7 +4204,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -3982,7 +4242,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -4019,7 +4280,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
@@ -4056,7 +4318,8 @@
}
)";
- Run(BuiltinPolyfill, true);
+ PolyfillConfig config{.use_vulkan_memory_model = true};
+ Run(BuiltinPolyfill, config);
EXPECT_EQ(expect, str());
}
diff --git a/src/tint/lang/spirv/writer/raise/raise.cc b/src/tint/lang/spirv/writer/raise/raise.cc
index 0e4177f..d36a490 100644
--- a/src/tint/lang/spirv/writer/raise/raise.cc
+++ b/src/tint/lang/spirv/writer/raise/raise.cc
@@ -165,8 +165,9 @@
RUN_TRANSFORM(core::ir::transform::DemoteToHelper, module);
}
- RUN_TRANSFORM(raise::BuiltinPolyfill, module, options.use_vulkan_memory_model);
-
+ raise::PolyfillConfig config = {.use_vulkan_memory_model = options.use_vulkan_memory_model,
+ .scalarize_clamp_builtin = options.scalarize_clamp_builtin};
+ RUN_TRANSFORM(raise::BuiltinPolyfill, module, config);
RUN_TRANSFORM(raise::ExpandImplicitSplats, module);
// kAllowAnyInputAttachmentIndexType required after ExpandImplicitSplats
RUN_TRANSFORM(raise::HandleMatrixArithmetic, module);