Do not put handles into lets/phonys when moving back to WGSL.
When converting from IR to WGSL, avoid putting any handle types into
lets/phonys. The `let` in WGSL can not take a `handle` type.
Change-Id: Ic4d8fcb559bf57ff777df66bccb784073f8108bf
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/245094
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/wgsl/writer/raise/value_to_let.cc b/src/tint/lang/wgsl/writer/raise/value_to_let.cc
index 5e5755a..878efa0 100644
--- a/src/tint/lang/wgsl/writer/raise/value_to_let.cc
+++ b/src/tint/lang/wgsl/writer/raise/value_to_let.cc
@@ -165,6 +165,10 @@
if (inst->IsAnyOf<core::ir::Var, core::ir::Let, core::ir::Phony>()) {
return;
}
+ // Never put handle types in lets or phonys
+ if (inst->Result()->Type()->IsHandle()) {
+ return;
+ }
if (inst->Is<core::ir::Call>() && !value->IsUsed()) {
bool must_use =
inst->Is<core::ir::BuiltinCall>() && !value->Type()->Is<core::type::Void>();
diff --git a/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc b/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
index 9cf5e38..d452454 100644
--- a/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
+++ b/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
@@ -30,6 +30,7 @@
#include <utility>
#include "src/tint/lang/core/ir/transform/helper_test.h"
+#include "src/tint/lang/core/type/sampled_texture.h"
namespace tint::wgsl::writer::raise {
namespace {
@@ -2689,5 +2690,71 @@
EXPECT_EQ(expect, str());
}
+/////////////////////////
+// Load handle
+/////////////////////////
+TEST_F(WgslWriter_ValueToLetTest, Load_Handle) {
+ core::ir::Var* tex = nullptr;
+ core::ir::Var* sampler = nullptr;
+ b.Append(b.ir.root_block, [&] {
+ tex = b.Var("tex",
+ ty.ptr(handle, ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
+ core::Access::kRead));
+ tex->SetBindingPoint(0, 0);
+
+ sampler = b.Var(ty.ptr(handle, ty.sampler()));
+ sampler->SetBindingPoint(0, 1);
+ });
+
+ auto* fn = b.Function("f", ty.void_());
+ b.Append(fn->Block(), [&] {
+ auto* ls = b.Load(sampler);
+ auto* lt = b.Load(tex);
+ auto* r = b.Call(ty.vec4<f32>(), core::BuiltinFn::kTextureSample, lt, ls,
+ b.Splat<vec2<f32>>(0_f));
+ b.ir.SetName(r, "r");
+ b.Return(fn);
+ });
+
+ auto* src = R"(
+$B1: { # root
+ %tex:ptr<handle, texture_2d<f32>, read> = var undef @binding_point(0, 0)
+ %2:ptr<handle, sampler, read> = var undef @binding_point(0, 1)
+}
+
+%f = func():void {
+ $B2: {
+ %4:sampler = load %2
+ %5:texture_2d<f32> = load %tex
+ %r:vec4<f32> = textureSample %5, %4, vec2<f32>(0.0f)
+ ret
+ }
+}
+)";
+
+ EXPECT_EQ(src, str());
+
+ auto* expect = R"(
+$B1: { # root
+ %tex:ptr<handle, texture_2d<f32>, read> = var undef @binding_point(0, 0)
+ %2:ptr<handle, sampler, read> = var undef @binding_point(0, 1)
+}
+
+%f = func():void {
+ $B2: {
+ %4:sampler = load %2
+ %5:texture_2d<f32> = load %tex
+ %6:vec4<f32> = textureSample %5, %4, vec2<f32>(0.0f)
+ %r:vec4<f32> = let %6
+ ret
+ }
+}
+)";
+
+ Run(ValueToLet);
+
+ EXPECT_EQ(expect, str());
+}
+
} // namespace
} // namespace tint::wgsl::writer::raise