[tint] Validation error workgroupUniformLoad non constructible
WorkgroupUniformLoad only accepts a ptr to a parameter that is a
constructible type.
Arrays whose size is defined at pipeline creation time (aka overrides)
are not considered to be creation-fixed-footprint (not constructible).
https://www.w3.org/TR/WGSL/#workgroupUniformLoad-builtin
https://github.com/gpuweb/gpuweb/issues/5093
https://www.w3.org/TR/WGSL/#constructible-types
Bug: 402982337
Change-Id: I3f863bd8cdf54807d4316728ecc47787c2c74543
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/233115
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/wgsl/resolver/validation_test.cc b/src/tint/lang/wgsl/resolver/validation_test.cc
index fa55dd0..7c274cc 100644
--- a/src/tint/lang/wgsl/resolver/validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/validation_test.cc
@@ -1472,6 +1472,35 @@
R"(1:2 error: shift left value must be less than the bit width of the lhs, which is 32)");
}
+TEST_F(ResolverValidationTest, WorkgroupUniformLoad_ArraySize_NamedOverride) {
+ // override size = 10u;
+ // var<workgroup> a : array<u32, size>;
+ auto* override = Override("size", Expr(10_u));
+ auto* a = GlobalVar(Source{{7, 3}}, "a", ty.array(ty.u32(), override),
+ core::AddressSpace::kWorkgroup);
+
+ auto* call = Call("workgroupUniformLoad", AddressOf(a));
+ WrapInFunction(call);
+
+ EXPECT_FALSE(r()->Resolve());
+ EXPECT_EQ(
+ r()->error(),
+ R"(error: workgroupUniformLoad must be called with an argument whose type is constructible)");
+}
+
+TEST_F(ResolverValidationTest, WorkgroupUniformLoad_ArraySize_NamedConstant) {
+ // const size = 10u;
+ // var<workgroup> a : array<u32, size>;
+ auto* const_exp = GlobalConst("size", Expr(10_u));
+ auto* a = GlobalVar(Source{{7, 3}}, "a", ty.array(ty.u32(), const_exp),
+ core::AddressSpace::kWorkgroup);
+
+ auto* call = Call("workgroupUniformLoad", AddressOf(a));
+ WrapInFunction(call);
+
+ EXPECT_TRUE(r()->Resolve()) << r()->error();
+}
+
} // namespace
} // namespace tint::resolver
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index 1f3a1ac..edd26f0 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -2046,6 +2046,12 @@
return false;
}
+ if (!ty->IsConstructible()) {
+ AddError(arg->Declaration()->source)
+ << "workgroupUniformLoad must be called with an argument whose type is constructible";
+ return false;
+ }
+
return true;
}