PB: Make Var() and Global() params optional

and allow them in any order.

We're about to add Yet Another optional parameter - access control.
For style, we probably want this field before the decorations, however
that means adding more default values for all the cases where we don't
need to specify the access control.

Instead use some template magic to allow extra parameters to be
specified in any order, and entirely optional, with sensible defaults.
This keeps things readable and without huge code refactorings.

Bug: tint:846
Change-Id: I4f61eb765de63ad98ae786d187d2bd1b42942756
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53087
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
Ben Clayton 2021-06-04 19:55:08 +00:00 committed by Tint LUCI CQ
parent 9fd3befa17
commit 620d77e480
21 changed files with 311 additions and 241 deletions

View File

@ -24,6 +24,8 @@
namespace tint { namespace tint {
ProgramBuilder::VarOptionals::~VarOptionals() = default;
ProgramBuilder::ProgramBuilder() ProgramBuilder::ProgramBuilder()
: id_(ProgramID::New()), : id_(ProgramID::New()),
ast_(ast_nodes_.Create<ast::Module>(id_, Source{})) {} ast_(ast_nodes_.Create<ast::Module>(id_, Source{})) {}

View File

@ -91,6 +91,32 @@ class CloneContext;
/// To construct a Program, populate the builder and then `std::move` it to a /// To construct a Program, populate the builder and then `std::move` it to a
/// Program. /// Program.
class ProgramBuilder { class ProgramBuilder {
/// VarOptionals is a helper for accepting a number of optional, extra
/// arguments for Var() and Global().
struct VarOptionals {
template <typename... ARGS>
explicit VarOptionals(ARGS&&... args) {
Apply(std::forward<ARGS>(args)...);
}
~VarOptionals();
ast::StorageClass storage = ast::StorageClass::kNone;
ast::Expression* constructor = nullptr;
ast::DecorationList decorations = {};
private:
void Set(ast::StorageClass sc) { storage = sc; }
void Set(ast::Expression* c) { constructor = c; }
void Set(const ast::DecorationList& l) { decorations = l; }
template <typename FIRST, typename... ARGS>
void Apply(FIRST&& first, ARGS&&... args) {
Set(std::forward<FIRST>(first));
Apply(std::forward<ARGS>(args)...);
}
void Apply() {}
};
public: public:
/// ASTNodeAllocator is an alias to BlockAllocator<ast::Node> /// ASTNodeAllocator is an alias to BlockAllocator<ast::Node>
using ASTNodeAllocator = BlockAllocator<ast::Node>; using ASTNodeAllocator = BlockAllocator<ast::Node>;
@ -1187,38 +1213,47 @@ class ProgramBuilder {
/// @param name the variable name /// @param name the variable name
/// @param type the variable type /// @param type the variable type
/// @param storage the variable storage class /// @param optional the optional variable settings.
/// @param constructor constructor expression /// Can be any of the following, in any order:
/// @param decorations variable decorations /// * ast::StorageClass - specifies the variable storage class
/// @returns a `ast::Variable` with the given name, storage and type /// * ast::Expression* - specifies the variable's initializer expression
template <typename NAME> /// * ast::DecorationList - specifies the variable's decorations
/// Note that repeated arguments of the same type will use the last argument's
/// value.
/// @returns a `ast::Variable` with the given name, type and additional
/// options
template <typename NAME, typename... OPTIONAL>
ast::Variable* Var(NAME&& name, ast::Variable* Var(NAME&& name,
const ast::Type* type, const ast::Type* type,
ast::StorageClass storage = ast::StorageClass::kNone, OPTIONAL&&... optional) {
ast::Expression* constructor = nullptr,
ast::DecorationList decorations = {}) {
type = ty.MaybeCreateTypename(type); type = ty.MaybeCreateTypename(type);
return create<ast::Variable>(Sym(std::forward<NAME>(name)), storage, type, VarOptionals opts(std::forward<OPTIONAL>(optional)...);
false, constructor, decorations); return create<ast::Variable>(Sym(std::forward<NAME>(name)), opts.storage,
type, false, opts.constructor,
std::move(opts.decorations));
} }
/// @param source the variable source /// @param source the variable source
/// @param name the variable name /// @param name the variable name
/// @param type the variable type /// @param type the variable type
/// @param storage the variable storage class /// @param optional the optional variable settings.
/// @param constructor constructor expression /// Can be any of the following, in any order:
/// @param decorations variable decorations /// * ast::StorageClass - specifies the variable storage class
/// * ast::Expression* - specifies the variable's initializer expression
/// * ast::DecorationList - specifies the variable's decorations
/// Note that repeated arguments of the same type will use the last argument's
/// value.
/// @returns a `ast::Variable` with the given name, storage and type /// @returns a `ast::Variable` with the given name, storage and type
template <typename NAME> template <typename NAME, typename... OPTIONAL>
ast::Variable* Var(const Source& source, ast::Variable* Var(const Source& source,
NAME&& name, NAME&& name,
const ast::Type* type, const ast::Type* type,
ast::StorageClass storage = ast::StorageClass::kNone, OPTIONAL&&... optional) {
ast::Expression* constructor = nullptr,
ast::DecorationList decorations = {}) {
type = ty.MaybeCreateTypename(type); type = ty.MaybeCreateTypename(type);
return create<ast::Variable>(source, Sym(std::forward<NAME>(name)), storage, VarOptionals opts(std::forward<OPTIONAL>(optional)...);
type, false, constructor, decorations); return create<ast::Variable>(source, Sym(std::forward<NAME>(name)),
opts.storage, type, false, opts.constructor,
std::move(opts.decorations));
} }
/// @param name the variable name /// @param name the variable name
@ -1287,19 +1322,21 @@ class ProgramBuilder {
/// @param name the variable name /// @param name the variable name
/// @param type the variable type /// @param type the variable type
/// @param storage the variable storage class /// @param optional the optional variable settings.
/// @param constructor constructor expression /// Can be any of the following, in any order:
/// @param decorations variable decorations /// * ast::StorageClass - specifies the variable storage class
/// * ast::Expression* - specifies the variable's initializer expression
/// * ast::DecorationList - specifies the variable's decorations
/// Note that repeated arguments of the same type will use the last argument's
/// value.
/// @returns a new `ast::Variable`, which is automatically registered as a /// @returns a new `ast::Variable`, which is automatically registered as a
/// global variable with the ast::Module. /// global variable with the ast::Module.
template <typename NAME> template <typename NAME, typename... OPTIONAL>
ast::Variable* Global(NAME&& name, ast::Variable* Global(NAME&& name,
const ast::Type* type, const ast::Type* type,
ast::StorageClass storage, OPTIONAL&&... optional) {
ast::Expression* constructor = nullptr, auto* var = Var(std::forward<NAME>(name), type,
ast::DecorationList decorations = {}) { std::forward<OPTIONAL>(optional)...);
auto* var =
Var(std::forward<NAME>(name), type, storage, constructor, decorations);
AST().AddGlobalVariable(var); AST().AddGlobalVariable(var);
return var; return var;
} }
@ -1307,20 +1344,22 @@ class ProgramBuilder {
/// @param source the variable source /// @param source the variable source
/// @param name the variable name /// @param name the variable name
/// @param type the variable type /// @param type the variable type
/// @param storage the variable storage class /// @param optional the optional variable settings.
/// @param constructor constructor expression /// Can be any of the following, in any order:
/// @param decorations variable decorations /// * ast::StorageClass - specifies the variable storage class
/// * ast::Expression* - specifies the variable's initializer expression
/// * ast::DecorationList - specifies the variable's decorations
/// Note that repeated arguments of the same type will use the last argument's
/// value.
/// @returns a new `ast::Variable`, which is automatically registered as a /// @returns a new `ast::Variable`, which is automatically registered as a
/// global variable with the ast::Module. /// global variable with the ast::Module.
template <typename NAME> template <typename NAME, typename... OPTIONAL>
ast::Variable* Global(const Source& source, ast::Variable* Global(const Source& source,
NAME&& name, NAME&& name,
ast::Type* type, ast::Type* type,
ast::StorageClass storage, OPTIONAL&&... optional) {
ast::Expression* constructor = nullptr, auto* var = Var(source, std::forward<NAME>(name), type,
ast::DecorationList decorations = {}) { std::forward<OPTIONAL>(optional)...);
auto* var = Var(source, std::forward<NAME>(name), type, storage,
constructor, decorations);
AST().AddGlobalVariable(var); AST().AddGlobalVariable(var);
return var; return var;
} }

View File

@ -136,8 +136,8 @@ TEST_F(ResolverAssignmentValidationTest, AssignThroughPointer_Pass) {
// let b : ptr<function,i32> = &a; // let b : ptr<function,i32> = &a;
// *b = 2; // *b = 2;
const auto func = ast::StorageClass::kFunction; const auto func = ast::StorageClass::kFunction;
auto* var_a = Var("a", ty.i32(), func, Expr(2), {}); auto* var_a = Var("a", ty.i32(), func, Expr(2));
auto* var_b = Const("b", ty.pointer<int>(func), AddressOf(Expr("a")), {}); auto* var_b = Const("b", ty.pointer<int>(func), AddressOf(Expr("a")));
WrapInFunction(var_a, var_b, Assign(Source{{12, 34}}, Deref("b"), 2)); WrapInFunction(var_a, var_b, Assign(Source{{12, 34}}, Deref("b"), 2));
EXPECT_TRUE(r()->Resolve()) << r()->error(); EXPECT_TRUE(r()->Resolve()) << r()->error();
@ -166,13 +166,13 @@ TEST_F(ResolverAssignmentValidationTest, AssignNonStorable_Fail) {
return ty.access(ast::AccessControl::kRead, tex_type); return ty.access(ast::AccessControl::kRead, tex_type);
}; };
Global("a", make_type(), ast::StorageClass::kNone, nullptr, Global("a", make_type(), ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
Global("b", make_type(), ast::StorageClass::kNone, nullptr, Global("b", make_type(), ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -554,8 +554,8 @@ TEST_F(ResourceDecorationTest, SamplerMissingBinding) {
TEST_F(ResourceDecorationTest, BindingPairMissingBinding) { TEST_F(ResourceDecorationTest, BindingPairMissingBinding) {
Global(Source{{12, 34}}, "G", ty.sampler(ast::SamplerKind::kSampler), Global(Source{{12, 34}}, "G", ty.sampler(ast::SamplerKind::kSampler),
ast::StorageClass::kNone, nullptr, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -567,8 +567,8 @@ TEST_F(ResourceDecorationTest, BindingPairMissingBinding) {
TEST_F(ResourceDecorationTest, BindingPairMissingGroup) { TEST_F(ResourceDecorationTest, BindingPairMissingGroup) {
Global(Source{{12, 34}}, "G", ty.sampler(ast::SamplerKind::kSampler), Global(Source{{12, 34}}, "G", ty.sampler(ast::SamplerKind::kSampler),
ast::StorageClass::kNone, nullptr, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
}); });
@ -581,15 +581,15 @@ TEST_F(ResourceDecorationTest, BindingPairMissingGroup) {
TEST_F(ResourceDecorationTest, BindingPointUsedTwiceByEntryPoint) { TEST_F(ResourceDecorationTest, BindingPointUsedTwiceByEntryPoint) {
Global(Source{{12, 34}}, "A", Global(Source{{12, 34}}, "A",
ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
ast::StorageClass::kNone, nullptr, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(2), create<ast::GroupDecoration>(2),
}); });
Global(Source{{56, 78}}, "B", Global(Source{{56, 78}}, "B",
ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
ast::StorageClass::kNone, nullptr, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(2), create<ast::GroupDecoration>(2),
}); });
@ -613,15 +613,15 @@ TEST_F(ResourceDecorationTest, BindingPointUsedTwiceByEntryPoint) {
TEST_F(ResourceDecorationTest, BindingPointUsedTwiceByDifferentEntryPoints) { TEST_F(ResourceDecorationTest, BindingPointUsedTwiceByDifferentEntryPoints) {
Global(Source{{12, 34}}, "A", Global(Source{{12, 34}}, "A",
ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
ast::StorageClass::kNone, nullptr, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(2), create<ast::GroupDecoration>(2),
}); });
Global(Source{{56, 78}}, "B", Global(Source{{56, 78}}, "B",
ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
ast::StorageClass::kNone, nullptr, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(2), create<ast::GroupDecoration>(2),
}); });
@ -643,8 +643,8 @@ TEST_F(ResourceDecorationTest, BindingPointUsedTwiceByDifferentEntryPoints) {
} }
TEST_F(ResourceDecorationTest, BindingPointOnNonResource) { TEST_F(ResourceDecorationTest, BindingPointOnNonResource) {
Global(Source{{12, 34}}, "G", ty.f32(), ast::StorageClass::kPrivate, nullptr, Global(Source{{12, 34}}, "G", ty.f32(), ast::StorageClass::kPrivate,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(2), create<ast::GroupDecoration>(2),
}); });

View File

@ -29,8 +29,8 @@ TEST_F(ResolverHostShareableValidationTest, BoolMember) {
auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.bool_())}, auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.bool_())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* a = ty.access(ast::AccessControl::kRead, s); auto* a = ty.access(ast::AccessControl::kRead, s);
Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -48,8 +48,8 @@ TEST_F(ResolverHostShareableValidationTest, BoolVectorMember) {
auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.vec3<bool>())}, auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.vec3<bool>())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* a = ty.access(ast::AccessControl::kRead, s); auto* a = ty.access(ast::AccessControl::kRead, s);
Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -71,8 +71,8 @@ TEST_F(ResolverHostShareableValidationTest, Aliases) {
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
auto* a2 = ty.alias("a2", ac); auto* a2 = ty.alias("a2", ac);
AST().AddConstructedType(a2); AST().AddConstructedType(a2);
Global(Source{{56, 78}}, "g", a2, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", a2, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -94,8 +94,8 @@ TEST_F(ResolverHostShareableValidationTest, NestedStructures) {
auto* s = Structure("S", {Member(Source{{7, 8}}, "m", i3)}, auto* s = Structure("S", {Member(Source{{7, 8}}, "m", i3)},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* a = ty.access(ast::AccessControl::kRead, s); auto* a = ty.access(ast::AccessControl::kRead, s);
Global(Source{{9, 10}}, "g", a, ast::StorageClass::kStorage, nullptr, Global(Source{{9, 10}}, "g", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -136,8 +136,8 @@ TEST_F(ResolverHostShareableValidationTest, NoError) {
auto* s = Structure("S", {Member(Source{{7, 8}}, "m", i3)}, auto* s = Structure("S", {Member(Source{{7, 8}}, "m", i3)},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* a = ty.access(ast::AccessControl::kRead, s); auto* a = ty.access(ast::AccessControl::kRead, s);
Global(Source{{9, 10}}, "g", a, ast::StorageClass::kStorage, nullptr, Global(Source{{9, 10}}, "g", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -245,8 +245,8 @@ class ResolverIntrinsicTest_TextureOperation
const ast::Type* type, const ast::Type* type,
ast::ExpressionList* call_params) { ast::ExpressionList* call_params) {
if (type->UnwrapAll()->is_handle()) { if (type->UnwrapAll()->is_handle()) {
Global(name, type, ast::StorageClass::kNone, nullptr, Global(name, type,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -770,8 +770,8 @@ TEST_F(ResolverIntrinsicDataTest, ArrayLength_Vector) {
auto* str = Structure("S", {Member("x", ary)}, auto* str = Structure("S", {Member("x", ary)},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ac = ty.access(ast::AccessControl::kRead, str); auto* ac = ty.access(ast::AccessControl::kRead, str);
Global("a", ac, ast::StorageClass::kStorage, nullptr, Global("a", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -677,8 +677,8 @@ TEST_F(ResolverTest, Expr_Identifier_FunctionVariable) {
auto* my_var_b = Expr("my_var"); auto* my_var_b = Expr("my_var");
auto* assign = Assign(my_var_a, my_var_b); auto* assign = Assign(my_var_a, my_var_b);
auto* var = Var("my_var", ty.f32(), ast::StorageClass::kNone, nullptr, auto* var = Var("my_var", ty.f32(),
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -788,8 +788,8 @@ TEST_F(ResolverTest, Function_RegisterInputOutputVariables) {
auto* in_var = Global("in_var", ty.f32(), ast::StorageClass::kInput); auto* in_var = Global("in_var", ty.f32(), ast::StorageClass::kInput);
auto* out_var = Global("out_var", ty.f32(), ast::StorageClass::kOutput); auto* out_var = Global("out_var", ty.f32(), ast::StorageClass::kOutput);
auto* sb_var = Global("sb_var", a, ast::StorageClass::kStorage, nullptr, auto* sb_var = Global("sb_var", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -827,8 +827,8 @@ TEST_F(ResolverTest, Function_RegisterInputOutputVariables_SubFunction) {
auto* in_var = Global("in_var", ty.f32(), ast::StorageClass::kInput); auto* in_var = Global("in_var", ty.f32(), ast::StorageClass::kInput);
auto* out_var = Global("out_var", ty.f32(), ast::StorageClass::kOutput); auto* out_var = Global("out_var", ty.f32(), ast::StorageClass::kOutput);
auto* sb_var = Global("sb_var", a, ast::StorageClass::kStorage, nullptr, auto* sb_var = Global("sb_var", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -1727,8 +1727,8 @@ INSTANTIATE_TEST_SUITE_P(ResolverTest,
ast::UnaryOp::kNot)); ast::UnaryOp::kNot));
TEST_F(ResolverTest, StorageClass_SetsIfMissing) { TEST_F(ResolverTest, StorageClass_SetsIfMissing) {
auto* var = Var("var", ty.i32(), ast::StorageClass::kNone, nullptr, auto* var = Var("var", ty.i32(),
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -1743,8 +1743,8 @@ TEST_F(ResolverTest, StorageClass_SetsIfMissing) {
TEST_F(ResolverTest, StorageClass_SetForSampler) { TEST_F(ResolverTest, StorageClass_SetForSampler) {
auto* t = ty.sampler(ast::SamplerKind::kSampler); auto* t = ty.sampler(ast::SamplerKind::kSampler);
auto* var = Global("var", t, ast::StorageClass::kNone, nullptr, auto* var = Global("var", t,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -1758,8 +1758,8 @@ TEST_F(ResolverTest, StorageClass_SetForSampler) {
TEST_F(ResolverTest, StorageClass_SetForTexture) { TEST_F(ResolverTest, StorageClass_SetForTexture) {
auto* t = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32()); auto* t = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
auto* ac = ty.access(ast::AccessControl::kRead, t); auto* ac = ty.access(ast::AccessControl::kRead, t);
auto* var = Global("var", ac, ast::StorageClass::kNone, nullptr, auto* var = Global("var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -36,8 +36,8 @@ TEST_F(ResolverStorageClassValidationTest, GlobalVariableNoStorageClass_Fail) {
TEST_F(ResolverStorageClassValidationTest, StorageBufferBool) { TEST_F(ResolverStorageClassValidationTest, StorageBufferBool) {
// var<storage> g : i32; // var<storage> g : i32;
Global(Source{{56, 78}}, "g", ty.i32(), ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", ty.i32(), ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -52,8 +52,8 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferBool) {
TEST_F(ResolverStorageClassValidationTest, StorageBufferPointer) { TEST_F(ResolverStorageClassValidationTest, StorageBufferPointer) {
// var<storage> g : ptr<i32, input>; // var<storage> g : ptr<i32, input>;
Global(Source{{56, 78}}, "g", ty.pointer<i32>(ast::StorageClass::kInput), Global(Source{{56, 78}}, "g", ty.pointer<i32>(ast::StorageClass::kInput),
ast::StorageClass::kStorage, nullptr, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -70,8 +70,8 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferArray) {
auto* s = Structure("S", {Member("a", ty.f32())}); auto* s = Structure("S", {Member("a", ty.f32())});
auto* a = ty.array(s, 3); auto* a = ty.array(s, 3);
auto* ac = ty.access(ast::AccessControl::kRead, a); auto* ac = ty.access(ast::AccessControl::kRead, a);
Global(Source{{56, 78}}, "g", ac, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -88,8 +88,8 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferBoolAlias) {
// var<storage> g : [[access(read)]] a; // var<storage> g : [[access(read)]] a;
auto* a = ty.alias("a", ty.bool_()); auto* a = ty.alias("a", ty.bool_());
AST().AddConstructedType(a); AST().AddConstructedType(a);
Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -104,8 +104,8 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferBoolAlias) {
TEST_F(ResolverStorageClassValidationTest, StorageBufferNoAccessControl) { TEST_F(ResolverStorageClassValidationTest, StorageBufferNoAccessControl) {
// var<storage> g : S; // var<storage> g : S;
auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.i32())}); auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.i32())});
Global(Source{{56, 78}}, "g", s, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", s, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -122,8 +122,8 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferNoBlockDecoration) {
// var<storage> g : [[access(read)]] S; // var<storage> g : [[access(read)]] S;
auto* s = Structure(Source{{12, 34}}, "S", {Member("x", ty.i32())}); auto* s = Structure(Source{{12, 34}}, "S", {Member("x", ty.i32())});
auto* a = ty.access(ast::AccessControl::kRead, s); auto* a = ty.access(ast::AccessControl::kRead, s);
Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -142,8 +142,8 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferNoError_Basic) {
auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.i32())}, auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.i32())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* a = ty.access(ast::AccessControl::kRead, s); auto* a = ty.access(ast::AccessControl::kRead, s);
Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", a, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -163,8 +163,8 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferNoError_Aliases) {
auto* ac = ty.access(ast::AccessControl::kRead, a1); auto* ac = ty.access(ast::AccessControl::kRead, a1);
auto* a2 = ty.alias("a2", ac); auto* a2 = ty.alias("a2", ac);
AST().AddConstructedType(a2); AST().AddConstructedType(a2);
Global(Source{{56, 78}}, "g", a2, ast::StorageClass::kStorage, nullptr, Global(Source{{56, 78}}, "g", a2, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -177,8 +177,7 @@ TEST_F(ResolverStorageClassValidationTest, StorageBufferNoError_Aliases) {
TEST_F(ResolverStorageClassValidationTest, UniformBufferBool) { TEST_F(ResolverStorageClassValidationTest, UniformBufferBool) {
// var<uniform> g : bool; // var<uniform> g : bool;
Global(Source{{56, 78}}, "g", ty.bool_(), ast::StorageClass::kUniform, Global(Source{{56, 78}}, "g", ty.bool_(), ast::StorageClass::kUniform,
nullptr, ast::DecorationList{
{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -193,8 +192,8 @@ TEST_F(ResolverStorageClassValidationTest, UniformBufferBool) {
TEST_F(ResolverStorageClassValidationTest, UniformBufferPointer) { TEST_F(ResolverStorageClassValidationTest, UniformBufferPointer) {
// var<uniform> g : ptr<i32, input>; // var<uniform> g : ptr<i32, input>;
Global(Source{{56, 78}}, "g", ty.pointer<i32>(ast::StorageClass::kInput), Global(Source{{56, 78}}, "g", ty.pointer<i32>(ast::StorageClass::kInput),
ast::StorageClass::kUniform, nullptr, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -211,8 +210,8 @@ TEST_F(ResolverStorageClassValidationTest, UniformBufferArray) {
auto* s = Structure("S", {Member("a", ty.f32())}); auto* s = Structure("S", {Member("a", ty.f32())});
auto* a = ty.array(s, 3); auto* a = ty.array(s, 3);
auto* ac = ty.access(ast::AccessControl::kRead, a); auto* ac = ty.access(ast::AccessControl::kRead, a);
Global(Source{{56, 78}}, "g", ac, ast::StorageClass::kUniform, nullptr, Global(Source{{56, 78}}, "g", ac, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -229,8 +228,8 @@ TEST_F(ResolverStorageClassValidationTest, UniformBufferBoolAlias) {
// var<uniform> g : [[access(read)]] a; // var<uniform> g : [[access(read)]] a;
auto* a = ty.alias("a", ty.bool_()); auto* a = ty.alias("a", ty.bool_());
AST().AddConstructedType(a); AST().AddConstructedType(a);
Global(Source{{56, 78}}, "g", a, ast::StorageClass::kUniform, nullptr, Global(Source{{56, 78}}, "g", a, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -246,8 +245,8 @@ TEST_F(ResolverStorageClassValidationTest, UniformBufferNoBlockDecoration) {
// struct S { x : i32 }; // struct S { x : i32 };
// var<uniform> g : S; // var<uniform> g : S;
auto* s = Structure(Source{{12, 34}}, "S", {Member("x", ty.i32())}); auto* s = Structure(Source{{12, 34}}, "S", {Member("x", ty.i32())});
Global(Source{{56, 78}}, "g", s, ast::StorageClass::kUniform, nullptr, Global(Source{{56, 78}}, "g", s, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -265,8 +264,8 @@ TEST_F(ResolverStorageClassValidationTest, UniformBufferNoError_Basic) {
// var<uniform> g : S; // var<uniform> g : S;
auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.i32())}, auto* s = Structure("S", {Member(Source{{12, 34}}, "x", ty.i32())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global(Source{{56, 78}}, "g", s, ast::StorageClass::kUniform, nullptr, Global(Source{{56, 78}}, "g", s, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -282,8 +281,8 @@ TEST_F(ResolverStorageClassValidationTest, UniformBufferNoError_Aliases) {
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* a1 = ty.alias("a1", s); auto* a1 = ty.alias("a1", s);
AST().AddConstructedType(a1); AST().AddConstructedType(a1);
Global(Source{{56, 78}}, "g", a1, ast::StorageClass::kUniform, nullptr, Global(Source{{56, 78}}, "g", a1, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -173,13 +173,13 @@ TEST_F(ResolverStorageClassUseTest, StructMultipleStorageClassUses) {
auto* s = Structure("S", {Member("a", ty.f32())}, auto* s = Structure("S", {Member("a", ty.f32())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("x", s, ast::StorageClass::kUniform, nullptr, Global("x", s, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
Global("y", ac, ast::StorageClass::kStorage, nullptr, Global("y", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -345,8 +345,7 @@ TEST_F(ResolverValidationTest, StorageClass_NonFunctionClassError) {
TEST_F(ResolverValidationTest, StorageClass_SamplerExplicitStorageClass) { TEST_F(ResolverValidationTest, StorageClass_SamplerExplicitStorageClass) {
auto* t = ty.sampler(ast::SamplerKind::kSampler); auto* t = ty.sampler(ast::SamplerKind::kSampler);
Global(Source{{12, 34}}, "var", t, ast::StorageClass::kUniformConstant, Global(Source{{12, 34}}, "var", t, ast::StorageClass::kUniformConstant,
nullptr, ast::DecorationList{
{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -361,8 +360,7 @@ TEST_F(ResolverValidationTest, StorageClass_SamplerExplicitStorageClass) {
TEST_F(ResolverValidationTest, StorageClass_TextureExplicitStorageClass) { TEST_F(ResolverValidationTest, StorageClass_TextureExplicitStorageClass) {
auto* t = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32()); auto* t = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
Global(Source{{12, 34}}, "var", t, ast::StorageClass::kUniformConstant, Global(Source{{12, 34}}, "var", t, ast::StorageClass::kUniformConstant,
nullptr, ast::DecorationList{
{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -152,7 +152,7 @@ void Msl::HandlePrivateAndWorkgroupVariables(CloneContext& ctx) const {
auto* constructor = ctx.Clone(var->Declaration()->constructor()); auto* constructor = ctx.Clone(var->Declaration()->constructor());
auto* local_var = auto* local_var =
ctx.dst->Var(ctx.dst->Sym(), store_type, var->StorageClass(), ctx.dst->Var(ctx.dst->Sym(), store_type, var->StorageClass(),
constructor, {disable_validation}); constructor, ast::DecorationList{disable_validation});
ctx.InsertBefore(func_ast->body()->statements(), ctx.InsertBefore(func_ast->body()->statements(),
*func_ast->body()->begin(), ctx.dst->Decl(local_var)); *func_ast->body()->begin(), ctx.dst->Decl(local_var));

View File

@ -264,8 +264,9 @@ void Spirv::EmitVertexPointSize(CloneContext& ctx) const {
// Create a module-scope pointsize builtin output variable. // Create a module-scope pointsize builtin output variable.
Symbol pointsize = ctx.dst->Symbols().New("tint_pointsize"); Symbol pointsize = ctx.dst->Symbols().New("tint_pointsize");
ctx.dst->Global(pointsize, ctx.dst->ty.f32(), ast::StorageClass::kOutput, ctx.dst->Global(
nullptr, {ctx.dst->Builtin(ast::Builtin::kPointSize)}); pointsize, ctx.dst->ty.f32(), ast::StorageClass::kOutput,
ast::DecorationList{ctx.dst->Builtin(ast::Builtin::kPointSize)});
// Assign 1.0 to the global at the start of all vertex shader entry points. // Assign 1.0 to the global at the start of all vertex shader entry points.
ctx.ReplaceAll([&ctx, pointsize](ast::Function* func) -> ast::Function* { ctx.ReplaceAll([&ctx, pointsize](ast::Function* func) -> ast::Function* {

View File

@ -327,9 +327,11 @@ TEST_F(HlslGeneratorImplTest_Function,
Emit_Decoration_EntryPoint_With_Uniform) { Emit_Decoration_EntryPoint_With_Uniform) {
auto* ubo_ty = Structure("UBO", {Member("coord", ty.vec4<f32>())}, auto* ubo_ty = Structure("UBO", {Member("coord", ty.vec4<f32>())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ubo = Global( auto* ubo = Global("ubo", ubo_ty, ast::StorageClass::kUniform,
"ubo", ubo_ty, ast::StorageClass::kUniform, nullptr, ast::DecorationList{
{create<ast::BindingDecoration>(0), create<ast::GroupDecoration>(1)}); create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1),
});
Func("sub_func", Func("sub_func",
{ {
@ -380,8 +382,8 @@ TEST_F(HlslGeneratorImplTest_Function,
auto* s = Structure("Uniforms", {Member("coord", ty.vec4<f32>())}, auto* s = Structure("Uniforms", {Member("coord", ty.vec4<f32>())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global("uniforms", s, ast::StorageClass::kUniform, nullptr, Global("uniforms", s, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -428,8 +430,8 @@ TEST_F(HlslGeneratorImplTest_Function,
auto* ac = ty.access(ast::AccessControl::kReadWrite, s); auto* ac = ty.access(ast::AccessControl::kReadWrite, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -474,8 +476,8 @@ TEST_F(HlslGeneratorImplTest_Function,
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -520,8 +522,8 @@ TEST_F(HlslGeneratorImplTest_Function,
auto* ac = ty.access(ast::AccessControl::kWrite, s); auto* ac = ty.access(ast::AccessControl::kWrite, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -563,8 +565,8 @@ TEST_F(HlslGeneratorImplTest_Function,
auto* ac = ty.access(ast::AccessControl::kReadWrite, s); auto* ac = ty.access(ast::AccessControl::kReadWrite, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -599,18 +601,18 @@ void frag_main() {
TEST_F( TEST_F(
HlslGeneratorImplTest_Function, HlslGeneratorImplTest_Function,
Emit_Decoration_Called_By_EntryPoints_WithLocationGlobals_And_Params) { // NOLINT Emit_Decoration_Called_By_EntryPoints_WithLocationGlobals_And_Params) { // NOLINT
Global("foo", ty.f32(), ast::StorageClass::kInput, nullptr, Global("foo", ty.f32(), ast::StorageClass::kInput,
{ ast::DecorationList{
Location(0), Location(0),
}); });
Global("bar", ty.f32(), ast::StorageClass::kOutput, nullptr, Global("bar", ty.f32(), ast::StorageClass::kOutput,
{ ast::DecorationList{
Location(1), Location(1),
}); });
Global("val", ty.f32(), ast::StorageClass::kOutput, nullptr, Global("val", ty.f32(), ast::StorageClass::kOutput,
{ ast::DecorationList{
Location(0), Location(0),
}); });
@ -661,8 +663,8 @@ ep_1_out ep_1(ep_1_in tint_in) {
TEST_F(HlslGeneratorImplTest_Function, TEST_F(HlslGeneratorImplTest_Function,
Emit_Decoration_Called_By_EntryPoints_NoUsedGlobals) { Emit_Decoration_Called_By_EntryPoints_NoUsedGlobals) {
Global("depth", ty.f32(), ast::StorageClass::kOutput, nullptr, Global("depth", ty.f32(), ast::StorageClass::kOutput,
{ ast::DecorationList{
Builtin(ast::Builtin::kFragDepth), Builtin(ast::Builtin::kFragDepth),
}); });
@ -706,13 +708,13 @@ ep_1_out ep_1() {
TEST_F( TEST_F(
HlslGeneratorImplTest_Function, HlslGeneratorImplTest_Function,
Emit_Decoration_Called_By_EntryPoints_WithBuiltinGlobals_And_Params) { // NOLINT Emit_Decoration_Called_By_EntryPoints_WithBuiltinGlobals_And_Params) { // NOLINT
Global("coord", ty.vec4<f32>(), ast::StorageClass::kInput, nullptr, Global("coord", ty.vec4<f32>(), ast::StorageClass::kInput,
{ ast::DecorationList{
Builtin(ast::Builtin::kPosition), Builtin(ast::Builtin::kPosition),
}); });
Global("depth", ty.f32(), ast::StorageClass::kOutput, nullptr, Global("depth", ty.f32(), ast::StorageClass::kOutput,
{ ast::DecorationList{
Builtin(ast::Builtin::kFragDepth), Builtin(ast::Builtin::kFragDepth),
}); });
@ -762,8 +764,8 @@ TEST_F(HlslGeneratorImplTest_Function,
Emit_Decoration_Called_By_EntryPoint_With_Uniform) { Emit_Decoration_Called_By_EntryPoint_With_Uniform) {
auto* s = Structure("S", {Member("x", ty.f32())}, auto* s = Structure("S", {Member("x", ty.f32())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global("coord", s, ast::StorageClass::kUniform, nullptr, Global("coord", s, ast::StorageClass::kUniform,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -813,8 +815,8 @@ TEST_F(HlslGeneratorImplTest_Function,
auto* s = Structure("S", {Member("x", ty.f32())}, auto* s = Structure("S", {Member("x", ty.f32())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ac = ty.access(ast::AccessControl::kReadWrite, s); auto* ac = ty.access(ast::AccessControl::kReadWrite, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });
@ -859,8 +861,8 @@ void frag_main() {
TEST_F(HlslGeneratorImplTest_Function, TEST_F(HlslGeneratorImplTest_Function,
Emit_Decoration_EntryPoints_WithGlobal_Nested_Return) { Emit_Decoration_EntryPoints_WithGlobal_Nested_Return) {
Global("bar", ty.f32(), ast::StorageClass::kOutput, nullptr, Global("bar", ty.f32(), ast::StorageClass::kOutput,
{ ast::DecorationList{
Location(1), Location(1),
}); });
@ -1064,8 +1066,8 @@ TEST_F(HlslGeneratorImplTest_Function,
auto* ac = ty.access(ast::AccessControl::kReadWrite, s); auto* ac = ty.access(ast::AccessControl::kReadWrite, s);
Global("data", ac, ast::StorageClass::kStorage, nullptr, Global("data", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -35,8 +35,8 @@ TEST_F(HlslSanitizerTest, ArrayLength) {
}); });
auto* ac_ty = ty.access(ast::AccessControl::kRead, sb_ty); auto* ac_ty = ty.access(ast::AccessControl::kRead, sb_ty);
Global("sb", ac_ty, ast::StorageClass::kStorage, nullptr, Global("sb", ac_ty, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
}); });

View File

@ -190,8 +190,8 @@ TEST_F(HlslGeneratorImplTest_Type, EmitType_StructDecl_OmittedIfStorageBuffer) {
}, },
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global("g", ty.access(ast::AccessControl::kReadWrite, s), Global("g", ty.access(ast::AccessControl::kReadWrite, s),
ast::StorageClass::kStorage, nullptr, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -308,8 +308,11 @@ TEST_F(MslGeneratorImplTest,
auto* ac = ty.access(ast::AccessControl::kReadWrite, s); auto* ac = ty.access(ast::AccessControl::kReadWrite, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{create<ast::BindingDecoration>(0), create<ast::GroupDecoration>(1)}); ast::DecorationList{
create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1),
});
auto* var = Var("v", ty.f32(), ast::StorageClass::kNone, auto* var = Var("v", ty.f32(), ast::StorageClass::kNone,
MemberAccessor("coord", "b")); MemberAccessor("coord", "b"));
@ -353,8 +356,11 @@ TEST_F(MslGeneratorImplTest,
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{create<ast::BindingDecoration>(0), create<ast::GroupDecoration>(1)}); ast::DecorationList{
create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1),
});
auto* var = Var("v", ty.f32(), ast::StorageClass::kNone, auto* var = Var("v", ty.f32(), ast::StorageClass::kNone,
MemberAccessor("coord", "b")); MemberAccessor("coord", "b"));
@ -391,11 +397,16 @@ fragment void frag_main(const device Data& coord [[buffer(0)]]) {
TEST_F( TEST_F(
MslGeneratorImplTest, MslGeneratorImplTest,
Emit_Decoration_Called_By_EntryPoints_WithLocationGlobals_And_Params) { // NOLINT Emit_Decoration_Called_By_EntryPoints_WithLocationGlobals_And_Params) { // NOLINT
Global("foo", ty.f32(), ast::StorageClass::kInput, nullptr, {Location(0)}); Global("foo", ty.f32(), ast::StorageClass::kInput,
ast::DecorationList{Location(0)});
Global("bar", ty.f32(), ast::StorageClass::kOutput, nullptr, {Location(1)}); Global("bar", ty.f32(), ast::StorageClass::kOutput,
ast::DecorationList{
Location(1),
});
Global("val", ty.f32(), ast::StorageClass::kOutput, nullptr, {Location(0)}); Global("val", ty.f32(), ast::StorageClass::kOutput,
ast::DecorationList{Location(0)});
ast::VariableList params; ast::VariableList params;
params.push_back(Param("param", ty.f32())); params.push_back(Param("param", ty.f32()));
@ -448,8 +459,8 @@ fragment ep_1_out ep_1(ep_1_in _tint_in [[stage_in]]) {
// TODO(crbug.com/tint/697): Remove this test // TODO(crbug.com/tint/697): Remove this test
TEST_F(MslGeneratorImplTest, TEST_F(MslGeneratorImplTest,
Emit_Decoration_Called_By_EntryPoints_NoUsedGlobals) { Emit_Decoration_Called_By_EntryPoints_NoUsedGlobals) {
Global("depth", ty.f32(), ast::StorageClass::kOutput, nullptr, Global("depth", ty.f32(), ast::StorageClass::kOutput,
{Builtin(ast::Builtin::kFragDepth)}); ast::DecorationList{Builtin(ast::Builtin::kFragDepth)});
ast::VariableList params; ast::VariableList params;
params.push_back(Param("param", ty.f32())); params.push_back(Param("param", ty.f32()));
@ -497,11 +508,11 @@ fragment ep_1_out ep_1() {
TEST_F( TEST_F(
MslGeneratorImplTest, MslGeneratorImplTest,
Emit_Decoration_Called_By_EntryPoints_WithBuiltinGlobals_And_Params) { // NOLINT Emit_Decoration_Called_By_EntryPoints_WithBuiltinGlobals_And_Params) { // NOLINT
Global("coord", ty.vec4<f32>(), ast::StorageClass::kInput, nullptr, Global("coord", ty.vec4<f32>(), ast::StorageClass::kInput,
{Builtin(ast::Builtin::kPosition)}); ast::DecorationList{Builtin(ast::Builtin::kPosition)});
Global("depth", ty.f32(), ast::StorageClass::kOutput, nullptr, Global("depth", ty.f32(), ast::StorageClass::kOutput,
{Builtin(ast::Builtin::kFragDepth)}); ast::DecorationList{Builtin(ast::Builtin::kFragDepth)});
ast::VariableList params; ast::VariableList params;
params.push_back(Param("param", ty.f32())); params.push_back(Param("param", ty.f32()));
@ -551,9 +562,11 @@ TEST_F(MslGeneratorImplTest,
Emit_Decoration_Called_By_EntryPoint_With_Uniform) { Emit_Decoration_Called_By_EntryPoint_With_Uniform) {
auto* ubo_ty = Structure("UBO", {Member("coord", ty.vec4<f32>())}, auto* ubo_ty = Structure("UBO", {Member("coord", ty.vec4<f32>())},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ubo = Global( auto* ubo = Global("ubo", ubo_ty, ast::StorageClass::kUniform,
"ubo", ubo_ty, ast::StorageClass::kUniform, nullptr, ast::DecorationList{
{create<ast::BindingDecoration>(0), create<ast::GroupDecoration>(1)}); create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1),
});
Func("sub_func", Func("sub_func",
{ {
@ -609,8 +622,11 @@ TEST_F(MslGeneratorImplTest,
auto* ac = ty.access(ast::AccessControl::kReadWrite, s); auto* ac = ty.access(ast::AccessControl::kReadWrite, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{create<ast::BindingDecoration>(0), create<ast::GroupDecoration>(1)}); ast::DecorationList{
create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1),
});
ast::VariableList params; ast::VariableList params;
params.push_back(Param("param", ty.f32())); params.push_back(Param("param", ty.f32()));
@ -665,8 +681,11 @@ TEST_F(MslGeneratorImplTest,
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("coord", ac, ast::StorageClass::kStorage, nullptr, Global("coord", ac, ast::StorageClass::kStorage,
{create<ast::BindingDecoration>(0), create<ast::GroupDecoration>(1)}); ast::DecorationList{
create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(1),
});
ast::VariableList params; ast::VariableList params;
params.push_back(Param("param", ty.f32())); params.push_back(Param("param", ty.f32()));
@ -713,7 +732,10 @@ fragment void frag_main(const device Data& coord [[buffer(0)]]) {
// TODO(crbug.com/tint/697): Remove this test // TODO(crbug.com/tint/697): Remove this test
TEST_F(MslGeneratorImplTest, TEST_F(MslGeneratorImplTest,
Emit_Decoration_EntryPoints_WithGlobal_Nested_Return) { Emit_Decoration_EntryPoints_WithGlobal_Nested_Return) {
Global("bar", ty.f32(), ast::StorageClass::kOutput, nullptr, {Location(1)}); Global("bar", ty.f32(), ast::StorageClass::kOutput,
ast::DecorationList{
Location(1),
});
auto* list = Block(Return()); auto* list = Block(Return());
@ -804,8 +826,11 @@ TEST_F(MslGeneratorImplTest,
auto* ac = ty.access(ast::AccessControl::kReadWrite, s); auto* ac = ty.access(ast::AccessControl::kReadWrite, s);
Global("data", ac, ast::StorageClass::kStorage, nullptr, Global("data", ac, ast::StorageClass::kStorage,
{create<ast::BindingDecoration>(0), create<ast::GroupDecoration>(0)}); ast::DecorationList{
create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0),
});
{ {
auto* var = Var("v", ty.f32(), ast::StorageClass::kNone, auto* var = Var("v", ty.f32(), ast::StorageClass::kNone,

View File

@ -233,8 +233,8 @@ TEST_F(MslGeneratorImplTest, EmitType_Struct_Layout_NonComposites) {
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global("G", ty.access(ast::AccessControl::kRead, s), Global("G", ty.access(ast::AccessControl::kRead, s),
ast::StorageClass::kStorage, nullptr, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -343,8 +343,8 @@ TEST_F(MslGeneratorImplTest, EmitType_Struct_Layout_Structures) {
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global("G", ty.access(ast::AccessControl::kRead, s), Global("G", ty.access(ast::AccessControl::kRead, s),
ast::StorageClass::kStorage, nullptr, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -438,8 +438,8 @@ TEST_F(MslGeneratorImplTest, EmitType_Struct_Layout_ArrayDefaultStride) {
ast::DecorationList{create<ast::StructBlockDecoration>()}); ast::DecorationList{create<ast::StructBlockDecoration>()});
Global("G", ty.access(ast::AccessControl::kRead, s), Global("G", ty.access(ast::AccessControl::kRead, s),
ast::StorageClass::kStorage, nullptr, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -552,8 +552,8 @@ TEST_F(MslGeneratorImplTest, AttemptTintPadSymbolCollision) {
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global("G", ty.access(ast::AccessControl::kRead, s), Global("G", ty.access(ast::AccessControl::kRead, s),
ast::StorageClass::kStorage, nullptr, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -618,8 +618,8 @@ TEST_F(MslGeneratorImplTest, DISABLED_EmitType_Struct_WithDecoration) {
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
Global("G", ty.access(ast::AccessControl::kRead, s), Global("G", ty.access(ast::AccessControl::kRead, s),
ast::StorageClass::kStorage, nullptr, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -774,8 +774,8 @@ TEST_P(MslStorageTexturesTest, Emit) {
auto* s = ty.storage_texture(params.dim, ast::ImageFormat::kR32Float); auto* s = ty.storage_texture(params.dim, ast::ImageFormat::kR32Float);
auto* ac = ty.access( auto* ac = ty.access(
params.ro ? ast::AccessControl::kRead : ast::AccessControl::kWrite, s); params.ro ? ast::AccessControl::kRead : ast::AccessControl::kWrite, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -404,8 +404,8 @@ TEST_F(BuilderTest, GlobalVar_DeclReadOnly) {
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ac = ty.access(ast::AccessControl::kRead, A); auto* ac = ty.access(ast::AccessControl::kRead, A);
auto* var = Global("b", ac, ast::StorageClass::kStorage, nullptr, auto* var = Global("b", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -445,8 +445,8 @@ TEST_F(BuilderTest, GlobalVar_TypeAliasDeclReadOnly) {
auto* B = ty.alias("B", A); auto* B = ty.alias("B", A);
AST().AddConstructedType(B); AST().AddConstructedType(B);
auto* ac = ty.access(ast::AccessControl::kRead, B); auto* ac = ty.access(ast::AccessControl::kRead, B);
auto* var = Global("b", ac, ast::StorageClass::kStorage, nullptr, auto* var = Global("b", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -484,8 +484,8 @@ TEST_F(BuilderTest, GlobalVar_TypeAliasAssignReadOnly) {
auto* ac = ty.access(ast::AccessControl::kRead, A); auto* ac = ty.access(ast::AccessControl::kRead, A);
auto* B = ty.alias("B", ac); auto* B = ty.alias("B", ac);
AST().AddConstructedType(B); AST().AddConstructedType(B);
auto* var = Global("b", B, ast::StorageClass::kStorage, nullptr, auto* var = Global("b", B, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -523,13 +523,13 @@ TEST_F(BuilderTest, GlobalVar_TwoVarDeclReadOnly) {
auto* read = ty.access(ast::AccessControl::kRead, A); auto* read = ty.access(ast::AccessControl::kRead, A);
auto* rw = ty.access(ast::AccessControl::kReadWrite, A); auto* rw = ty.access(ast::AccessControl::kReadWrite, A);
auto* var_b = Global("b", read, ast::StorageClass::kStorage, nullptr, auto* var_b = Global("b", read, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
}); });
auto* var_c = Global("c", rw, ast::StorageClass::kStorage, nullptr, auto* var_c = Global("c", rw, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::GroupDecoration>(1), create<ast::GroupDecoration>(1),
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
}); });
@ -569,8 +569,8 @@ TEST_F(BuilderTest, GlobalVar_TextureStorageReadOnly) {
auto* ac = ty.access(ast::AccessControl::kRead, type); auto* ac = ty.access(ast::AccessControl::kRead, type);
auto* var_a = Global("a", ac, ast::StorageClass::kNone, nullptr, auto* var_a = Global("a", ac, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -598,8 +598,8 @@ TEST_F(BuilderTest, GlobalVar_TextureStorageWriteOnly) {
auto* ac = ty.access(ast::AccessControl::kWrite, type); auto* ac = ty.access(ast::AccessControl::kWrite, type);
auto* var_a = Global("a", ac, ast::StorageClass::kNone, nullptr, auto* var_a = Global("a", ac, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -628,8 +628,8 @@ TEST_F(BuilderTest, GlobalVar_TextureStorageWithDifferentAccess) {
auto* type_a = ty.access(ast::AccessControl::kRead, auto* type_a = ty.access(ast::AccessControl::kRead,
ty.storage_texture(ast::TextureDimension::k2d, ty.storage_texture(ast::TextureDimension::k2d,
ast::ImageFormat::kR32Uint)); ast::ImageFormat::kR32Uint));
auto* var_a = Global("a", type_a, ast::StorageClass::kNone, nullptr, auto* var_a = Global("a", type_a, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -637,8 +637,8 @@ TEST_F(BuilderTest, GlobalVar_TextureStorageWithDifferentAccess) {
auto* type_b = ty.access(ast::AccessControl::kWrite, auto* type_b = ty.access(ast::AccessControl::kWrite,
ty.storage_texture(ast::TextureDimension::k2d, ty.storage_texture(ast::TextureDimension::k2d,
ast::ImageFormat::kR32Uint)); ast::ImageFormat::kR32Uint));
auto* var_b = Global("b", type_b, ast::StorageClass::kNone, nullptr, auto* var_b = Global("b", type_b, ast::StorageClass::kNone,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -521,14 +521,14 @@ TEST_F(IntrinsicBuilderTest, Call_TextureSampleCompare_Twice) {
auto* s = ty.sampler(ast::SamplerKind::kComparisonSampler); auto* s = ty.sampler(ast::SamplerKind::kComparisonSampler);
auto* t = ty.depth_texture(ast::TextureDimension::k2d); auto* t = ty.depth_texture(ast::TextureDimension::k2d);
auto* tex = Global("texture", t, ast::StorageClass::kNone, nullptr, auto* tex = Global("texture", t,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
auto* sampler = Global("sampler", s, ast::StorageClass::kNone, nullptr, auto* sampler = Global("sampler", s,
{ ast::DecorationList{
create<ast::BindingDecoration>(1), create<ast::BindingDecoration>(1),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -31,8 +31,8 @@ TEST_F(BuilderTest_Type, GenerateRuntimeArray) {
auto* str = Structure("S", {Member("x", ary)}, auto* str = Structure("S", {Member("x", ary)},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ac = ty.access(ast::AccessControl::kRead, str); auto* ac = ty.access(ast::AccessControl::kRead, str);
Global("a", ac, ast::StorageClass::kStorage, nullptr, Global("a", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -53,8 +53,8 @@ TEST_F(BuilderTest_Type, ReturnsGeneratedRuntimeArray) {
auto* str = Structure("S", {Member("x", ary)}, auto* str = Structure("S", {Member("x", ary)},
{create<ast::StructBlockDecoration>()}); {create<ast::StructBlockDecoration>()});
auto* ac = ty.access(ast::AccessControl::kRead, str); auto* ac = ty.access(ast::AccessControl::kRead, str);
Global("a", ac, ast::StorageClass::kStorage, nullptr, Global("a", ac, ast::StorageClass::kStorage,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -834,8 +834,8 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_1d) {
ast::ImageFormat::kR32Float); ast::ImageFormat::kR32Float);
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -854,8 +854,8 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_2d) {
ast::ImageFormat::kR32Float); ast::ImageFormat::kR32Float);
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -874,8 +874,8 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_2dArray) {
ast::ImageFormat::kR32Float); ast::ImageFormat::kR32Float);
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -894,8 +894,8 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_3d) {
ast::ImageFormat::kR32Float); ast::ImageFormat::kR32Float);
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -915,8 +915,8 @@ TEST_F(BuilderTest_Type,
ast::ImageFormat::kR32Float); ast::ImageFormat::kR32Float);
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -936,8 +936,8 @@ TEST_F(BuilderTest_Type,
ast::ImageFormat::kR32Sint); ast::ImageFormat::kR32Sint);
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });
@ -957,8 +957,8 @@ TEST_F(BuilderTest_Type,
ast::ImageFormat::kR32Uint); ast::ImageFormat::kR32Uint);
auto* ac = ty.access(ast::AccessControl::kRead, s); auto* ac = ty.access(ast::AccessControl::kRead, s);
Global("test_var", ac, ast::StorageClass::kNone, nullptr, Global("test_var", ac,
{ ast::DecorationList{
create<ast::BindingDecoration>(0), create<ast::BindingDecoration>(0),
create<ast::GroupDecoration>(0), create<ast::GroupDecoration>(0),
}); });

View File

@ -100,9 +100,11 @@ TEST_F(WgslGeneratorImplTest, Emit_GlobalsInterleaved) {
} }
TEST_F(WgslGeneratorImplTest, Emit_Global_Sampler) { TEST_F(WgslGeneratorImplTest, Emit_Global_Sampler) {
Global("s", ty.sampler(ast::SamplerKind::kSampler), ast::StorageClass::kNone, Global("s", ty.sampler(ast::SamplerKind::kSampler),
nullptr, ast::DecorationList{
{create<ast::GroupDecoration>(0), create<ast::BindingDecoration>(0)}); create<ast::GroupDecoration>(0),
create<ast::BindingDecoration>(0),
});
GeneratorImpl& gen = Build(); GeneratorImpl& gen = Build();
@ -115,8 +117,10 @@ TEST_F(WgslGeneratorImplTest, Emit_Global_Sampler) {
TEST_F(WgslGeneratorImplTest, Emit_Global_Texture) { TEST_F(WgslGeneratorImplTest, Emit_Global_Texture) {
auto* st = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32()); auto* st = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
Global("t", ty.access(ast::AccessControl::kRead, st), Global("t", ty.access(ast::AccessControl::kRead, st),
ast::StorageClass::kNone, nullptr, ast::DecorationList{
{create<ast::GroupDecoration>(0), create<ast::BindingDecoration>(0)}); create<ast::GroupDecoration>(0),
create<ast::BindingDecoration>(0),
});
GeneratorImpl& gen = Build(); GeneratorImpl& gen = Build();