[tint][ir][val] Enforce rules around scope for function vars
- Adds a check that function address space vars are only declared in a
function scope
- Adds a check that non-function address space are not declared in a
function scope
- Add a capability to allow MSL specific IR to have private address
space vars declared in a function scope.
- Bunch of test fixes/updates
Fixes: 381109471
Fixes: 381109773
Change-Id: I874930a858777c43a0c26354c7d888ffeab9056c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/216957
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/core/ir/transform/remove_terminator_args.h b/src/tint/lang/core/ir/transform/remove_terminator_args.h
index 0b366b8..63bb87d 100644
--- a/src/tint/lang/core/ir/transform/remove_terminator_args.h
+++ b/src/tint/lang/core/ir/transform/remove_terminator_args.h
@@ -45,6 +45,7 @@
core::ir::Capability::kAllowVectorElementPointer,
core::ir::Capability::kAllowHandleVarsWithoutBindings,
core::ir::Capability::kAllowClipDistancesOnF32,
+ core::ir::Capability::kAllowPrivateVarsInFunctions,
};
/// RemoveTerminatorArgs is a transform that removes all arguments from terminator instructions and
diff --git a/src/tint/lang/core/ir/transform/rename_conflicts.h b/src/tint/lang/core/ir/transform/rename_conflicts.h
index a56cab3..fb5d4b5 100644
--- a/src/tint/lang/core/ir/transform/rename_conflicts.h
+++ b/src/tint/lang/core/ir/transform/rename_conflicts.h
@@ -45,6 +45,7 @@
core::ir::Capability::kAllowVectorElementPointer,
core::ir::Capability::kAllowHandleVarsWithoutBindings,
core::ir::Capability::kAllowClipDistancesOnF32,
+ core::ir::Capability::kAllowPrivateVarsInFunctions,
};
/// RenameConflicts is a transform that renames declarations which prevent identifiers from
diff --git a/src/tint/lang/core/ir/transform/rename_conflicts_test.cc b/src/tint/lang/core/ir/transform/rename_conflicts_test.cc
index e418b0c..b1be9ad 100644
--- a/src/tint/lang/core/ir/transform/rename_conflicts_test.cc
+++ b/src/tint/lang/core/ir/transform/rename_conflicts_test.cc
@@ -124,7 +124,7 @@
TEST_F(IRToProgramRenameConflictsTest, Conflict_RootBlockVarAndStructWithSameName) {
auto* s = ty.Struct(b.ir.symbols.New("v"), {{b.ir.symbols.New("x"), ty.i32()}});
- b.Append(mod.root_block, [&] { b.ir.SetName(b.Var(ty.ptr(function, s)), "v"); });
+ b.Append(mod.root_block, [&] { b.ir.SetName(b.Var(ty.ptr(private_, s)), "v"); });
auto* src = R"(
v = struct @align(4) {
@@ -132,7 +132,7 @@
}
$B1: { # root
- %v:ptr<function, v, read_write> = var
+ %v:ptr<private, v, read_write> = var
}
)";
@@ -144,7 +144,7 @@
}
$B1: { # root
- %v_1:ptr<function, v, read_write> = var
+ %v_1:ptr<private, v, read_write> = var
}
)";
diff --git a/src/tint/lang/core/ir/transform/value_to_let.h b/src/tint/lang/core/ir/transform/value_to_let.h
index 945f773..852c554 100644
--- a/src/tint/lang/core/ir/transform/value_to_let.h
+++ b/src/tint/lang/core/ir/transform/value_to_let.h
@@ -46,6 +46,7 @@
core::ir::Capability::kAllowVectorElementPointer,
core::ir::Capability::kAllowHandleVarsWithoutBindings,
core::ir::Capability::kAllowClipDistancesOnF32,
+ core::ir::Capability::kAllowPrivateVarsInFunctions,
};
/// Configuration for ValueToLet transform.
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index 7677f4c..70fc255 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -2377,14 +2377,25 @@
return;
}
- {
- auto result = ValidateBindingPoint(var->BindingPoint(), mv->AddressSpace());
- if (result != Success) {
- AddError(var) << result.Failure();
+ if (var->Block() != mod_.root_block && mv->AddressSpace() != AddressSpace::kFunction) {
+ if (!capabilities_.Contains(Capability::kAllowPrivateVarsInFunctions) ||
+ mv->AddressSpace() != AddressSpace::kPrivate) {
+ AddError(var) << "vars in a function scope must be in the 'function' address space";
return;
}
}
+ if (var->Block() == mod_.root_block && mv->AddressSpace() == AddressSpace::kFunction) {
+ AddError(var) << "vars in the 'function' address space must be in a function scope";
+ return;
+ }
+
+ if (auto result = ValidateBindingPoint(var->BindingPoint(), mv->AddressSpace());
+ result != Success) {
+ AddError(var) << result.Failure();
+ return;
+ }
+
if (mv->AddressSpace() == AddressSpace::kWorkgroup) {
if (auto* ary = result_type->UnwrapPtr()->As<core::type::Array>()) {
if (auto* count = ary->Count()->As<core::ir::type::ValueArrayCount>()) {
diff --git a/src/tint/lang/core/ir/validator.h b/src/tint/lang/core/ir/validator.h
index cf4809a..dcf8564 100644
--- a/src/tint/lang/core/ir/validator.h
+++ b/src/tint/lang/core/ir/validator.h
@@ -58,6 +58,8 @@
kAllowRefTypes,
/// Allows access instructions to create pointers to vector elements.
kAllowVectorElementPointer,
+ /// Allows private address space variables in function scopes.
+ kAllowPrivateVarsInFunctions,
};
/// Capabilities is a set of Capability
diff --git a/src/tint/lang/core/ir/validator_test.cc b/src/tint/lang/core/ir/validator_test.cc
index 57f72f0..a9dfb11 100644
--- a/src/tint/lang/core/ir/validator_test.cc
+++ b/src/tint/lang/core/ir/validator_test.cc
@@ -1552,7 +1552,7 @@
b.Append(f->Block(), [&] {
auto* l = b.Load(invalid);
- auto* v = b.Var("v", AddressSpace::kPrivate, ty.bool_());
+ auto* v = b.Var("v", AddressSpace::kFunction, ty.bool_());
v->SetInitializer(l->Result(0));
b.Unreachable();
});
@@ -1573,7 +1573,7 @@
%f = @fragment func():void {
$B2: {
%3:bool = load %invalid
- %v:ptr<private, bool, read_write> = var, %3
+ %v:ptr<function, bool, read_write> = var, %3
unreachable
}
}
@@ -5150,21 +5150,42 @@
)");
}
-TEST_F(IR_ValidatorTest, Var_Private_UnexpectedInputAttachmentIndex) {
+TEST_F(IR_ValidatorTest, Var_Function_OutsideFunctionScope) {
+ auto* v = b.Var<function, f32>();
+ mod.root_block->Append(v);
+
+ auto res = ir::Validate(mod);
+ ASSERT_NE(res, Success);
+ EXPECT_EQ(res.Failure().reason.Str(),
+ R"(:2:39 error: var: vars in the 'function' address space must be in a function scope
+ %1:ptr<function, f32, read_write> = var
+ ^^^
+
+:1:1 note: in block
+$B1: { # root
+^^^
+
+note: # Disassembly
+$B1: { # root
+ %1:ptr<function, f32, read_write> = var
+}
+
+)");
+}
+
+TEST_F(IR_ValidatorTest, Var_NonFunction_InsideFunctionScope) {
auto* f = b.Function("my_func", ty.void_());
b.Append(f->Block(), [&] {
- auto* v = b.Var<private_, f32>();
-
- v->SetInputAttachmentIndex(0);
+ b.Var<private_, f32>();
b.Return(f);
});
auto res = ir::Validate(mod);
ASSERT_NE(res, Success);
EXPECT_EQ(res.Failure().reason.Str(),
- R"(:3:40 error: var: '@input_attachment_index' is not valid for non-handle var
- %2:ptr<private, f32, read_write> = var @input_attachment_index(0)
+ R"(:3:40 error: var: vars in a function scope must be in the 'function' address space
+ %2:ptr<private, f32, read_write> = var
^^^
:2:3 note: in block
@@ -5174,132 +5195,144 @@
note: # Disassembly
%my_func = func():void {
$B1: {
- %2:ptr<private, f32, read_write> = var @input_attachment_index(0)
+ %2:ptr<private, f32, read_write> = var
ret
}
}
)");
}
+TEST_F(IR_ValidatorTest, Var_Private_InsideFunctionScopeWithCapability) {
+ auto* f = b.Function("my_func", ty.void_());
+
+ b.Append(f->Block(), [&] {
+ b.Var<private_, f32>();
+ b.Return(f);
+ });
+
+ auto res = ir::Validate(mod, Capabilities{Capability::kAllowPrivateVarsInFunctions});
+ ASSERT_EQ(res, Success);
+}
+
+TEST_F(IR_ValidatorTest, Var_Private_UnexpectedInputAttachmentIndex) {
+ auto* v = b.Var<private_, f32>();
+ v->SetInputAttachmentIndex(0);
+ mod.root_block->Append(v);
+
+ auto res = ir::Validate(mod);
+ ASSERT_NE(res, Success);
+ EXPECT_EQ(res.Failure().reason.Str(),
+ R"(:2:38 error: var: '@input_attachment_index' is not valid for non-handle var
+ %1:ptr<private, f32, read_write> = var @input_attachment_index(0)
+ ^^^
+
+:1:1 note: in block
+$B1: { # root
+^^^
+
+note: # Disassembly
+$B1: { # root
+ %1:ptr<private, f32, read_write> = var @input_attachment_index(0)
+}
+
+)");
+}
+
TEST_F(IR_ValidatorTest, Var_PushConstant_UnexpectedInputAttachmentIndex) {
- auto* f = b.Function("my_func", ty.void_());
-
- b.Append(f->Block(), [&] {
- auto* v = b.Var<push_constant, f32>();
- v->SetInputAttachmentIndex(0);
- b.Return(f);
- });
+ auto* v = b.Var<push_constant, f32>();
+ v->SetInputAttachmentIndex(0);
+ mod.root_block->Append(v);
auto res = ir::Validate(mod);
ASSERT_NE(res, Success);
EXPECT_EQ(res.Failure().reason.Str(),
- R"(:3:40 error: var: '@input_attachment_index' is not valid for non-handle var
- %2:ptr<push_constant, f32, read> = var @input_attachment_index(0)
- ^^^
+ R"(:2:38 error: var: '@input_attachment_index' is not valid for non-handle var
+ %1:ptr<push_constant, f32, read> = var @input_attachment_index(0)
+ ^^^
-:2:3 note: in block
- $B1: {
- ^^^
+:1:1 note: in block
+$B1: { # root
+^^^
note: # Disassembly
-%my_func = func():void {
- $B1: {
- %2:ptr<push_constant, f32, read> = var @input_attachment_index(0)
- ret
- }
+$B1: { # root
+ %1:ptr<push_constant, f32, read> = var @input_attachment_index(0)
}
+
)");
}
TEST_F(IR_ValidatorTest, Var_Storage_UnexpectedInputAttachmentIndex) {
- auto* f = b.Function("my_func", ty.void_());
-
- b.Append(f->Block(), [&] {
- auto* v = b.Var<storage, f32>();
- v->SetBindingPoint(0, 0);
- v->SetInputAttachmentIndex(0);
- b.Return(f);
- });
+ auto* v = b.Var<storage, f32>();
+ v->SetBindingPoint(0, 0);
+ v->SetInputAttachmentIndex(0);
+ mod.root_block->Append(v);
auto res = ir::Validate(mod);
ASSERT_NE(res, Success);
EXPECT_EQ(res.Failure().reason.Str(),
- R"(:3:40 error: var: '@input_attachment_index' is not valid for non-handle var
- %2:ptr<storage, f32, read_write> = var @binding_point(0, 0) @input_attachment_index(0)
- ^^^
+ R"(:2:38 error: var: '@input_attachment_index' is not valid for non-handle var
+ %1:ptr<storage, f32, read_write> = var @binding_point(0, 0) @input_attachment_index(0)
+ ^^^
-:2:3 note: in block
- $B1: {
- ^^^
+:1:1 note: in block
+$B1: { # root
+^^^
note: # Disassembly
-%my_func = func():void {
- $B1: {
- %2:ptr<storage, f32, read_write> = var @binding_point(0, 0) @input_attachment_index(0)
- ret
- }
+$B1: { # root
+ %1:ptr<storage, f32, read_write> = var @binding_point(0, 0) @input_attachment_index(0)
}
+
)");
}
TEST_F(IR_ValidatorTest, Var_Uniform_UnexpectedInputAttachmentIndex) {
- auto* f = b.Function("my_func", ty.void_());
-
- b.Append(f->Block(), [&] {
- auto* v = b.Var<uniform, f32>();
- v->SetBindingPoint(0, 0);
- v->SetInputAttachmentIndex(0);
- b.Return(f);
- });
+ auto* v = b.Var<uniform, f32>();
+ v->SetBindingPoint(0, 0);
+ v->SetInputAttachmentIndex(0);
+ mod.root_block->Append(v);
auto res = ir::Validate(mod);
ASSERT_NE(res, Success);
EXPECT_EQ(res.Failure().reason.Str(),
- R"(:3:34 error: var: '@input_attachment_index' is not valid for non-handle var
- %2:ptr<uniform, f32, read> = var @binding_point(0, 0) @input_attachment_index(0)
- ^^^
+ R"(:2:32 error: var: '@input_attachment_index' is not valid for non-handle var
+ %1:ptr<uniform, f32, read> = var @binding_point(0, 0) @input_attachment_index(0)
+ ^^^
-:2:3 note: in block
- $B1: {
- ^^^
+:1:1 note: in block
+$B1: { # root
+^^^
note: # Disassembly
-%my_func = func():void {
- $B1: {
- %2:ptr<uniform, f32, read> = var @binding_point(0, 0) @input_attachment_index(0)
- ret
- }
+$B1: { # root
+ %1:ptr<uniform, f32, read> = var @binding_point(0, 0) @input_attachment_index(0)
}
+
)");
}
TEST_F(IR_ValidatorTest, Var_Workgroup_UnexpectedInputAttachmentIndex) {
- auto* f = b.Function("my_func", ty.void_());
-
- b.Append(f->Block(), [&] {
- auto* v = b.Var<workgroup, f32>();
- v->SetInputAttachmentIndex(0);
- b.Return(f);
- });
+ auto* v = b.Var<workgroup, f32>();
+ v->SetInputAttachmentIndex(0);
+ mod.root_block->Append(v);
auto res = ir::Validate(mod);
ASSERT_NE(res, Success);
EXPECT_EQ(res.Failure().reason.Str(),
- R"(:3:42 error: var: '@input_attachment_index' is not valid for non-handle var
- %2:ptr<workgroup, f32, read_write> = var @input_attachment_index(0)
- ^^^
+ R"(:2:40 error: var: '@input_attachment_index' is not valid for non-handle var
+ %1:ptr<workgroup, f32, read_write> = var @input_attachment_index(0)
+ ^^^
-:2:3 note: in block
- $B1: {
- ^^^
+:1:1 note: in block
+$B1: { # root
+^^^
note: # Disassembly
-%my_func = func():void {
- $B1: {
- %2:ptr<workgroup, f32, read_write> = var @input_attachment_index(0)
- ret
- }
+$B1: { # root
+ %1:ptr<workgroup, f32, read_write> = var @input_attachment_index(0)
}
+
)");
}
diff --git a/src/tint/lang/glsl/writer/type_test.cc b/src/tint/lang/glsl/writer/type_test.cc
index 543d05d..487394f 100644
--- a/src/tint/lang/glsl/writer/type_test.cc
+++ b/src/tint/lang/glsl/writer/type_test.cc
@@ -47,7 +47,7 @@
TEST_F(GlslWriterTest, EmitType_Array) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.array<bool, 4>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.array<bool, 4>()));
b.Return(func);
});
@@ -63,7 +63,7 @@
TEST_F(GlslWriterTest, EmitType_ArrayOfArray) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.array(ty.array<bool, 4>(), 5)));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.array(ty.array<bool, 4>(), 5)));
b.Return(func);
});
@@ -80,7 +80,7 @@
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
b.Var("a",
- ty.ptr(core::AddressSpace::kPrivate, ty.array(ty.array(ty.array<bool, 4>(), 5), 6)));
+ ty.ptr(core::AddressSpace::kFunction, ty.array(ty.array(ty.array<bool, 4>(), 5), 6)));
b.Return(func);
});
@@ -100,7 +100,7 @@
});
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, Inner));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, Inner));
b.Return(func);
});
@@ -121,7 +121,7 @@
TEST_F(GlslWriterTest, EmitType_Bool) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.bool_()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.bool_()));
b.Return(func);
});
@@ -137,7 +137,7 @@
TEST_F(GlslWriterTest, EmitType_F32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.f32()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.f32()));
b.Return(func);
});
@@ -153,7 +153,7 @@
TEST_F(GlslWriterTest, EmitType_F16) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.f16()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.f16()));
b.Return(func);
});
@@ -170,7 +170,7 @@
TEST_F(GlslWriterTest, EmitType_I32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.i32()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.i32()));
b.Return(func);
});
@@ -186,7 +186,7 @@
TEST_F(GlslWriterTest, EmitType_Matrix_F32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.mat2x3<f32>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.mat2x3<f32>()));
b.Return(func);
});
@@ -202,7 +202,7 @@
TEST_F(GlslWriterTest, EmitType_MatrixSquare_F32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.mat2x2<f32>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.mat2x2<f32>()));
b.Return(func);
});
@@ -218,7 +218,7 @@
TEST_F(GlslWriterTest, EmitType_Matrix_F16) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.mat2x3<f16>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.mat2x3<f16>()));
b.Return(func);
});
@@ -235,7 +235,7 @@
TEST_F(GlslWriterTest, EmitType_U32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.u32()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.u32()));
b.Return(func);
});
@@ -277,7 +277,7 @@
TEST_F(GlslWriterTest, EmitType_Vector_F32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.vec3<f32>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.vec3<f32>()));
b.Return(func);
});
@@ -293,7 +293,7 @@
TEST_F(GlslWriterTest, EmitType_Vector_F16) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.vec3<f16>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.vec3<f16>()));
b.Return(func);
});
@@ -310,7 +310,7 @@
TEST_F(GlslWriterTest, EmitType_Vector_I32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.vec2<i32>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.vec2<i32>()));
b.Return(func);
});
@@ -326,7 +326,7 @@
TEST_F(GlslWriterTest, EmitType_Vector_U32) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.vec4<u32>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.vec4<u32>()));
b.Return(func);
});
@@ -342,7 +342,7 @@
TEST_F(GlslWriterTest, EmitType_Vector_bool) {
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.vec3<bool>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.vec3<bool>()));
b.Return(func);
});
@@ -375,7 +375,7 @@
});
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, s));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, s));
b.Return(func);
});
@@ -401,8 +401,8 @@
});
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, s));
- b.Var("b", ty.ptr(core::AddressSpace::kPrivate, s));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, s));
+ b.Var("b", ty.ptr(core::AddressSpace::kFunction, s));
b.Return(func);
});
@@ -435,7 +435,7 @@
});
auto* func = b.ComputeFunction("foo");
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, s));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, s));
b.Return(func);
});
diff --git a/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc b/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc
index a9f978d..e63a111 100644
--- a/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc
+++ b/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc
@@ -43,14 +43,14 @@
TEST_F(HlslWriterPromoteInitializersTest, NoStructInitializers) {
auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
b.Append(func->Block(), [&] {
- b.Var<private_>("a", b.Zero<i32>());
+ b.Var<function>("a", b.Zero<i32>());
b.Return(func);
});
auto* src = R"(
%foo = @fragment func():void {
$B1: {
- %a:ptr<private, i32, read_write> = var, 0i
+ %a:ptr<function, i32, read_write> = var, 0i
ret
}
}
@@ -70,7 +70,7 @@
auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
b.Append(func->Block(), [&] {
- b.Var<private_>("a", b.Composite(str_ty, 1_i));
+ b.Var<function>("a", b.Composite(str_ty, 1_i));
b.Return(func);
});
@@ -81,7 +81,7 @@
%foo = @fragment func():void {
$B1: {
- %a:ptr<private, S, read_write> = var, S(1i)
+ %a:ptr<function, S, read_write> = var, S(1i)
ret
}
}
@@ -97,14 +97,14 @@
TEST_F(HlslWriterPromoteInitializersTest, ArrayInVarNoChange) {
auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
b.Append(func->Block(), [&] {
- b.Var<private_>("a", b.Zero<array<i32, 2>>());
+ b.Var<function>("a", b.Zero<array<i32, 2>>());
b.Return(func);
});
auto* src = R"(
%foo = @fragment func():void {
$B1: {
- %a:ptr<private, array<i32, 2>, read_write> = var, array<i32, 2>(0i)
+ %a:ptr<function, array<i32, 2>, read_write> = var, array<i32, 2>(0i)
ret
}
}
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index 5bb79e2..a2a1e21 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -121,12 +121,13 @@
/// @returns the generated MSL shader
tint::Result<PrintResult> Generate() {
- auto valid =
- core::ir::ValidateAndDumpIfNeeded(ir_, "msl.Printer",
- core::ir::Capabilities{
- core::ir::Capability::kAllow8BitIntegers,
- core::ir::Capability::kAllowPointersInStructures,
- });
+ auto valid = core::ir::ValidateAndDumpIfNeeded(
+ ir_, "msl.Printer",
+ core::ir::Capabilities{
+ core::ir::Capability::kAllow8BitIntegers,
+ core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowPrivateVarsInFunctions,
+ });
if (valid != Success) {
return std::move(valid.Failure());
}
diff --git a/src/tint/lang/msl/writer/raise/binary_polyfill.cc b/src/tint/lang/msl/writer/raise/binary_polyfill.cc
index bdf4b07..536065a 100644
--- a/src/tint/lang/msl/writer/raise/binary_polyfill.cc
+++ b/src/tint/lang/msl/writer/raise/binary_polyfill.cc
@@ -160,6 +160,7 @@
auto result = ValidateAndDumpIfNeeded(ir, "msl.BinaryPolyfill",
core::ir::Capabilities{
core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowPrivateVarsInFunctions,
});
if (result != Success) {
return result.Failure();
diff --git a/src/tint/lang/msl/writer/raise/builtin_polyfill.cc b/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
index 8f3983a..cca1607 100644
--- a/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
@@ -936,6 +936,7 @@
auto result = ValidateAndDumpIfNeeded(ir, "msl.BuiltinPolyfill",
core::ir::Capabilities{
core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowPrivateVarsInFunctions,
});
if (result != Success) {
return result.Failure();
diff --git a/src/tint/lang/msl/writer/raise/module_scope_vars.h b/src/tint/lang/msl/writer/raise/module_scope_vars.h
index a3c69ee..f9570e7 100644
--- a/src/tint/lang/msl/writer/raise/module_scope_vars.h
+++ b/src/tint/lang/msl/writer/raise/module_scope_vars.h
@@ -30,6 +30,7 @@
#include <string>
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
diff --git a/src/tint/lang/msl/writer/raise/module_scope_vars_test.cc b/src/tint/lang/msl/writer/raise/module_scope_vars_test.cc
index 775b6f7..7a64b1d 100644
--- a/src/tint/lang/msl/writer/raise/module_scope_vars_test.cc
+++ b/src/tint/lang/msl/writer/raise/module_scope_vars_test.cc
@@ -41,7 +41,10 @@
class MslWriter_ModuleScopeVarsTest : public core::ir::transform::TransformTest {
public:
- void SetUp() override { capabilities.Add(core::ir::Capability::kAllowPointersInStructures); }
+ void SetUp() override {
+ capabilities.Add(core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowPrivateVarsInFunctions);
+ }
};
TEST_F(MslWriter_ModuleScopeVarsTest, NoModuleScopeVars) {
diff --git a/src/tint/lang/msl/writer/raise/packed_vec3_test.cc b/src/tint/lang/msl/writer/raise/packed_vec3_test.cc
index a230647..d65648f 100644
--- a/src/tint/lang/msl/writer/raise/packed_vec3_test.cc
+++ b/src/tint/lang/msl/writer/raise/packed_vec3_test.cc
@@ -41,7 +41,7 @@
using MslWriter_PackedVec3Test = core::ir::transform::TransformTest;
TEST_F(MslWriter_PackedVec3Test, NoModify_PrivateVar) {
- auto* var = b.Var<function, vec3<u32>>("v");
+ auto* var = b.Var<private_, vec3<u32>>("v");
mod.root_block->Append(var);
auto* func = b.Function("foo", ty.vec3<u32>());
@@ -51,7 +51,7 @@
auto* src = R"(
$B1: { # root
- %v:ptr<function, vec3<u32>, read_write> = var
+ %v:ptr<private, vec3<u32>, read_write> = var
}
%foo = func():vec3<u32> {
diff --git a/src/tint/lang/msl/writer/raise/unary_polyfill.cc b/src/tint/lang/msl/writer/raise/unary_polyfill.cc
index 940f16a..072bb95 100644
--- a/src/tint/lang/msl/writer/raise/unary_polyfill.cc
+++ b/src/tint/lang/msl/writer/raise/unary_polyfill.cc
@@ -91,6 +91,7 @@
auto result = ValidateAndDumpIfNeeded(ir, "msl.UnaryPolyfill",
core::ir::Capabilities{
core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowPrivateVarsInFunctions,
});
if (result != Success) {
return result.Failure();
diff --git a/src/tint/lang/msl/writer/type_test.cc b/src/tint/lang/msl/writer/type_test.cc
index 502ae94..9c41fdf 100644
--- a/src/tint/lang/msl/writer/type_test.cc
+++ b/src/tint/lang/msl/writer/type_test.cc
@@ -47,14 +47,14 @@
TEST_F(MslWriterTest, EmitType_Array) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.array<bool, 4>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.array<bool, 4>()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + MetalArray() + R"(
void foo() {
- thread tint_array<bool, 4> a = {};
+ tint_array<bool, 4> a = {};
}
)");
}
@@ -62,14 +62,14 @@
TEST_F(MslWriterTest, EmitType_ArrayOfArray) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.array(ty.array<bool, 4>(), 5)));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.array(ty.array<bool, 4>(), 5)));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + MetalArray() + R"(
void foo() {
- thread tint_array<tint_array<bool, 4>, 5> a = {};
+ tint_array<tint_array<bool, 4>, 5> a = {};
}
)");
}
@@ -78,14 +78,14 @@
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
b.Var("a",
- ty.ptr(core::AddressSpace::kPrivate, ty.array(ty.array(ty.array<bool, 4>(), 5), 6)));
+ ty.ptr(core::AddressSpace::kFunction, ty.array(ty.array(ty.array<bool, 4>(), 5), 6)));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + MetalArray() + R"(
void foo() {
- thread tint_array<tint_array<tint_array<bool, 4>, 5>, 6> a = {};
+ tint_array<tint_array<tint_array<bool, 4>, 5>, 6> a = {};
}
)");
}
@@ -93,14 +93,14 @@
TEST_F(MslWriterTest, EmitType_RuntimeArray) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.array<bool, 0>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.array<bool, 0>()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + MetalArray() + R"(
void foo() {
- thread tint_array<bool, 1> a = {};
+ tint_array<bool, 1> a = {};
}
)");
}
@@ -108,14 +108,14 @@
TEST_F(MslWriterTest, EmitType_Bool) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.bool_()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.bool_()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread bool a = false;
+ bool a = false;
}
)");
}
@@ -123,14 +123,14 @@
TEST_F(MslWriterTest, EmitType_F32) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.f32()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.f32()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread float a = 0.0f;
+ float a = 0.0f;
}
)");
}
@@ -138,14 +138,14 @@
TEST_F(MslWriterTest, EmitType_F16) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.f16()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.f16()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread half a = 0.0h;
+ half a = 0.0h;
}
)");
}
@@ -153,14 +153,14 @@
TEST_F(MslWriterTest, EmitType_I32) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.i32()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.i32()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread int a = 0;
+ int a = 0;
}
)");
}
@@ -168,14 +168,14 @@
TEST_F(MslWriterTest, EmitType_Matrix_F32) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.mat2x3<f32>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.mat2x3<f32>()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread float2x3 a = float2x3(0.0f);
+ float2x3 a = float2x3(0.0f);
}
)");
}
@@ -183,28 +183,28 @@
TEST_F(MslWriterTest, EmitType_Matrix_F16) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.mat2x3<f16>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.mat2x3<f16>()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread half2x3 a = half2x3(0.0h);
+ half2x3 a = half2x3(0.0h);
}
)");
}
TEST_F(MslWriterTest, EmitType_U32) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.u32()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.u32()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread uint a = 0u;
+ uint a = 0u;
}
)");
}
@@ -242,14 +242,14 @@
TEST_F(MslWriterTest, EmitType_Vector) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.vec3<f32>()));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.vec3<f32>()));
b.Return(func);
});
ASSERT_TRUE(Generate()) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread float3 a = 0.0f;
+ float3 a = 0.0f;
}
)");
}
@@ -320,7 +320,7 @@
});
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, s));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, s));
b.Return(func);
});
@@ -332,7 +332,7 @@
};
void foo() {
- thread S a = {};
+ S a = {};
}
)");
}
@@ -344,8 +344,8 @@
});
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, s));
- b.Var("b", ty.ptr(core::AddressSpace::kPrivate, s));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, s));
+ b.Var("b", ty.ptr(core::AddressSpace::kFunction, s));
b.Return(func);
});
@@ -357,8 +357,8 @@
};
void foo() {
- thread S a = {};
- thread S b = {};
+ S a = {};
+ S b = {};
}
)");
}
@@ -1145,14 +1145,14 @@
TEST_F(MslWriterTest, EmitType_SubgroupMatrixLeft) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.subgroup_matrix_left(ty.f32(), 8, 8)));
+ b.Var("a", ty.ptr(core::AddressSpace::kFunction, ty.subgroup_matrix_left(ty.f32(), 8, 8)));
b.Return(func);
});
ASSERT_TRUE(Generate({}, validate::MslVersion::kMsl_2_3)) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread simdgroup_float8x8 a = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+ simdgroup_float8x8 a = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
}
)");
}
@@ -1177,14 +1177,15 @@
TEST_F(MslWriterTest, EmitType_SubgroupMatrixResult) {
auto* func = b.Function("foo", ty.void_());
b.Append(func->Block(), [&] {
- b.Var("a", ty.ptr(core::AddressSpace::kPrivate, ty.subgroup_matrix_result(ty.f32(), 8, 8)));
+ b.Var("a",
+ ty.ptr(core::AddressSpace::kFunction, ty.subgroup_matrix_result(ty.f32(), 8, 8)));
b.Return(func);
});
ASSERT_TRUE(Generate({}, validate::MslVersion::kMsl_2_3)) << err_ << output_.msl;
EXPECT_EQ(output_.msl, MetalHeader() + R"(
void foo() {
- thread simdgroup_float8x8 a = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+ simdgroup_float8x8 a = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
}
)");
}