[wgsl] Disallow subgroup matrix in the private address space
The private address space is always considered to be non-uniform,
which means subgroup matrices in var<private> would be unusable
without the diagnostic to disable the uniformity analysis.
Fixed: 410549252
Change-Id: I7b2a7f110a4b346ece518c9af001d5dac0a30a15
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/236818
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/wgsl/inspector/inspector_test.cc b/src/tint/lang/wgsl/inspector/inspector_test.cc
index f891332..a1d3f9d 100644
--- a/src/tint/lang/wgsl/inspector/inspector_test.cc
+++ b/src/tint/lang/wgsl/inspector/inspector_test.cc
@@ -3968,8 +3968,9 @@
auto* src = R"(
enable chromium_experimental_subgroup_matrix;
-var<private> sm: subgroup_matrix_result<f32, 8, 8>;
-@compute @workgroup_size(1) fn foo() { _ = sm; }
+@compute @workgroup_size(1) fn foo() {
+ _ = subgroup_matrix_result<f32, 8, 8>();
+}
)";
Inspector& inspector = Initialize(src);
@@ -3984,8 +3985,7 @@
auto* src = R"(
enable chromium_experimental_subgroup_matrix;
-var<private> sm: subgroup_matrix_result<f32, 8, 8>;
-fn foo() { _ = sm; }
+fn foo() { _ = subgroup_matrix_result<f32, 8, 8>(); }
@compute @workgroup_size(1) fn main() { foo(); }
)";
Inspector& inspector = Initialize(src);
diff --git a/src/tint/lang/wgsl/resolver/resolver.cc b/src/tint/lang/wgsl/resolver/resolver.cc
index 06c6317..b8ae4ee 100644
--- a/src/tint/lang/wgsl/resolver/resolver.cc
+++ b/src/tint/lang/wgsl/resolver/resolver.cc
@@ -4930,11 +4930,10 @@
const_cast<core::type::Type*>(arr->ElemType()), usage);
}
- // Subgroup matrix types can only be declared in the `function` and `private` address space, or
- // in value declarations (the `undefined` address space).
+ // Subgroup matrix types can only be declared in the `function` address space, or in value
+ // declarations (the `undefined` address space).
if (ty->Is<core::type::SubgroupMatrix>() && address_space != core::AddressSpace::kUndefined &&
- address_space != core::AddressSpace::kFunction &&
- address_space != core::AddressSpace::kPrivate) {
+ address_space != core::AddressSpace::kFunction) {
AddError(usage) << "subgroup matrix types cannot be declared in the "
<< style::Enum(address_space) << " address space";
return false;
diff --git a/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc b/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc
index ccedf7a..79a9dd1 100644
--- a/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc
+++ b/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc
@@ -62,12 +62,12 @@
StringStream kind;
kind << "subgroup_matrix_" << ToString(params.kind);
- auto* var = GlobalVar("m", private_,
- ty(kind.str(), params.el_ast(*this), u32(params.cols), u32(params.rows)));
+ auto* alias =
+ Alias("m", ty(kind.str(), params.el_ast(*this), u32(params.cols), u32(params.rows)));
EXPECT_TRUE(r()->Resolve()) << r()->error();
- auto* m = TypeOf(var)->UnwrapRef()->As<core::type::SubgroupMatrix>();
+ auto* m = TypeOf(alias)->UnwrapRef()->As<core::type::SubgroupMatrix>();
ASSERT_NE(m, nullptr);
EXPECT_EQ(m->Kind(), params.kind);
EXPECT_EQ(m->Type(), params.el_sem(*this));
@@ -90,11 +90,11 @@
TEST_F(ResolverSubgroupMatrixTest, SignedColumnCount) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- auto* var = GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), 4_i, 2_u));
+ auto* alias = Alias("left", ty("subgroup_matrix_result", ty.f32(), 4_i, 2_u));
EXPECT_TRUE(r()->Resolve()) << r()->error();
- auto* m = TypeOf(var)->UnwrapRef()->As<core::type::SubgroupMatrix>();
+ auto* m = TypeOf(alias)->UnwrapRef()->As<core::type::SubgroupMatrix>();
ASSERT_NE(m, nullptr);
EXPECT_EQ(m->Columns(), 4u);
EXPECT_EQ(m->Rows(), 2u);
@@ -102,18 +102,18 @@
TEST_F(ResolverSubgroupMatrixTest, SignedRowCount) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- auto* var = GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), 4_u, 2_i));
+ auto* alias = Alias("left", ty("subgroup_matrix_result", ty.f32(), 4_u, 2_i));
EXPECT_TRUE(r()->Resolve()) << r()->error();
- auto* m = TypeOf(var)->UnwrapRef()->As<core::type::SubgroupMatrix>();
+ auto* m = TypeOf(alias)->UnwrapRef()->As<core::type::SubgroupMatrix>();
ASSERT_NE(m, nullptr);
EXPECT_EQ(m->Columns(), 4u);
EXPECT_EQ(m->Rows(), 2u);
}
TEST_F(ResolverSubgroupMatrixTest, DeclareTypeWithoutExtension) {
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), 8_a, 8_a));
+ Alias("left", ty("subgroup_matrix_result", ty.f32(), 8_a, 8_a));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(
@@ -123,7 +123,7 @@
TEST_F(ResolverSubgroupMatrixTest, MissingTemplateArgs) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result"));
+ Alias("left", ty("subgroup_matrix_result"));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(), R"(error: expected '<' for 'subgroup_matrix_result')");
@@ -131,7 +131,7 @@
TEST_F(ResolverSubgroupMatrixTest, MissingColsAndRows) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32()));
+ Alias("left", ty("subgroup_matrix_result", ty.f32()));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(), R"(error: 'subgroup_matrix_result' requires 3 template arguments)");
@@ -139,7 +139,7 @@
TEST_F(ResolverSubgroupMatrixTest, MissingRows) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), 8_a));
+ Alias("left", ty("subgroup_matrix_result", ty.f32(), 8_a));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(), R"(error: 'subgroup_matrix_result' requires 3 template arguments)");
@@ -147,7 +147,7 @@
TEST_F(ResolverSubgroupMatrixTest, MissingType) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", 8_a, 8_a));
+ Alias("left", ty("subgroup_matrix_result", 8_a, 8_a));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(), R"(error: 'subgroup_matrix_result' requires 3 template arguments)");
@@ -155,7 +155,7 @@
TEST_F(ResolverSubgroupMatrixTest, BadType) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.bool_(), 8_a, 8_a));
+ Alias("left", ty("subgroup_matrix_result", ty.bool_(), 8_a, 8_a));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(), R"(error: subgroup_matrix element type must be f32, f16, i32, or u32)");
@@ -176,7 +176,7 @@
TEST_F(ResolverSubgroupMatrixTest, ZeroColumnCount) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), 0_a, 8_a));
+ Alias("left", ty("subgroup_matrix_result", ty.f32(), 0_a, 8_a));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
@@ -185,7 +185,7 @@
TEST_F(ResolverSubgroupMatrixTest, NegativeColumnCount) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), -1_i, 8_a));
+ Alias("left", ty("subgroup_matrix_result", ty.f32(), -1_i, 8_a));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
@@ -207,7 +207,7 @@
TEST_F(ResolverSubgroupMatrixTest, ZeroRowCount) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), 8_a, 0_a));
+ Alias("left", ty("subgroup_matrix_result", ty.f32(), 8_a, 0_a));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
@@ -216,7 +216,7 @@
TEST_F(ResolverSubgroupMatrixTest, NegativeRowCount) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("left", private_, ty("subgroup_matrix_result", ty.f32(), 8_a, -1_i));
+ Alias("left", ty("subgroup_matrix_result", ty.f32(), 8_a, -1_i));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
@@ -553,11 +553,15 @@
EXPECT_TRUE(r()->Resolve()) << r()->error();
}
-TEST_F(ResolverSubgroupMatrixTest, PrivateVar_Valid) {
+TEST_F(ResolverSubgroupMatrixTest, PrivateVar_Invalid) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
GlobalVar("result", private_, ty("subgroup_matrix_result", ty.f32(), 8_a, 8_a));
- EXPECT_TRUE(r()->Resolve()) << r()->error();
+ EXPECT_FALSE(r()->Resolve());
+ EXPECT_THAT(
+ r()->error(),
+ testing::HasSubstr(
+ R"(error: subgroup matrix types cannot be declared in the 'private' address space)"));
}
TEST_F(ResolverSubgroupMatrixTest, StorageVar_Invalid) {
@@ -595,9 +599,13 @@
R"(error: subgroup matrix types cannot be declared in the 'workgroup' address space)"));
}
-TEST_F(ResolverSubgroupMatrixTest, PrivateVar_ArrayElement_Valid) {
+TEST_F(ResolverSubgroupMatrixTest, FunctionVar_ArrayElement_Valid) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("result", private_, ty.array(ty("subgroup_matrix_result", ty.f32(), 8_a, 8_a), 8_a));
+ auto matrix_type = ty("subgroup_matrix_result", ty.f32(), 8_a, 8_a);
+ Func("foo", Empty, ty.void_(),
+ Vector{
+ Decl(Var("result", function, ty.array(matrix_type, 8_a))),
+ });
EXPECT_TRUE(r()->Resolve()) << r()->error();
}
@@ -613,13 +621,16 @@
R"(error: subgroup matrix types cannot be declared in the 'workgroup' address space)"));
}
-TEST_F(ResolverSubgroupMatrixTest, PrivateVar_StructMember_Valid) {
+TEST_F(ResolverSubgroupMatrixTest, FunctionVar_StructMember_Valid) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
auto* s = Structure("S", Vector{
Member("m", ty("subgroup_matrix_result", ty.f32(), 8_a, 8_a)),
});
- GlobalVar("result", private_, ty.Of(s));
+ Func("foo", Empty, ty.void_(),
+ Vector{
+ Decl(Var("result", function, ty.Of(s))),
+ });
EXPECT_TRUE(r()->Resolve()) << r()->error();
}
@@ -715,52 +726,6 @@
EXPECT_TRUE(r()->Resolve()) << r()->error();
}
-TEST_F(ResolverSubgroupMatrixTest, FragmentShader_ReferenceModuleScope) {
- Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("result", private_, ty("subgroup_matrix_result", ty.f32(), 8_u, 8_u));
- Func("foo", Empty, ty.void_(),
- Vector{
- Assign(Phony(), AddressOf(Ident(Source({12, 34}), "result"))),
- },
- Vector{Stage(ast::PipelineStage::kFragment)});
-
- EXPECT_FALSE(r()->Resolve());
- EXPECT_EQ(r()->error(),
- R"(12:34 error: subgroup matrix type cannot be used in fragment pipeline stage)");
-}
-
-TEST_F(ResolverSubgroupMatrixTest, FragmentShader_ReferenceModuleScopeInArray) {
- Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
- GlobalVar("result", private_, ty.array(ty("subgroup_matrix_result", ty.f32(), 8_u, 8_u), 4_a));
- Func("foo", Empty, ty.void_(),
- Vector{
- Assign(Phony(), AddressOf(Ident(Source({12, 34}), "result"))),
- },
- Vector{Stage(ast::PipelineStage::kFragment)});
-
- EXPECT_FALSE(r()->Resolve());
- EXPECT_EQ(r()->error(),
- R"(12:34 error: subgroup matrix type cannot be used in fragment pipeline stage)");
-}
-
-TEST_F(ResolverSubgroupMatrixTest, FragmentShader_ReferenceModuleScopeInStruct) {
- Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
-
- auto* s = Structure("S", Vector{
- Member("m", ty("subgroup_matrix_result", ty.f32(), 8_a, 8_a)),
- });
- GlobalVar("result", private_, ty.Of(s));
- Func("foo", Empty, ty.void_(),
- Vector{
- Assign(Phony(), AddressOf(Ident(Source({12, 34}), "result"))),
- },
- Vector{Stage(ast::PipelineStage::kFragment)});
-
- EXPECT_FALSE(r()->Resolve());
- EXPECT_EQ(r()->error(),
- R"(12:34 error: subgroup matrix type cannot be used in fragment pipeline stage)");
-}
-
TEST_F(ResolverSubgroupMatrixTest, FragmentShader_FunctionVar) {
Enable(wgsl::Extension::kChromiumExperimentalSubgroupMatrix);
Func(