tint/writer/msl: Generate an array<T,N> helper
And remove the WrapArraysInStructs transform.
Wrapping arrays in structures becomes troublesome for `const` arrays, as
currently WGSL does not allow `const` structures.
MSL 2.0+ has a builtin array<> helper, but we're targetting MSL 1.2, so
we have to emit our own. Fortunately, it can be done with a few lines of
templated code.
This produces significantly cleaner output.
Change-Id: Ifc92ef21e09befa252a07c856c4b5afdc51cc2e4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/94540
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 2ba988c..be99389 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -543,8 +543,6 @@
"transform/vertex_pulling.h",
"transform/while_to_loop.cc",
"transform/while_to_loop.h",
- "transform/wrap_arrays_in_structs.cc",
- "transform/wrap_arrays_in_structs.h",
"transform/zero_init_workgroup_memory.cc",
"transform/zero_init_workgroup_memory.h",
"utils/bitcast.h",
@@ -1199,7 +1197,6 @@
"transform/vectorize_scalar_matrix_constructors_test.cc",
"transform/vertex_pulling_test.cc",
"transform/while_to_loop_test.cc",
- "transform/wrap_arrays_in_structs_test.cc",
"transform/zero_init_workgroup_memory_test.cc",
]
}
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 3734367..10d81d6 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -466,8 +466,6 @@
transform/vertex_pulling.h
transform/while_to_loop.cc
transform/while_to_loop.h
- transform/wrap_arrays_in_structs.cc
- transform/wrap_arrays_in_structs.h
transform/zero_init_workgroup_memory.cc
transform/zero_init_workgroup_memory.h
utils/bitcast.h
@@ -1121,7 +1119,6 @@
transform/vectorize_scalar_matrix_constructors_test.cc
transform/vertex_pulling_test.cc
transform/while_to_loop_test.cc
- transform/wrap_arrays_in_structs_test.cc
transform/zero_init_workgroup_memory_test.cc
transform/utils/get_insertion_point_test.cc
transform/utils/hoist_to_decl_before_test.cc
diff --git a/src/tint/transform/wrap_arrays_in_structs.cc b/src/tint/transform/wrap_arrays_in_structs.cc
deleted file mode 100644
index eb133d7..0000000
--- a/src/tint/transform/wrap_arrays_in_structs.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "src/tint/transform/wrap_arrays_in_structs.h"
-
-#include <utility>
-
-#include "src/tint/program_builder.h"
-#include "src/tint/sem/array.h"
-#include "src/tint/sem/call.h"
-#include "src/tint/sem/expression.h"
-#include "src/tint/sem/type_constructor.h"
-#include "src/tint/utils/map.h"
-#include "src/tint/utils/transform.h"
-
-TINT_INSTANTIATE_TYPEINFO(tint::transform::WrapArraysInStructs);
-
-namespace tint::transform {
-
-WrapArraysInStructs::WrappedArrayInfo::WrappedArrayInfo() = default;
-WrapArraysInStructs::WrappedArrayInfo::WrappedArrayInfo(const WrappedArrayInfo&) = default;
-WrapArraysInStructs::WrappedArrayInfo::~WrappedArrayInfo() = default;
-
-WrapArraysInStructs::WrapArraysInStructs() = default;
-
-WrapArraysInStructs::~WrapArraysInStructs() = default;
-
-bool WrapArraysInStructs::ShouldRun(const Program* program, const DataMap&) const {
- for (auto* node : program->ASTNodes().Objects()) {
- if (program->Sem().Get<sem::Array>(node->As<ast::Type>())) {
- return true;
- }
- }
- return false;
-}
-
-void WrapArraysInStructs::Run(CloneContext& ctx, const DataMap&, DataMap&) const {
- auto& sem = ctx.src->Sem();
-
- std::unordered_map<const sem::Array*, WrappedArrayInfo> wrapped_arrays;
- auto wrapper = [&](const sem::Array* array) { return WrapArray(ctx, wrapped_arrays, array); };
- auto wrapper_typename = [&](const sem::Array* arr) -> ast::TypeName* {
- auto info = wrapper(arr);
- return info ? ctx.dst->create<ast::TypeName>(info.wrapper_name) : nullptr;
- };
-
- // Replace all array types with their corresponding wrapper
- ctx.ReplaceAll([&](const ast::Type* ast_type) -> const ast::Type* {
- auto* type = ctx.src->TypeOf(ast_type);
- if (auto* array = type->UnwrapRef()->As<sem::Array>()) {
- return wrapper_typename(array);
- }
- return nullptr;
- });
-
- // Fix up index accessors so `a[1]` becomes `a.arr[1]`
- ctx.ReplaceAll(
- [&](const ast::IndexAccessorExpression* accessor) -> const ast::IndexAccessorExpression* {
- if (auto* array =
- ::tint::As<sem::Array>(sem.Get(accessor->object)->Type()->UnwrapRef())) {
- if (wrapper(array)) {
- // Array is wrapped in a structure. Emit a member accessor to get
- // to the actual array.
- auto* arr = ctx.Clone(accessor->object);
- auto* idx = ctx.Clone(accessor->index);
- auto* unwrapped = ctx.dst->MemberAccessor(arr, "arr");
- return ctx.dst->IndexAccessor(accessor->source, unwrapped, idx);
- }
- }
- return nullptr;
- });
-
- // Fix up array constructors so `A(1,2)` becomes `tint_array_wrapper(A(1,2))`
- ctx.ReplaceAll([&](const ast::CallExpression* expr) -> const ast::Expression* {
- if (auto* call = sem.Get(expr)->UnwrapMaterialize()->As<sem::Call>()) {
- if (auto* ctor = call->Target()->As<sem::TypeConstructor>()) {
- if (auto* array = ctor->ReturnType()->As<sem::Array>()) {
- if (auto w = wrapper(array)) {
- // Wrap the array type constructor with another constructor for
- // the wrapper
- auto* wrapped_array_ty = ctx.dst->ty.type_name(w.wrapper_name);
- auto* array_ty = w.array_type(ctx);
- auto args = utils::Transform(call->Arguments(),
- [&](const tint::sem::Expression* s) {
- return ctx.Clone(s->Declaration());
- });
- auto* arr_ctor = ctx.dst->Construct(array_ty, args);
- return ctx.dst->Construct(wrapped_array_ty, arr_ctor);
- }
- }
- }
- }
- return nullptr;
- });
-
- ctx.Clone();
-}
-
-WrapArraysInStructs::WrappedArrayInfo WrapArraysInStructs::WrapArray(
- CloneContext& ctx,
- std::unordered_map<const sem::Array*, WrappedArrayInfo>& wrapped_arrays,
- const sem::Array* array) const {
- if (array->IsRuntimeSized()) {
- return {}; // We don't want to wrap runtime sized arrays
- }
-
- return utils::GetOrCreate(wrapped_arrays, array, [&] {
- WrappedArrayInfo info;
-
- // Generate a unique name for the array wrapper
- info.wrapper_name = ctx.dst->Symbols().New("tint_array_wrapper");
-
- // Examine the element type. Is it also an array?
- std::function<const ast::Type*(CloneContext&)> el_type;
- if (auto* el_array = array->ElemType()->As<sem::Array>()) {
- // Array of array - call WrapArray() on the element type
- if (auto el = WrapArray(ctx, wrapped_arrays, el_array)) {
- el_type = [=](CloneContext& c) {
- return c.dst->create<ast::TypeName>(el.wrapper_name);
- };
- }
- }
-
- // If the element wasn't an array, just create the typical AST type for it
- if (!el_type) {
- el_type = [=](CloneContext& c) { return CreateASTTypeFor(c, array->ElemType()); };
- }
-
- // Construct the single structure field type
- info.array_type = [=](CloneContext& c) {
- ast::AttributeList attrs;
- if (!array->IsStrideImplicit()) {
- attrs.emplace_back(c.dst->create<ast::StrideAttribute>(array->Stride()));
- }
- return c.dst->ty.array(el_type(c), u32(array->Count()), std::move(attrs));
- };
-
- // Structure() will create and append the ast::Struct to the
- // global declarations of `ctx.dst`. As we haven't finished building the
- // current module-scope statement or function, this will be placed
- // immediately before the usage.
- ctx.dst->Structure(info.wrapper_name, {ctx.dst->Member("arr", info.array_type(ctx))});
- return info;
- });
-}
-
-} // namespace tint::transform
diff --git a/src/tint/transform/wrap_arrays_in_structs.h b/src/tint/transform/wrap_arrays_in_structs.h
deleted file mode 100644
index 4653c6b..0000000
--- a/src/tint/transform/wrap_arrays_in_structs.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef SRC_TINT_TRANSFORM_WRAP_ARRAYS_IN_STRUCTS_H_
-#define SRC_TINT_TRANSFORM_WRAP_ARRAYS_IN_STRUCTS_H_
-
-#include <string>
-#include <unordered_map>
-
-#include "src/tint/transform/transform.h"
-
-// Forward declarations
-namespace tint::ast {
-class Type;
-} // namespace tint::ast
-
-namespace tint::transform {
-
-/// WrapArraysInStructs is a transform that replaces all array types with a
-/// structure holding a single field of that array type.
-/// Array index expressions and constructors are also adjusted to deal with this
-/// wrapping.
-/// This transform helps with backends that cannot directly return arrays or use
-/// them as parameters.
-class WrapArraysInStructs : public Castable<WrapArraysInStructs, Transform> {
- public:
- /// Constructor
- WrapArraysInStructs();
-
- /// Destructor
- ~WrapArraysInStructs() override;
-
- /// @param program the program to inspect
- /// @param data optional extra transform-specific input data
- /// @returns true if this transform should be run for the given program
- bool ShouldRun(const Program* program, const DataMap& data = {}) const override;
-
- protected:
- /// Runs the transform using the CloneContext built for transforming a
- /// program. Run() is responsible for calling Clone() on the CloneContext.
- /// @param ctx the CloneContext primed with the input program and
- /// ProgramBuilder
- /// @param inputs optional extra transform-specific input data
- /// @param outputs optional extra transform-specific output data
- void Run(CloneContext& ctx, const DataMap& inputs, DataMap& outputs) const override;
-
- private:
- struct WrappedArrayInfo {
- WrappedArrayInfo();
- WrappedArrayInfo(const WrappedArrayInfo&);
- ~WrappedArrayInfo();
-
- Symbol wrapper_name;
- std::function<const ast::Type*(CloneContext&)> array_type;
-
- operator bool() { return wrapper_name.IsValid(); }
- };
-
- /// WrapArray wraps the fixed-size array type in a new structure (if it hasn't
- /// already been wrapped). WrapArray will recursively wrap arrays-of-arrays.
- /// The new structure will be added to module-scope type declarations of
- /// `ctx.dst`.
- /// @param ctx the CloneContext
- /// @param wrapped_arrays a map of src array type to the wrapped structure
- /// name
- /// @param array the array type
- /// @return the name of the structure that wraps the array, or an invalid
- /// Symbol if this array should not be wrapped
- WrappedArrayInfo WrapArray(
- CloneContext& ctx,
- std::unordered_map<const sem::Array*, WrappedArrayInfo>& wrapped_arrays,
- const sem::Array* array) const;
-};
-
-} // namespace tint::transform
-
-#endif // SRC_TINT_TRANSFORM_WRAP_ARRAYS_IN_STRUCTS_H_
diff --git a/src/tint/transform/wrap_arrays_in_structs_test.cc b/src/tint/transform/wrap_arrays_in_structs_test.cc
deleted file mode 100644
index 7a7a6b3..0000000
--- a/src/tint/transform/wrap_arrays_in_structs_test.cc
+++ /dev/null
@@ -1,422 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "src/tint/transform/wrap_arrays_in_structs.h"
-
-#include <memory>
-#include <utility>
-
-#include "src/tint/transform/test_helper.h"
-
-namespace tint::transform {
-namespace {
-
-using WrapArraysInStructsTest = TransformTest;
-
-TEST_F(WrapArraysInStructsTest, ShouldRunEmptyModule) {
- auto* src = R"()";
-
- EXPECT_FALSE(ShouldRun<WrapArraysInStructs>(src));
-}
-
-TEST_F(WrapArraysInStructsTest, ShouldRunHasArray) {
- auto* src = R"(
-var<private> arr : array<i32, 4>;
-)";
-
- EXPECT_TRUE(ShouldRun<WrapArraysInStructs>(src));
-}
-
-TEST_F(WrapArraysInStructsTest, EmptyModule) {
- auto* src = R"()";
- auto* expect = src;
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArrayAsGlobal) {
- auto* src = R"(
-var<private> arr : array<i32, 4>;
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 4u>,
-}
-
-var<private> arr : tint_array_wrapper;
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArrayAsFunctionVar) {
- auto* src = R"(
-fn f() {
- var arr : array<i32, 4>;
- let x = arr[3];
-}
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 4u>,
-}
-
-fn f() {
- var arr : tint_array_wrapper;
- let x = arr.arr[3];
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArrayAsParam) {
- auto* src = R"(
-fn f(a : array<i32, 4>) -> i32 {
- return a[2];
-}
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 4u>,
-}
-
-fn f(a : tint_array_wrapper) -> i32 {
- return a.arr[2];
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArrayAsReturn) {
- auto* src = R"(
-fn f() -> array<i32, 4> {
- return array<i32, 4>(1, 2, 3, 4);
-}
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 4u>,
-}
-
-fn f() -> tint_array_wrapper {
- return tint_array_wrapper(array<i32, 4u>(1, 2, 3, 4));
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArrayAlias) {
- auto* src = R"(
-type Inner = array<i32, 2>;
-type Array = array<Inner, 2>;
-
-fn f() {
- var arr : Array;
- arr = Array();
- arr = Array(Inner(1, 2), Inner(3, 4));
- let vals : Array = Array(Inner(1, 2), Inner(3, 4));
- arr = vals;
- let x = arr[3];
-}
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 2u>,
-}
-
-type Inner = tint_array_wrapper;
-
-struct tint_array_wrapper_1 {
- arr : array<tint_array_wrapper, 2u>,
-}
-
-type Array = tint_array_wrapper_1;
-
-fn f() {
- var arr : tint_array_wrapper_1;
- arr = tint_array_wrapper_1(array<tint_array_wrapper, 2u>());
- arr = tint_array_wrapper_1(array<tint_array_wrapper, 2u>(tint_array_wrapper(array<i32, 2u>(1, 2)), tint_array_wrapper(array<i32, 2u>(3, 4))));
- let vals : tint_array_wrapper_1 = tint_array_wrapper_1(array<tint_array_wrapper, 2u>(tint_array_wrapper(array<i32, 2u>(1, 2)), tint_array_wrapper(array<i32, 2u>(3, 4))));
- arr = vals;
- let x = arr.arr[3];
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArrayAlias_OutOfOrder) {
- auto* src = R"(
-fn f() {
- var arr : Array;
- arr = Array();
- arr = Array(Inner(1, 2), Inner(3, 4));
- let vals : Array = Array(Inner(1, 2), Inner(3, 4));
- arr = vals;
- let x = arr[3];
-}
-
-type Array = array<Inner, 2>;
-type Inner = array<i32, 2>;
-)";
- auto* expect = R"(
-struct tint_array_wrapper_1 {
- arr : array<i32, 2u>,
-}
-
-struct tint_array_wrapper {
- arr : array<tint_array_wrapper_1, 2u>,
-}
-
-fn f() {
- var arr : tint_array_wrapper;
- arr = tint_array_wrapper(array<tint_array_wrapper_1, 2u>());
- arr = tint_array_wrapper(array<tint_array_wrapper_1, 2u>(tint_array_wrapper_1(array<i32, 2u>(1, 2)), tint_array_wrapper_1(array<i32, 2u>(3, 4))));
- let vals : tint_array_wrapper = tint_array_wrapper(array<tint_array_wrapper_1, 2u>(tint_array_wrapper_1(array<i32, 2u>(1, 2)), tint_array_wrapper_1(array<i32, 2u>(3, 4))));
- arr = vals;
- let x = arr.arr[3];
-}
-
-type Array = tint_array_wrapper;
-
-type Inner = tint_array_wrapper_1;
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArraysInStruct) {
- auto* src = R"(
-struct S {
- a : array<i32, 4>,
- b : array<i32, 8>,
- c : array<i32, 4>,
-};
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 4u>,
-}
-
-struct tint_array_wrapper_1 {
- arr : array<i32, 8u>,
-}
-
-struct S {
- a : tint_array_wrapper,
- b : tint_array_wrapper_1,
- c : tint_array_wrapper,
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, ArraysOfArraysInStruct) {
- auto* src = R"(
-struct S {
- a : array<i32, 4>,
- b : array<array<i32, 4>, 4>,
- c : array<array<array<i32, 4>, 4>, 4>,
-};
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 4u>,
-}
-
-struct tint_array_wrapper_1 {
- arr : array<tint_array_wrapper, 4u>,
-}
-
-struct tint_array_wrapper_2 {
- arr : array<tint_array_wrapper_1, 4u>,
-}
-
-struct S {
- a : tint_array_wrapper,
- b : tint_array_wrapper_1,
- c : tint_array_wrapper_2,
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, AccessArraysOfArraysInStruct) {
- auto* src = R"(
-struct S {
- a : array<i32, 4>,
- b : array<array<i32, 4>, 4>,
- c : array<array<array<i32, 4>, 4>, 4>,
-};
-
-fn f(s : S) -> i32 {
- return s.a[2] + s.b[1][2] + s.c[3][1][2];
-}
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 4u>,
-}
-
-struct tint_array_wrapper_1 {
- arr : array<tint_array_wrapper, 4u>,
-}
-
-struct tint_array_wrapper_2 {
- arr : array<tint_array_wrapper_1, 4u>,
-}
-
-struct S {
- a : tint_array_wrapper,
- b : tint_array_wrapper_1,
- c : tint_array_wrapper_2,
-}
-
-fn f(s : S) -> i32 {
- return ((s.a.arr[2] + s.b.arr[1].arr[2]) + s.c.arr[3].arr[1].arr[2]);
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, DeclarationOrder) {
- auto* src = R"(
-type T0 = i32;
-
-type T1 = array<i32, 1>;
-
-type T2 = i32;
-
-fn f1(a : array<i32, 2>) {
-}
-
-type T3 = i32;
-
-fn f2() {
- var v : array<i32, 3>;
-}
-)";
- auto* expect = R"(
-type T0 = i32;
-
-struct tint_array_wrapper {
- arr : array<i32, 1u>,
-}
-
-type T1 = tint_array_wrapper;
-
-type T2 = i32;
-
-struct tint_array_wrapper_1 {
- arr : array<i32, 2u>,
-}
-
-fn f1(a : tint_array_wrapper_1) {
-}
-
-type T3 = i32;
-
-struct tint_array_wrapper_2 {
- arr : array<i32, 3u>,
-}
-
-fn f2() {
- var v : tint_array_wrapper_2;
-}
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(WrapArraysInStructsTest, DeclarationOrder_OutOfOrder) {
- auto* src = R"(
-fn f2() {
- var v : array<i32, 3>;
-}
-
-type T3 = i32;
-
-fn f1(a : array<i32, 2>) {
-}
-
-type T2 = i32;
-
-type T1 = array<i32, 1>;
-
-type T0 = i32;
-)";
- auto* expect = R"(
-struct tint_array_wrapper {
- arr : array<i32, 3u>,
-}
-
-fn f2() {
- var v : tint_array_wrapper;
-}
-
-type T3 = i32;
-
-struct tint_array_wrapper_1 {
- arr : array<i32, 2u>,
-}
-
-fn f1(a : tint_array_wrapper_1) {
-}
-
-type T2 = i32;
-
-struct tint_array_wrapper_2 {
- arr : array<i32, 1u>,
-}
-
-type T1 = tint_array_wrapper_2;
-
-type T0 = i32;
-)";
-
- auto got = Run<WrapArraysInStructs>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-} // namespace
-} // namespace tint::transform
diff --git a/src/tint/writer/msl/generator_impl.cc b/src/tint/writer/msl/generator_impl.cc
index 971d16d..7df2ffb 100644
--- a/src/tint/writer/msl/generator_impl.cc
+++ b/src/tint/writer/msl/generator_impl.cc
@@ -71,7 +71,6 @@
#include "src/tint/transform/unshadow.h"
#include "src/tint/transform/unwind_discard_functions.h"
#include "src/tint/transform/vectorize_scalar_matrix_constructors.h"
-#include "src/tint/transform/wrap_arrays_in_structs.h"
#include "src/tint/transform/zero_init_workgroup_memory.h"
#include "src/tint/utils/defer.h"
#include "src/tint/utils/map.h"
@@ -208,7 +207,6 @@
manager.Add<transform::PromoteInitializersToConstVar>();
manager.Add<transform::VectorizeScalarMatrixConstructors>();
- manager.Add<transform::WrapArraysInStructs>();
manager.Add<transform::RemovePhonies>();
manager.Add<transform::SimplifyPointers>();
// ArrayLengthFromUniform must come after SimplifyPointers, as
@@ -731,13 +729,33 @@
const sem::TypeConstructor* ctor) {
auto* type = ctor->ReturnType();
- if (type->IsAnyOf<sem::Array, sem::Struct>()) {
- out << "{";
- } else {
- if (!EmitType(out, type, "")) {
- return false;
- }
- out << "(";
+ const char* terminator = ")";
+ TINT_DEFER(out << terminator);
+
+ bool ok = Switch(
+ type,
+ [&](const sem::Array*) {
+ if (!EmitType(out, type, "")) {
+ return false;
+ }
+ out << "{";
+ terminator = "}";
+ return true;
+ },
+ [&](const sem::Struct*) {
+ out << "{";
+ terminator = "}";
+ return true;
+ },
+ [&](Default) {
+ if (!EmitType(out, type, "")) {
+ return false;
+ }
+ out << "(";
+ return true;
+ });
+ if (!ok) {
+ return false;
}
int i = 0;
@@ -760,11 +778,6 @@
i++;
}
- if (type->IsAnyOf<sem::Array, sem::Struct>()) {
- out << "}";
- } else {
- out << ")";
- }
return true;
}
@@ -1561,10 +1574,9 @@
ScopedParen sp(out);
return EmitZeroValue(out, mat->type());
},
- [&](const sem::Array* arr) {
- out << "{";
- TINT_DEFER(out << "}");
- return EmitZeroValue(out, arr->ElemType());
+ [&](const sem::Array*) {
+ out << "{}";
+ return true;
},
[&](const sem::Struct*) {
out << "{}";
@@ -1772,8 +1784,8 @@
if (!EmitType(out, type, param_name)) {
return false;
}
- // Parameter name is output as part of the type for arrays and pointers.
- if (!type->Is<sem::Array>() && !type->Is<sem::Pointer>()) {
+ // Parameter name is output as part of the type for pointers.
+ if (!type->Is<sem::Pointer>()) {
out << " " << program_->Symbols().NameFor(v->symbol);
}
}
@@ -1896,8 +1908,8 @@
if (!EmitType(out, type, param_name)) {
return false;
}
- // Parameter name is output as part of the type for arrays and pointers.
- if (!type->Is<sem::Array>() && !type->Is<sem::Pointer>()) {
+ // Parameter name is output as part of the type for pointers.
+ if (!type->Is<sem::Pointer>()) {
out << " " << param_name;
}
@@ -2412,29 +2424,12 @@
<< "unhandled atomic type " << atomic->Type()->FriendlyName(builder_.Symbols());
return false;
},
- [&](const sem::Array* ary) {
- const sem::Type* base_type = ary;
- std::vector<uint32_t> sizes;
- while (auto* arr = base_type->As<sem::Array>()) {
- if (arr->IsRuntimeSized()) {
- sizes.push_back(1);
- } else {
- sizes.push_back(arr->Count());
- }
- base_type = arr->ElemType();
- }
- if (!EmitType(out, base_type, "")) {
+ [&](const sem::Array* arr) {
+ out << ArrayType() << "<";
+ if (!EmitType(out, arr->ElemType(), "")) {
return false;
}
- if (!name.empty()) {
- out << " " << name;
- if (name_printed) {
- *name_printed = true;
- }
- }
- for (uint32_t size : sizes) {
- out << "[" << size << "]";
- }
+ out << ", " << (arr->IsRuntimeSized() ? 1u : arr->Count()) << ">";
return true;
},
[&](const sem::Bool*) {
@@ -2469,22 +2464,12 @@
return false;
}
out << " ";
- if (ptr->StoreType()->Is<sem::Array>()) {
- std::string inner = "(*" + name + ")";
- if (!EmitType(out, ptr->StoreType(), inner)) {
- return false;
- }
- if (name_printed) {
- *name_printed = true;
- }
- } else {
- if (!EmitType(out, ptr->StoreType(), "")) {
- return false;
- }
- out << "* " << name;
- if (name_printed) {
- *name_printed = true;
- }
+ if (!EmitType(out, ptr->StoreType(), "")) {
+ return false;
+ }
+ out << "* " << name;
+ if (name_printed) {
+ *name_printed = true;
}
return true;
},
@@ -2700,7 +2685,7 @@
auto out = line(b);
add_byte_offset_comment(out, msl_offset);
- out << "int8_t " << name << "[" << size << "];";
+ out << ArrayType() << "<int8_t, " << size << "> " << name << ";";
};
b->IncrementIndent();
@@ -2738,11 +2723,7 @@
auto* ty = mem->Type();
- // Array member name will be output with the type
- if (!ty->Is<sem::Array>()) {
- out << " " << mem_name;
- }
-
+ out << " " << mem_name;
// Emit attributes
if (auto* decl = mem->Declaration()) {
for (auto* attr : decl->attributes) {
@@ -2945,8 +2926,8 @@
if (!EmitType(out, type, name)) {
return false;
}
- // Variable name is output as part of the type for arrays and pointers.
- if (!type->Is<sem::Array>() && !type->Is<sem::Pointer>()) {
+ // Variable name is output as part of the type for pointers.
+ if (!type->Is<sem::Pointer>()) {
out << " " << name;
}
@@ -2995,8 +2976,8 @@
return false;
}
- // Variable name is output as part of the type for arrays and pointers.
- if (!type->Is<sem::Array>() && !type->Is<sem::Pointer>()) {
+ // Variable name is output as part of the type for pointers.
+ if (!type->Is<sem::Pointer>()) {
out << " " << name;
}
@@ -3018,9 +2999,7 @@
if (!EmitType(out, type, program_->Symbols().NameFor(let->symbol))) {
return false;
}
- if (!type->Is<sem::Array>()) {
- out << " " << program_->Symbols().NameFor(let->symbol);
- }
+ out << " " << program_->Symbols().NameFor(let->symbol);
if (let->constructor != nullptr) {
out << " = ";
@@ -3042,9 +3021,7 @@
if (!EmitType(out, type, program_->Symbols().NameFor(override->symbol))) {
return false;
}
- if (!type->Is<sem::Array>()) {
- out << " " << program_->Symbols().NameFor(override->symbol);
- }
+ out << " " << program_->Symbols().NameFor(override->symbol);
out << " [[function_constant(" << global->ConstantId() << ")]];";
@@ -3117,8 +3094,8 @@
[&](const sem::Array* arr) {
if (!arr->IsStrideImplicit()) {
- TINT_ICE(Writer, diagnostics_) << "arrays with explicit strides not "
- "exist past the SPIR-V reader";
+ TINT_ICE(Writer, diagnostics_)
+ << "arrays with explicit strides should not exist past the SPIR-V reader";
return SizeAndAlign{};
}
auto num_els = std::max<uint32_t>(arr->Count(), 1);
@@ -3205,4 +3182,25 @@
return true;
}
+const std::string& GeneratorImpl::ArrayType() {
+ if (array_template_name_.empty()) {
+ array_template_name_ = UniqueIdentifier("tint_array");
+ auto* buf = &helpers_;
+ line(buf) << "template<typename T, size_t N>";
+ line(buf) << "struct " << array_template_name_ << " {";
+ line(buf) << " const constant T& operator[](size_t i) const constant"
+ << " { return elements[i]; }";
+ for (auto* space : {"device", "thread", "threadgroup"}) {
+ line(buf) << " " << space << " T& operator[](size_t i) " << space
+ << " { return elements[i]; }";
+ line(buf) << " const " << space << " T& operator[](size_t i) const " << space
+ << " { return elements[i]; }";
+ }
+ line(buf) << " T elements[N];";
+ line(buf) << "};";
+ line(buf);
+ }
+ return array_template_name_;
+}
+
} // namespace tint::writer::msl
diff --git a/src/tint/writer/msl/generator_impl.h b/src/tint/writer/msl/generator_impl.h
index d80d501..f0d4e8c 100644
--- a/src/tint/writer/msl/generator_impl.h
+++ b/src/tint/writer/msl/generator_impl.h
@@ -425,6 +425,10 @@
const sem::Builtin* builtin,
F&& build);
+ /// @returns the name of the templated tint_array helper type, generating it if this is the
+ /// first call.
+ const std::string& ArrayType();
+
TextBuffer helpers_; // Helper functions emitted at the top of the output
/// @returns the MSL packed type size and alignment in bytes for the given
@@ -439,13 +443,17 @@
utils::UnorderedKeyWrapper<std::tuple<ast::StorageClass, const sem::Struct*>>;
std::unordered_map<ACEWKeyType, std::string> atomicCompareExchangeWeak_;
- /// Unique name of the 'TINT_INVARIANT' preprocessor define. Non-empty only if
- /// an invariant attribute has been generated.
+ /// Unique name of the 'TINT_INVARIANT' preprocessor define.
+ /// Non-empty only if an invariant attribute has been generated.
std::string invariant_define_name_;
/// True if matrix-packed_vector operator overloads have been generated.
bool matrix_packed_vector_overloads_ = false;
+ /// Unique name of the tint_array<T, N> template.
+ /// Non-empty only if the template has been generated.
+ std::string array_template_name_;
+
/// A map from entry point name to a list of dynamic workgroup allocations.
/// Each entry in the vector is the size of the workgroup allocation that
/// should be created for that index.
diff --git a/src/tint/writer/msl/generator_impl_function_test.cc b/src/tint/writer/msl/generator_impl_function_test.cc
index f7d2779..4ef8b12 100644
--- a/src/tint/writer/msl/generator_impl_function_test.cc
+++ b/src/tint/writer/msl/generator_impl_function_test.cc
@@ -591,11 +591,20 @@
EXPECT_EQ(gen.result(), R"( #include <metal_stdlib>
using namespace metal;
- struct tint_array_wrapper {
- float arr[5];
- };
- void my_func(tint_array_wrapper a) {
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+ void my_func(tint_array<float, 5> a) {
return;
}
@@ -616,12 +625,21 @@
EXPECT_EQ(gen.result(), R"( #include <metal_stdlib>
using namespace metal;
- struct tint_array_wrapper {
- float arr[5];
- };
- tint_array_wrapper my_func() {
- tint_array_wrapper const tint_symbol = {.arr={}};
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+ tint_array<float, 5> my_func() {
+ tint_array<float, 5> const tint_symbol = tint_array<float, 5>{};
return tint_symbol;
}
diff --git a/src/tint/writer/msl/generator_impl_module_constant_test.cc b/src/tint/writer/msl/generator_impl_module_constant_test.cc
index f23e51a..12d1cf0 100644
--- a/src/tint/writer/msl/generator_impl_module_constant_test.cc
+++ b/src/tint/writer/msl/generator_impl_module_constant_test.cc
@@ -28,7 +28,7 @@
GeneratorImpl& gen = Build();
ASSERT_TRUE(gen.EmitProgramConstVariable(var)) << gen.error();
- EXPECT_EQ(gen.result(), "constant float pos[3] = {1.0f, 2.0f, 3.0f};\n");
+ EXPECT_EQ(gen.result(), "constant tint_array<float, 3> pos = tint_array<float, 3>{1.0f, 2.0f, 3.0f};\n");
}
TEST_F(MslGeneratorImplTest, Emit_SpecConstant) {
diff --git a/src/tint/writer/msl/generator_impl_sanitizer_test.cc b/src/tint/writer/msl/generator_impl_sanitizer_test.cc
index 475025c..9b9f30b 100644
--- a/src/tint/writer/msl/generator_impl_sanitizer_test.cc
+++ b/src/tint/writer/msl/generator_impl_sanitizer_test.cc
@@ -50,12 +50,25 @@
auto* expect = R"(#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct my_struct {
- float a[1];
+ tint_array<float, 1> a;
};
fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(30)]]) {
@@ -95,13 +108,26 @@
auto* expect = R"(#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct my_struct {
float z;
- float a[1];
+ tint_array<float, 1> a;
};
fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(30)]]) {
@@ -143,12 +169,25 @@
auto* expect = R"(#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct my_struct {
- float a[1];
+ tint_array<float, 1> a;
};
fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(30)]]) {
@@ -196,12 +235,25 @@
auto* expect = R"(#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol {
- /* 0x0000 */ uint4 buffer_size[2];
+ /* 0x0000 */ tint_array<uint4, 2> buffer_size;
};
struct my_struct {
- float a[1];
+ tint_array<float, 1> a;
};
fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(29)]]) {
diff --git a/src/tint/writer/msl/generator_impl_test.cc b/src/tint/writer/msl/generator_impl_test.cc
index 183fef5..914b693 100644
--- a/src/tint/writer/msl/generator_impl_test.cc
+++ b/src/tint/writer/msl/generator_impl_test.cc
@@ -188,25 +188,34 @@
EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- float2x2 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct tint_symbol_3 {
- tint_array_wrapper m;
+ tint_array<float2x2, 4> m;
};
-void comp_main_inner(uint local_invocation_index, threadgroup tint_array_wrapper* const tint_symbol) {
+void comp_main_inner(uint local_invocation_index, threadgroup tint_array<float2x2, 4>* const tint_symbol) {
for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) {
uint const i = idx;
- (*(tint_symbol)).arr[i] = float2x2(float2(0.0f), float2(0.0f));
+ (*(tint_symbol))[i] = float2x2(float2(0.0f), float2(0.0f));
}
threadgroup_barrier(mem_flags::mem_threadgroup);
- tint_array_wrapper const x = *(tint_symbol);
+ tint_array<float2x2, 4> const x = *(tint_symbol);
}
kernel void comp_main(threadgroup tint_symbol_3* tint_symbol_2 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
- threadgroup tint_array_wrapper* const tint_symbol_1 = &((*(tint_symbol_2)).m);
+ threadgroup tint_array<float2x2, 4>* const tint_symbol_1 = &((*(tint_symbol_2)).m);
comp_main_inner(local_invocation_index, tint_symbol_1);
return;
}
diff --git a/src/tint/writer/msl/generator_impl_type_test.cc b/src/tint/writer/msl/generator_impl_type_test.cc
index 257468b..b8ab89d 100644
--- a/src/tint/writer/msl/generator_impl_type_test.cc
+++ b/src/tint/writer/msl/generator_impl_type_test.cc
@@ -31,6 +31,20 @@
namespace tint::writer::msl {
namespace {
+void FormatMSLField(std::stringstream& out,
+ const char* addr,
+ const char* type,
+ size_t array_count,
+ const char* name) {
+ out << " /* " << std::string(addr) << " */ ";
+ if (array_count == 0) {
+ out << type << " ";
+ } else {
+ out << "tint_array<" << type << ", " << std::to_string(array_count) << "> ";
+ }
+ out << name << ";\n";
+}
+
#define CHECK_TYPE_SIZE_AND_ALIGN(TYPE, SIZE, ALIGN) \
static_assert(sizeof(TYPE) == SIZE, "Bad type size"); \
static_assert(alignof(TYPE) == ALIGN, "Bad type alignment")
@@ -69,7 +83,7 @@
std::stringstream out;
ASSERT_TRUE(gen.EmitType(out, program->TypeOf(arr), "ary")) << gen.error();
- EXPECT_EQ(out.str(), "bool ary[4]");
+ EXPECT_EQ(out.str(), "tint_array<bool, 4>");
}
TEST_F(MslGeneratorImplTest, EmitType_ArrayOfArray) {
@@ -81,7 +95,7 @@
std::stringstream out;
ASSERT_TRUE(gen.EmitType(out, program->TypeOf(b), "ary")) << gen.error();
- EXPECT_EQ(out.str(), "bool ary[5][4]");
+ EXPECT_EQ(out.str(), "tint_array<tint_array<bool, 4>, 5>");
}
TEST_F(MslGeneratorImplTest, EmitType_ArrayOfArrayOfArray) {
@@ -94,7 +108,7 @@
std::stringstream out;
ASSERT_TRUE(gen.EmitType(out, program->TypeOf(c), "ary")) << gen.error();
- EXPECT_EQ(out.str(), "bool ary[6][5][4]");
+ EXPECT_EQ(out.str(), "tint_array<tint_array<tint_array<bool, 4>, 5>, 6>");
}
TEST_F(MslGeneratorImplTest, EmitType_Array_WithoutName) {
@@ -105,7 +119,7 @@
std::stringstream out;
ASSERT_TRUE(gen.EmitType(out, program->TypeOf(arr), "")) << gen.error();
- EXPECT_EQ(out.str(), "bool[4]");
+ EXPECT_EQ(out.str(), "tint_array<bool, 4>");
}
TEST_F(MslGeneratorImplTest, EmitType_RuntimeArray) {
@@ -116,7 +130,7 @@
std::stringstream out;
ASSERT_TRUE(gen.EmitType(out, program->TypeOf(arr), "ary")) << gen.error();
- EXPECT_EQ(out.str(), "bool ary[1]");
+ EXPECT_EQ(out.str(), "tint_array<bool, 1>");
}
TEST_F(MslGeneratorImplTest, EmitType_Bool) {
@@ -245,54 +259,58 @@
auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
- // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
+ // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
// for each field of the structure s.
-#define ALL_FIELDS() \
- FIELD(0x0000, int, a, /*NO SUFFIX*/) \
- FIELD(0x0004, int8_t, tint_pad, [124]) \
- FIELD(0x0080, float, b, /*NO SUFFIX*/) \
- FIELD(0x0084, int8_t, tint_pad_1, [124]) \
- FIELD(0x0100, float2, c, /*NO SUFFIX*/) \
- FIELD(0x0108, uint, d, /*NO SUFFIX*/) \
- FIELD(0x010c, int8_t, tint_pad_2, [4]) \
- FIELD(0x0110, packed_float3, e, /*NO SUFFIX*/) \
- FIELD(0x011c, uint, f, /*NO SUFFIX*/) \
- FIELD(0x0120, float4, g, /*NO SUFFIX*/) \
- FIELD(0x0130, uint, h, /*NO SUFFIX*/) \
- FIELD(0x0134, int8_t, tint_pad_3, [4]) \
- FIELD(0x0138, float2x2, i, /*NO SUFFIX*/) \
- FIELD(0x0148, uint, j, /*NO SUFFIX*/) \
- FIELD(0x014c, int8_t, tint_pad_4, [4]) \
- FIELD(0x0150, float2x3, k, /*NO SUFFIX*/) \
- FIELD(0x0170, uint, l, /*NO SUFFIX*/) \
- FIELD(0x0174, int8_t, tint_pad_5, [12]) \
- FIELD(0x0180, float2x4, m, /*NO SUFFIX*/) \
- FIELD(0x01a0, uint, n, /*NO SUFFIX*/) \
- FIELD(0x01a4, int8_t, tint_pad_6, [4]) \
- FIELD(0x01a8, float3x2, o, /*NO SUFFIX*/) \
- FIELD(0x01c0, uint, p, /*NO SUFFIX*/) \
- FIELD(0x01c4, int8_t, tint_pad_7, [12]) \
- FIELD(0x01d0, float3x3, q, /*NO SUFFIX*/) \
- FIELD(0x0200, uint, r, /*NO SUFFIX*/) \
- FIELD(0x0204, int8_t, tint_pad_8, [12]) \
- FIELD(0x0210, float3x4, s, /*NO SUFFIX*/) \
- FIELD(0x0240, uint, t, /*NO SUFFIX*/) \
- FIELD(0x0244, int8_t, tint_pad_9, [4]) \
- FIELD(0x0248, float4x2, u, /*NO SUFFIX*/) \
- FIELD(0x0268, uint, v, /*NO SUFFIX*/) \
- FIELD(0x026c, int8_t, tint_pad_10, [4]) \
- FIELD(0x0270, float4x3, w, /*NO SUFFIX*/) \
- FIELD(0x02b0, uint, x, /*NO SUFFIX*/) \
- FIELD(0x02b4, int8_t, tint_pad_11, [12]) \
- FIELD(0x02c0, float4x4, y, /*NO SUFFIX*/) \
- FIELD(0x0300, float, z, /*NO SUFFIX*/) \
- FIELD(0x0304, int8_t, tint_pad_12, [124])
+#define ALL_FIELDS() \
+ FIELD(0x0000, int, 0, a) \
+ FIELD(0x0004, int8_t, 124, tint_pad) \
+ FIELD(0x0080, float, 0, b) \
+ FIELD(0x0084, int8_t, 124, tint_pad_1) \
+ FIELD(0x0100, float2, 0, c) \
+ FIELD(0x0108, uint, 0, d) \
+ FIELD(0x010c, int8_t, 4, tint_pad_2) \
+ FIELD(0x0110, packed_float3, 0, e) \
+ FIELD(0x011c, uint, 0, f) \
+ FIELD(0x0120, float4, 0, g) \
+ FIELD(0x0130, uint, 0, h) \
+ FIELD(0x0134, int8_t, 4, tint_pad_3) \
+ FIELD(0x0138, float2x2, 0, i) \
+ FIELD(0x0148, uint, 0, j) \
+ FIELD(0x014c, int8_t, 4, tint_pad_4) \
+ FIELD(0x0150, float2x3, 0, k) \
+ FIELD(0x0170, uint, 0, l) \
+ FIELD(0x0174, int8_t, 12, tint_pad_5) \
+ FIELD(0x0180, float2x4, 0, m) \
+ FIELD(0x01a0, uint, 0, n) \
+ FIELD(0x01a4, int8_t, 4, tint_pad_6) \
+ FIELD(0x01a8, float3x2, 0, o) \
+ FIELD(0x01c0, uint, 0, p) \
+ FIELD(0x01c4, int8_t, 12, tint_pad_7) \
+ FIELD(0x01d0, float3x3, 0, q) \
+ FIELD(0x0200, uint, 0, r) \
+ FIELD(0x0204, int8_t, 12, tint_pad_8) \
+ FIELD(0x0210, float3x4, 0, s) \
+ FIELD(0x0240, uint, 0, t) \
+ FIELD(0x0244, int8_t, 4, tint_pad_9) \
+ FIELD(0x0248, float4x2, 0, u) \
+ FIELD(0x0268, uint, 0, v) \
+ FIELD(0x026c, int8_t, 4, tint_pad_10) \
+ FIELD(0x0270, float4x3, 0, w) \
+ FIELD(0x02b0, uint, 0, x) \
+ FIELD(0x02b4, int8_t, 12, tint_pad_11) \
+ FIELD(0x02c0, float4x4, 0, y) \
+ FIELD(0x0300, float, 0, z) \
+ FIELD(0x0304, int8_t, 124, tint_pad_12)
// Check that the generated string is as expected.
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) " /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
- auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
+ std::stringstream expect;
+ expect << "struct S {\n";
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) \
+ FormatMSLField(expect, #ADDR, #TYPE, ARRAY_COUNT, #NAME);
+ ALL_FIELDS()
#undef FIELD
- EXPECT_EQ(buf.String(), expect);
+ expect << "};\n";
+ EXPECT_EQ(buf.String(), expect.str());
// 1.4 Metal and C++14
// The Metal programming language is a C++14-based Specification with
@@ -304,12 +322,12 @@
// layout is as expected for C++14 / MSL.
{
struct S {
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) TYPE NAME SUFFIX;
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) std::array<TYPE, ARRAY_COUNT ? ARRAY_COUNT : 1> NAME;
ALL_FIELDS()
#undef FIELD
};
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) \
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) \
EXPECT_EQ(ADDR, static_cast<int>(offsetof(S, NAME))) << "Field " << #NAME;
ALL_FIELDS()
#undef FIELD
@@ -350,22 +368,26 @@
auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
- // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
+ // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
// for each field of the structure s.
-#define ALL_FIELDS() \
- FIELD(0x0000, int, a, /*NO SUFFIX*/) \
- FIELD(0x0004, int8_t, tint_pad, [508]) \
- FIELD(0x0200, inner_x, b, /*NO SUFFIX*/) \
- FIELD(0x0600, float, c, /*NO SUFFIX*/) \
- FIELD(0x0604, inner_y, d, /*NO SUFFIX*/) \
- FIELD(0x0808, float, e, /*NO SUFFIX*/) \
- FIELD(0x080c, int8_t, tint_pad_1, [500])
+#define ALL_FIELDS() \
+ FIELD(0x0000, int, 0, a) \
+ FIELD(0x0004, int8_t, 508, tint_pad) \
+ FIELD(0x0200, inner_x, 0, b) \
+ FIELD(0x0600, float, 0, c) \
+ FIELD(0x0604, inner_y, 0, d) \
+ FIELD(0x0808, float, 0, e) \
+ FIELD(0x080c, int8_t, 500, tint_pad_1)
// Check that the generated string is as expected.
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) " /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
- auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
+ std::stringstream expect;
+ expect << "struct S {\n";
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) \
+ FormatMSLField(expect, #ADDR, #TYPE, ARRAY_COUNT, #NAME);
+ ALL_FIELDS()
#undef FIELD
- EXPECT_EQ(buf.String(), expect);
+ expect << "};\n";
+ EXPECT_EQ(buf.String(), expect.str());
// 1.4 Metal and C++14
// The Metal programming language is a C++14-based Specification with
@@ -389,12 +411,12 @@
CHECK_TYPE_SIZE_AND_ALIGN(inner_y, 516, 4);
struct S {
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) TYPE NAME SUFFIX;
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) std::array<TYPE, ARRAY_COUNT ? ARRAY_COUNT : 1> NAME;
ALL_FIELDS()
#undef FIELD
};
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) \
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) \
EXPECT_EQ(ADDR, static_cast<int>(offsetof(S, NAME))) << "Field " << #NAME;
ALL_FIELDS()
#undef FIELD
@@ -440,23 +462,27 @@
auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
- // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
+ // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
// for each field of the structure s.
-#define ALL_FIELDS() \
- FIELD(0x0000, int, a, /*NO SUFFIX*/) \
- FIELD(0x0004, float, b, [7]) \
- FIELD(0x0020, float, c, /*NO SUFFIX*/) \
- FIELD(0x0024, int8_t, tint_pad, [476]) \
- FIELD(0x0200, inner, d, [4]) \
- FIELD(0x1200, float, e, /*NO SUFFIX*/) \
- FIELD(0x1204, float, f, [1]) \
- FIELD(0x1208, int8_t, tint_pad_1, [504])
+#define ALL_FIELDS() \
+ FIELD(0x0000, int, 0, a) \
+ FIELD(0x0004, float, 7, b) \
+ FIELD(0x0020, float, 0, c) \
+ FIELD(0x0024, int8_t, 476, tint_pad) \
+ FIELD(0x0200, inner, 4, d) \
+ FIELD(0x1200, float, 0, e) \
+ FIELD(0x1204, float, 1, f) \
+ FIELD(0x1208, int8_t, 504, tint_pad_1)
// Check that the generated string is as expected.
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) " /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
- auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
+ std::stringstream expect;
+ expect << "struct S {\n";
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) \
+ FormatMSLField(expect, #ADDR, #TYPE, ARRAY_COUNT, #NAME);
+ ALL_FIELDS()
#undef FIELD
- EXPECT_EQ(buf.String(), expect);
+ expect << "};\n";
+ EXPECT_EQ(buf.String(), expect.str());
// 1.4 Metal and C++14
// The Metal programming language is a C++14-based Specification with
@@ -486,12 +512,12 @@
CHECK_TYPE_SIZE_AND_ALIGN(array_z, 4, 4);
struct S {
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) TYPE NAME SUFFIX;
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) std::array<TYPE, ARRAY_COUNT ? ARRAY_COUNT : 1> NAME;
ALL_FIELDS()
#undef FIELD
};
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) \
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) \
EXPECT_EQ(ADDR, static_cast<int>(offsetof(S, NAME))) << "Field " << #NAME;
ALL_FIELDS()
#undef FIELD
@@ -522,20 +548,24 @@
auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
- // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
+ // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
// for each field of the structure s.
-#define ALL_FIELDS() \
- FIELD(0x0000, int, a, /*NO SUFFIX*/) \
- FIELD(0x0004, int8_t, tint_pad, [12]) \
- FIELD(0x0010, float3, b, [4]) \
- FIELD(0x0050, int, c, /*NO SUFFIX*/) \
- FIELD(0x0054, int8_t, tint_pad_1, [12])
+#define ALL_FIELDS() \
+ FIELD(0x0000, int, 0, a) \
+ FIELD(0x0004, int8_t, 12, tint_pad) \
+ FIELD(0x0010, float3, 4, b) \
+ FIELD(0x0050, int, 0, c) \
+ FIELD(0x0054, int8_t, 12, tint_pad_1)
// Check that the generated string is as expected.
-#define FIELD(ADDR, TYPE, NAME, SUFFIX) " /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
- auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
+ std::stringstream expect;
+ expect << "struct S {\n";
+#define FIELD(ADDR, TYPE, ARRAY_COUNT, NAME) \
+ FormatMSLField(expect, #ADDR, #TYPE, ARRAY_COUNT, #NAME);
+ ALL_FIELDS()
#undef FIELD
- EXPECT_EQ(buf.String(), expect);
+ expect << "};\n";
+ EXPECT_EQ(buf.String(), expect.str());
}
TEST_F(MslGeneratorImplTest, AttemptTintPadSymbolCollision) {
@@ -583,44 +613,44 @@
ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
EXPECT_EQ(buf.String(), R"(struct S {
/* 0x0000 */ int tint_pad_2;
- /* 0x0004 */ int8_t tint_pad_10[124];
+ /* 0x0004 */ tint_array<int8_t, 124> tint_pad_10;
/* 0x0080 */ float tint_pad_20;
- /* 0x0084 */ int8_t tint_pad_11[124];
+ /* 0x0084 */ tint_array<int8_t, 124> tint_pad_11;
/* 0x0100 */ float2 tint_pad_33;
/* 0x0108 */ uint tint_pad_1;
- /* 0x010c */ int8_t tint_pad_12[4];
+ /* 0x010c */ tint_array<int8_t, 4> tint_pad_12;
/* 0x0110 */ packed_float3 tint_pad_3;
/* 0x011c */ uint tint_pad_7;
/* 0x0120 */ float4 tint_pad_25;
/* 0x0130 */ uint tint_pad_5;
- /* 0x0134 */ int8_t tint_pad_13[4];
+ /* 0x0134 */ tint_array<int8_t, 4> tint_pad_13;
/* 0x0138 */ float2x2 tint_pad_27;
/* 0x0148 */ uint tint_pad_24;
- /* 0x014c */ int8_t tint_pad_14[4];
+ /* 0x014c */ tint_array<int8_t, 4> tint_pad_14;
/* 0x0150 */ float2x3 tint_pad_23;
/* 0x0170 */ uint tint_pad;
- /* 0x0174 */ int8_t tint_pad_15[12];
+ /* 0x0174 */ tint_array<int8_t, 12> tint_pad_15;
/* 0x0180 */ float2x4 tint_pad_8;
/* 0x01a0 */ uint tint_pad_26;
- /* 0x01a4 */ int8_t tint_pad_16[4];
+ /* 0x01a4 */ tint_array<int8_t, 4> tint_pad_16;
/* 0x01a8 */ float3x2 tint_pad_29;
/* 0x01c0 */ uint tint_pad_6;
- /* 0x01c4 */ int8_t tint_pad_17[12];
+ /* 0x01c4 */ tint_array<int8_t, 12> tint_pad_17;
/* 0x01d0 */ float3x3 tint_pad_22;
/* 0x0200 */ uint tint_pad_32;
- /* 0x0204 */ int8_t tint_pad_18[12];
+ /* 0x0204 */ tint_array<int8_t, 12> tint_pad_18;
/* 0x0210 */ float3x4 tint_pad_34;
/* 0x0240 */ uint tint_pad_35;
- /* 0x0244 */ int8_t tint_pad_19[4];
+ /* 0x0244 */ tint_array<int8_t, 4> tint_pad_19;
/* 0x0248 */ float4x2 tint_pad_30;
/* 0x0268 */ uint tint_pad_9;
- /* 0x026c */ int8_t tint_pad_36[4];
+ /* 0x026c */ tint_array<int8_t, 4> tint_pad_36;
/* 0x0270 */ float4x3 tint_pad_31;
/* 0x02b0 */ uint tint_pad_28;
- /* 0x02b4 */ int8_t tint_pad_37[12];
+ /* 0x02b4 */ tint_array<int8_t, 12> tint_pad_37;
/* 0x02c0 */ float4x4 tint_pad_4;
/* 0x0300 */ float tint_pad_21;
- /* 0x0304 */ int8_t tint_pad_38[124];
+ /* 0x0304 */ tint_array<int8_t, 124> tint_pad_38;
};
)");
}
diff --git a/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc b/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
index e41cc3b..f477572 100644
--- a/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -61,7 +61,7 @@
gen.increment_indent();
ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
- EXPECT_EQ(gen.result(), " float a[5] = {0.0f};\n");
+ EXPECT_EQ(gen.result(), " tint_array<float, 5> a = {};\n");
}
TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Struct) {
diff --git a/test/tint/array/assign_to_function_var.wgsl.expected.msl b/test/tint/array/assign_to_function_var.wgsl.expected.msl
index 39cf432..dabd986 100644
--- a/test/tint/array/assign_to_function_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_function_var.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- /* 0x0000 */ tint_array_wrapper arr;
+ /* 0x0000 */ tint_array<int4, 4> arr;
};
-tint_array_wrapper ret_arr() {
- tint_array_wrapper const tint_symbol_1 = {.arr={}};
+tint_array<int4, 4> ret_arr() {
+ tint_array<int4, 4> const tint_symbol_1 = tint_array<int4, 4>{};
return tint_symbol_1;
}
@@ -19,26 +28,14 @@
return tint_symbol_2;
}
-struct tint_array_wrapper_3 {
- int arr[2];
-};
-
-struct tint_array_wrapper_2 {
- tint_array_wrapper_3 arr[3];
-};
-
-struct tint_array_wrapper_1 {
- tint_array_wrapper_2 arr[4];
-};
-
-void foo(tint_array_wrapper src_param, thread tint_array_wrapper* const tint_symbol_4, threadgroup tint_array_wrapper* const tint_symbol_5, const constant S* const tint_symbol_6, device S* const tint_symbol_7) {
- tint_array_wrapper src_function = {};
- tint_array_wrapper dst = {};
- tint_array_wrapper const tint_symbol_3 = {.arr={int4(1), int4(2), int4(3), int4(3)}};
+void foo(tint_array<int4, 4> src_param, thread tint_array<int4, 4>* const tint_symbol_4, threadgroup tint_array<int4, 4>* const tint_symbol_5, const constant S* const tint_symbol_6, device S* const tint_symbol_7) {
+ tint_array<int4, 4> src_function = {};
+ tint_array<int4, 4> dst = {};
+ tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
dst = tint_symbol_3;
dst = src_param;
dst = ret_arr();
- tint_array_wrapper const src_let = {.arr={}};
+ tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
dst = src_let;
dst = src_function;
dst = *(tint_symbol_4);
@@ -47,8 +44,8 @@
dst = tint_symbol.arr;
dst = (*(tint_symbol_6)).arr;
dst = (*(tint_symbol_7)).arr;
- tint_array_wrapper_1 dst_nested = {};
- tint_array_wrapper_1 src_nested = {};
+ tint_array<tint_array<tint_array<int, 2>, 3>, 4> dst_nested = {};
+ tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
dst_nested = src_nested;
}
diff --git a/test/tint/array/assign_to_private_var.wgsl.expected.msl b/test/tint/array/assign_to_private_var.wgsl.expected.msl
index be8972f..8ec45d8 100644
--- a/test/tint/array/assign_to_private_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_private_var.wgsl.expected.msl
@@ -1,28 +1,25 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- /* 0x0000 */ tint_array_wrapper arr;
+ /* 0x0000 */ tint_array<int4, 4> arr;
};
-struct tint_array_wrapper_3 {
- int arr[2];
-};
-
-struct tint_array_wrapper_2 {
- tint_array_wrapper_3 arr[3];
-};
-
-struct tint_array_wrapper_1 {
- tint_array_wrapper_2 arr[4];
-};
-
-tint_array_wrapper ret_arr() {
- tint_array_wrapper const tint_symbol_1 = {.arr={}};
+tint_array<int4, 4> ret_arr() {
+ tint_array<int4, 4> const tint_symbol_1 = tint_array<int4, 4>{};
return tint_symbol_1;
}
@@ -31,13 +28,13 @@
return tint_symbol_2;
}
-void foo(tint_array_wrapper src_param, thread tint_array_wrapper* const tint_symbol_4, thread tint_array_wrapper* const tint_symbol_5, threadgroup tint_array_wrapper* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8, thread tint_array_wrapper_1* const tint_symbol_9) {
- tint_array_wrapper src_function = {};
- tint_array_wrapper const tint_symbol_3 = {.arr={int4(1), int4(2), int4(3), int4(3)}};
+void foo(tint_array<int4, 4> src_param, thread tint_array<int4, 4>* const tint_symbol_4, thread tint_array<int4, 4>* const tint_symbol_5, threadgroup tint_array<int4, 4>* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8, thread tint_array<tint_array<tint_array<int, 2>, 3>, 4>* const tint_symbol_9) {
+ tint_array<int4, 4> src_function = {};
+ tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
*(tint_symbol_4) = tint_symbol_3;
*(tint_symbol_4) = src_param;
*(tint_symbol_4) = ret_arr();
- tint_array_wrapper const src_let = {.arr={}};
+ tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
*(tint_symbol_4) = src_let;
*(tint_symbol_4) = src_function;
*(tint_symbol_4) = *(tint_symbol_5);
@@ -46,7 +43,7 @@
*(tint_symbol_4) = tint_symbol.arr;
*(tint_symbol_4) = (*(tint_symbol_7)).arr;
*(tint_symbol_4) = (*(tint_symbol_8)).arr;
- tint_array_wrapper_1 src_nested = {};
+ tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
*(tint_symbol_9) = src_nested;
}
diff --git a/test/tint/array/assign_to_storage_var.wgsl.expected.msl b/test/tint/array/assign_to_storage_var.wgsl.expected.msl
index 3bf3ccb..3165ec8 100644
--- a/test/tint/array/assign_to_storage_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_storage_var.wgsl.expected.msl
@@ -1,32 +1,29 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- /* 0x0000 */ tint_array_wrapper arr;
-};
-
-struct tint_array_wrapper_3 {
- /* 0x0000 */ int arr[2];
-};
-
-struct tint_array_wrapper_2 {
- /* 0x0000 */ tint_array_wrapper_3 arr[3];
-};
-
-struct tint_array_wrapper_1 {
- /* 0x0000 */ tint_array_wrapper_2 arr[4];
+ /* 0x0000 */ tint_array<int4, 4> arr;
};
struct S_nested {
- /* 0x0000 */ tint_array_wrapper_1 arr;
+ /* 0x0000 */ tint_array<tint_array<tint_array<int, 2>, 3>, 4> arr;
};
-tint_array_wrapper ret_arr() {
- tint_array_wrapper const tint_symbol_2 = {.arr={}};
+tint_array<int4, 4> ret_arr() {
+ tint_array<int4, 4> const tint_symbol_2 = tint_array<int4, 4>{};
return tint_symbol_2;
}
@@ -35,14 +32,14 @@
return tint_symbol_3;
}
-void foo(tint_array_wrapper src_param, device S* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, threadgroup tint_array_wrapper* const tint_symbol_7, const constant S* const tint_symbol_8, device S* const tint_symbol_9, device S_nested* const tint_symbol_10) {
- tint_array_wrapper src_function = {};
- tint_array_wrapper const tint_symbol_4 = {.arr={int4(1), int4(2), int4(3), int4(3)}};
+void foo(tint_array<int4, 4> src_param, device S* const tint_symbol_5, thread tint_array<int4, 4>* const tint_symbol_6, threadgroup tint_array<int4, 4>* const tint_symbol_7, const constant S* const tint_symbol_8, device S* const tint_symbol_9, device S_nested* const tint_symbol_10) {
+ tint_array<int4, 4> src_function = {};
+ tint_array<int4, 4> const tint_symbol_4 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
(*(tint_symbol_5)).arr = tint_symbol_4;
(*(tint_symbol_5)).arr = src_param;
- tint_array_wrapper const tint_symbol = ret_arr();
+ tint_array<int4, 4> const tint_symbol = ret_arr();
(*(tint_symbol_5)).arr = tint_symbol;
- tint_array_wrapper const src_let = {.arr={}};
+ tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
(*(tint_symbol_5)).arr = src_let;
(*(tint_symbol_5)).arr = src_function;
(*(tint_symbol_5)).arr = *(tint_symbol_6);
@@ -51,7 +48,7 @@
(*(tint_symbol_5)).arr = tint_symbol_1.arr;
(*(tint_symbol_5)).arr = (*(tint_symbol_8)).arr;
(*(tint_symbol_5)).arr = (*(tint_symbol_9)).arr;
- tint_array_wrapper_1 src_nested = {};
+ tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
(*(tint_symbol_10)).arr = src_nested;
}
diff --git a/test/tint/array/assign_to_subexpr.wgsl.expected.msl b/test/tint/array/assign_to_subexpr.wgsl.expected.msl
index 735dc30..8851fcd 100644
--- a/test/tint/array/assign_to_subexpr.wgsl.expected.msl
+++ b/test/tint/array/assign_to_subexpr.wgsl.expected.msl
@@ -1,27 +1,32 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- tint_array_wrapper arr;
-};
-
-struct tint_array_wrapper_1 {
- tint_array_wrapper arr[2];
+ tint_array<int, 4> arr;
};
void foo() {
- tint_array_wrapper const src = {.arr={}};
- tint_array_wrapper dst = {};
+ tint_array<int, 4> const src = tint_array<int, 4>{};
+ tint_array<int, 4> dst = {};
S dst_struct = {};
- tint_array_wrapper_1 dst_array = {};
+ tint_array<tint_array<int, 4>, 2> dst_array = {};
dst_struct.arr = src;
- dst_array.arr[1] = src;
+ dst_array[1] = src;
dst = src;
dst_struct.arr = src;
- dst_array.arr[0] = src;
+ dst_array[0] = src;
}
diff --git a/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl b/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl
index 9fab331..74df1bb 100644
--- a/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl
+++ b/test/tint/array/assign_to_workgroup_var.wgsl.expected.msl
@@ -1,28 +1,25 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- /* 0x0000 */ tint_array_wrapper arr;
+ /* 0x0000 */ tint_array<int4, 4> arr;
};
-struct tint_array_wrapper_3 {
- int arr[2];
-};
-
-struct tint_array_wrapper_2 {
- tint_array_wrapper_3 arr[3];
-};
-
-struct tint_array_wrapper_1 {
- tint_array_wrapper_2 arr[4];
-};
-
-tint_array_wrapper ret_arr() {
- tint_array_wrapper const tint_symbol_1 = {.arr={}};
+tint_array<int4, 4> ret_arr() {
+ tint_array<int4, 4> const tint_symbol_1 = tint_array<int4, 4>{};
return tint_symbol_1;
}
@@ -31,13 +28,13 @@
return tint_symbol_2;
}
-void foo(tint_array_wrapper src_param, threadgroup tint_array_wrapper* const tint_symbol_4, thread tint_array_wrapper* const tint_symbol_5, threadgroup tint_array_wrapper* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8, threadgroup tint_array_wrapper_1* const tint_symbol_9) {
- tint_array_wrapper src_function = {};
- tint_array_wrapper const tint_symbol_3 = {.arr={int4(1), int4(2), int4(3), int4(3)}};
+void foo(tint_array<int4, 4> src_param, threadgroup tint_array<int4, 4>* const tint_symbol_4, thread tint_array<int4, 4>* const tint_symbol_5, threadgroup tint_array<int4, 4>* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8, threadgroup tint_array<tint_array<tint_array<int, 2>, 3>, 4>* const tint_symbol_9) {
+ tint_array<int4, 4> src_function = {};
+ tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
*(tint_symbol_4) = tint_symbol_3;
*(tint_symbol_4) = src_param;
*(tint_symbol_4) = ret_arr();
- tint_array_wrapper const src_let = {.arr={}};
+ tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
*(tint_symbol_4) = src_let;
*(tint_symbol_4) = src_function;
*(tint_symbol_4) = *(tint_symbol_5);
@@ -46,7 +43,7 @@
*(tint_symbol_4) = tint_symbol.arr;
*(tint_symbol_4) = (*(tint_symbol_7)).arr;
*(tint_symbol_4) = (*(tint_symbol_8)).arr;
- tint_array_wrapper_1 src_nested = {};
+ tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
*(tint_symbol_9) = src_nested;
}
diff --git a/test/tint/array/function_parameter.wgsl.expected.msl b/test/tint/array/function_parameter.wgsl.expected.msl
index 277889e..bf68a61 100644
--- a/test/tint/array/function_parameter.wgsl.expected.msl
+++ b/test/tint/array/function_parameter.wgsl.expected.msl
@@ -1,34 +1,35 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- float arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-float f1(tint_array_wrapper a) {
- return a.arr[3];
+float f1(tint_array<float, 4> a) {
+ return a[3];
}
-struct tint_array_wrapper_1 {
- tint_array_wrapper arr[3];
-};
-
-float f2(tint_array_wrapper_1 a) {
- return a.arr[2].arr[3];
+float f2(tint_array<tint_array<float, 4>, 3> a) {
+ return a[2][3];
}
-struct tint_array_wrapper_2 {
- tint_array_wrapper_1 arr[2];
-};
-
-float f3(tint_array_wrapper_2 a) {
- return a.arr[1].arr[2].arr[3];
+float f3(tint_array<tint_array<tint_array<float, 4>, 3>, 2> a) {
+ return a[1][2][3];
}
kernel void tint_symbol() {
- tint_array_wrapper const a1 = {.arr={}};
- tint_array_wrapper_1 const a2 = {.arr={}};
- tint_array_wrapper_2 const a3 = {.arr={}};
+ tint_array<float, 4> const a1 = tint_array<float, 4>{};
+ tint_array<tint_array<float, 4>, 3> const a2 = tint_array<tint_array<float, 4>, 3>{};
+ tint_array<tint_array<tint_array<float, 4>, 3>, 2> const a3 = tint_array<tint_array<tint_array<float, 4>, 3>, 2>{};
float const v1 = f1(a1);
float const v2 = f2(a2);
float const v3 = f3(a3);
diff --git a/test/tint/array/function_return_type.wgsl.expected.msl b/test/tint/array/function_return_type.wgsl.expected.msl
index 8d7634a..703fc88 100644
--- a/test/tint/array/function_return_type.wgsl.expected.msl
+++ b/test/tint/array/function_return_type.wgsl.expected.msl
@@ -1,42 +1,43 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- float arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-tint_array_wrapper f1() {
- tint_array_wrapper const tint_symbol_6 = {.arr={}};
+tint_array<float, 4> f1() {
+ tint_array<float, 4> const tint_symbol_6 = tint_array<float, 4>{};
return tint_symbol_6;
}
-struct tint_array_wrapper_1 {
- tint_array_wrapper arr[3];
-};
-
-tint_array_wrapper_1 f2() {
- tint_array_wrapper const tint_symbol_1 = f1();
- tint_array_wrapper const tint_symbol_2 = f1();
- tint_array_wrapper const tint_symbol_3 = f1();
- tint_array_wrapper_1 const tint_symbol_7 = {.arr={tint_symbol_1, tint_symbol_2, tint_symbol_3}};
+tint_array<tint_array<float, 4>, 3> f2() {
+ tint_array<float, 4> const tint_symbol_1 = f1();
+ tint_array<float, 4> const tint_symbol_2 = f1();
+ tint_array<float, 4> const tint_symbol_3 = f1();
+ tint_array<tint_array<float, 4>, 3> const tint_symbol_7 = tint_array<tint_array<float, 4>, 3>{tint_symbol_1, tint_symbol_2, tint_symbol_3};
return tint_symbol_7;
}
-struct tint_array_wrapper_2 {
- tint_array_wrapper_1 arr[2];
-};
-
-tint_array_wrapper_2 f3() {
- tint_array_wrapper_1 const tint_symbol_4 = f2();
- tint_array_wrapper_1 const tint_symbol_5 = f2();
- tint_array_wrapper_2 const tint_symbol_8 = {.arr={tint_symbol_4, tint_symbol_5}};
+tint_array<tint_array<tint_array<float, 4>, 3>, 2> f3() {
+ tint_array<tint_array<float, 4>, 3> const tint_symbol_4 = f2();
+ tint_array<tint_array<float, 4>, 3> const tint_symbol_5 = f2();
+ tint_array<tint_array<tint_array<float, 4>, 3>, 2> const tint_symbol_8 = tint_array<tint_array<tint_array<float, 4>, 3>, 2>{tint_symbol_4, tint_symbol_5};
return tint_symbol_8;
}
kernel void tint_symbol() {
- tint_array_wrapper const a1 = f1();
- tint_array_wrapper_1 const a2 = f2();
- tint_array_wrapper_2 const a3 = f3();
+ tint_array<float, 4> const a1 = f1();
+ tint_array<tint_array<float, 4>, 3> const a2 = f2();
+ tint_array<tint_array<tint_array<float, 4>, 3>, 2> const a3 = f3();
return;
}
diff --git a/test/tint/array/size.wgsl.expected.msl b/test/tint/array/size.wgsl.expected.msl
index 0150ece..27994b2 100644
--- a/test/tint/array/size.wgsl.expected.msl
+++ b/test/tint/array/size.wgsl.expected.msl
@@ -1,19 +1,28 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
constant int slen = 4;
constant uint ulen = 4u;
-struct tint_array_wrapper {
- float arr[4];
-};
-
fragment void tint_symbol() {
- tint_array_wrapper signed_literal = {};
- tint_array_wrapper unsigned_literal = {};
- tint_array_wrapper signed_constant = {};
- tint_array_wrapper unsigned_constant = {};
+ tint_array<float, 4> signed_literal = {};
+ tint_array<float, 4> unsigned_literal = {};
+ tint_array<float, 4> signed_constant = {};
+ tint_array<float, 4> unsigned_constant = {};
signed_literal = unsigned_constant;
signed_constant = unsigned_literal;
return;
diff --git a/test/tint/array/strides.spvasm.expected.msl b/test/tint/array/strides.spvasm.expected.msl
index 8db28bd..47d578e 100644
--- a/test/tint/array/strides.spvasm.expected.msl
+++ b/test/tint/array/strides.spvasm.expected.msl
@@ -1,40 +1,41 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct strided_arr {
/* 0x0000 */ float el;
- /* 0x0004 */ int8_t tint_pad[4];
-};
-
-struct tint_array_wrapper {
- /* 0x0000 */ strided_arr arr[2];
-};
-
-struct tint_array_wrapper_1 {
- /* 0x0000 */ tint_array_wrapper arr[3];
+ /* 0x0004 */ tint_array<int8_t, 4> tint_pad;
};
struct strided_arr_1 {
- /* 0x0000 */ tint_array_wrapper_1 el;
- /* 0x0030 */ int8_t tint_pad_1[80];
-};
-
-struct tint_array_wrapper_2 {
- /* 0x0000 */ strided_arr_1 arr[4];
+ /* 0x0000 */ tint_array<tint_array<strided_arr, 2>, 3> el;
+ /* 0x0030 */ tint_array<int8_t, 80> tint_pad_1;
};
struct S {
- /* 0x0000 */ tint_array_wrapper_2 a;
+ /* 0x0000 */ tint_array<strided_arr_1, 4> a;
};
void f_1(device S* const tint_symbol_1) {
- tint_array_wrapper_2 const x_19 = (*(tint_symbol_1)).a;
- tint_array_wrapper_1 const x_24 = (*(tint_symbol_1)).a.arr[3].el;
- tint_array_wrapper const x_28 = (*(tint_symbol_1)).a.arr[3].el.arr[2];
- float const x_32 = (*(tint_symbol_1)).a.arr[3].el.arr[2].arr[1].el;
- tint_array_wrapper_2 const tint_symbol = {.arr={}};
+ tint_array<strided_arr_1, 4> const x_19 = (*(tint_symbol_1)).a;
+ tint_array<tint_array<strided_arr, 2>, 3> const x_24 = (*(tint_symbol_1)).a[3].el;
+ tint_array<strided_arr, 2> const x_28 = (*(tint_symbol_1)).a[3].el[2];
+ float const x_32 = (*(tint_symbol_1)).a[3].el[2][1].el;
+ tint_array<strided_arr_1, 4> const tint_symbol = tint_array<strided_arr_1, 4>{};
(*(tint_symbol_1)).a = tint_symbol;
- (*(tint_symbol_1)).a.arr[3].el.arr[2].arr[1].el = 5.0f;
+ (*(tint_symbol_1)).a[3].el[2][1].el = 5.0f;
return;
}
diff --git a/test/tint/array/type_constructor.wgsl.expected.msl b/test/tint/array/type_constructor.wgsl.expected.msl
index 092ccee..efe30ae 100644
--- a/test/tint/array/type_constructor.wgsl.expected.msl
+++ b/test/tint/array/type_constructor.wgsl.expected.msl
@@ -1,56 +1,53 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[4];
-};
-struct tint_array_wrapper_2 {
- tint_array_wrapper arr[3];
-};
-
-struct tint_array_wrapper_1 {
- tint_array_wrapper_2 arr[2];
-};
-
-struct tint_array_wrapper_3 {
- tint_array_wrapper arr[2];
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
kernel void tint_symbol() {
int const x = 42;
- tint_array_wrapper const empty = {.arr={}};
- tint_array_wrapper const nonempty = {.arr={1, 2, 3, 4}};
- tint_array_wrapper const nonempty_with_expr = {.arr={1, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1))), nonempty.arr[3]}};
- tint_array_wrapper_1 const nested_empty = {.arr={}};
- tint_array_wrapper const tint_symbol_1 = {.arr={1, 2, 3, 4}};
- tint_array_wrapper const tint_symbol_2 = {.arr={5, 6, 7, 8}};
- tint_array_wrapper const tint_symbol_3 = {.arr={9, 10, 11, 12}};
- tint_array_wrapper_2 const tint_symbol_4 = {.arr={tint_symbol_1, tint_symbol_2, tint_symbol_3}};
- tint_array_wrapper const tint_symbol_5 = {.arr={13, 14, 15, 16}};
- tint_array_wrapper const tint_symbol_6 = {.arr={17, 18, 19, 20}};
- tint_array_wrapper const tint_symbol_7 = {.arr={21, 22, 23, 24}};
- tint_array_wrapper_2 const tint_symbol_8 = {.arr={tint_symbol_5, tint_symbol_6, tint_symbol_7}};
- tint_array_wrapper_1 const nested_nonempty = {.arr={tint_symbol_4, tint_symbol_8}};
- tint_array_wrapper const tint_symbol_9 = {.arr={1, 2, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1)))}};
- tint_array_wrapper const tint_symbol_10 = {.arr={5, 6, nonempty.arr[2], as_type<int>((as_type<uint>(nonempty.arr[3]) + as_type<uint>(1)))}};
- tint_array_wrapper_2 const tint_symbol_11 = {.arr={tint_symbol_9, tint_symbol_10, nonempty}};
- tint_array_wrapper_1 const nested_nonempty_with_expr = {.arr={tint_symbol_11, nested_nonempty.arr[1]}};
- tint_array_wrapper const tint_symbol_12 = {.arr={}};
- int const subexpr_empty = tint_symbol_12.arr[1];
- tint_array_wrapper const tint_symbol_13 = {.arr={1, 2, 3, 4}};
- int const subexpr_nonempty = tint_symbol_13.arr[2];
- tint_array_wrapper const tint_symbol_14 = {.arr={1, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1))), nonempty.arr[3]}};
- int const subexpr_nonempty_with_expr = tint_symbol_14.arr[2];
- tint_array_wrapper_3 const tint_symbol_15 = {.arr={}};
- tint_array_wrapper const subexpr_nested_empty = tint_symbol_15.arr[1];
- tint_array_wrapper const tint_symbol_16 = {.arr={1, 2, 3, 4}};
- tint_array_wrapper const tint_symbol_17 = {.arr={5, 6, 7, 8}};
- tint_array_wrapper_3 const tint_symbol_18 = {.arr={tint_symbol_16, tint_symbol_17}};
- tint_array_wrapper const subexpr_nested_nonempty = tint_symbol_18.arr[1];
- tint_array_wrapper const tint_symbol_19 = {.arr={1, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1))), nonempty.arr[3]}};
- tint_array_wrapper_3 const tint_symbol_20 = {.arr={tint_symbol_19, nested_nonempty.arr[1].arr[2]}};
- tint_array_wrapper const subexpr_nested_nonempty_with_expr = tint_symbol_20.arr[1];
+ tint_array<int, 4> const empty = tint_array<int, 4>{};
+ tint_array<int, 4> const nonempty = tint_array<int, 4>{1, 2, 3, 4};
+ tint_array<int, 4> const nonempty_with_expr = tint_array<int, 4>{1, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1))), 4};
+ tint_array<tint_array<tint_array<int, 4>, 3>, 2> const nested_empty = tint_array<tint_array<tint_array<int, 4>, 3>, 2>{};
+ tint_array<int, 4> const tint_symbol_1 = tint_array<int, 4>{1, 2, 3, 4};
+ tint_array<int, 4> const tint_symbol_2 = tint_array<int, 4>{5, 6, 7, 8};
+ tint_array<int, 4> const tint_symbol_3 = tint_array<int, 4>{9, 10, 11, 12};
+ tint_array<tint_array<int, 4>, 3> const tint_symbol_4 = tint_array<tint_array<int, 4>, 3>{tint_symbol_1, tint_symbol_2, tint_symbol_3};
+ tint_array<int, 4> const tint_symbol_5 = tint_array<int, 4>{13, 14, 15, 16};
+ tint_array<int, 4> const tint_symbol_6 = tint_array<int, 4>{17, 18, 19, 20};
+ tint_array<int, 4> const tint_symbol_7 = tint_array<int, 4>{21, 22, 23, 24};
+ tint_array<tint_array<int, 4>, 3> const tint_symbol_8 = tint_array<tint_array<int, 4>, 3>{tint_symbol_5, tint_symbol_6, tint_symbol_7};
+ tint_array<tint_array<tint_array<int, 4>, 3>, 2> const nested_nonempty = tint_array<tint_array<tint_array<int, 4>, 3>, 2>{tint_symbol_4, tint_symbol_8};
+ tint_array<int, 4> const tint_symbol_9 = tint_array<int, 4>{1, 2, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1)))};
+ tint_array<int, 4> const tint_symbol_10 = tint_array<int, 4>{5, 6, 3, as_type<int>((as_type<uint>(4) + as_type<uint>(1)))};
+ tint_array<tint_array<int, 4>, 3> const tint_symbol_11 = tint_array<tint_array<int, 4>, 3>{tint_symbol_9, tint_symbol_10, nonempty};
+ tint_array<tint_array<tint_array<int, 4>, 3>, 2> const nested_nonempty_with_expr = tint_array<tint_array<tint_array<int, 4>, 3>, 2>{tint_symbol_11, nested_nonempty[1]};
+ tint_array<int, 4> const tint_symbol_12 = tint_array<int, 4>{};
+ int const subexpr_empty = 0;
+ tint_array<int, 4> const tint_symbol_13 = tint_array<int, 4>{1, 2, 3, 4};
+ int const subexpr_nonempty = 3;
+ tint_array<int, 4> const tint_symbol_14 = tint_array<int, 4>{1, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1))), 4};
+ int const subexpr_nonempty_with_expr = tint_symbol_14[2];
+ tint_array<tint_array<int, 4>, 2> const tint_symbol_15 = tint_array<tint_array<int, 4>, 2>{};
+ tint_array<int, 4> const subexpr_nested_empty = tint_symbol_15[1];
+ tint_array<int, 4> const tint_symbol_16 = tint_array<int, 4>{1, 2, 3, 4};
+ tint_array<int, 4> const tint_symbol_17 = tint_array<int, 4>{5, 6, 7, 8};
+ tint_array<tint_array<int, 4>, 2> const tint_symbol_18 = tint_array<tint_array<int, 4>, 2>{tint_symbol_16, tint_symbol_17};
+ tint_array<int, 4> const subexpr_nested_nonempty = tint_symbol_18[1];
+ tint_array<int, 4> const tint_symbol_19 = tint_array<int, 4>{1, 42, as_type<int>((as_type<uint>(42) + as_type<uint>(1))), 4};
+ tint_array<tint_array<int, 4>, 2> const tint_symbol_20 = tint_array<tint_array<int, 4>, 2>{tint_symbol_19, nested_nonempty[1][2]};
+ tint_array<int, 4> const subexpr_nested_nonempty_with_expr = tint_symbol_20[1];
return;
}
diff --git a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.msl b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.msl
index 530148b..549e70f 100644
--- a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.msl
+++ b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.msl
@@ -12,8 +12,16 @@
return vec<T, M>(lhs) * rhs;
}
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct Inner {
@@ -25,12 +33,12 @@
/* 0x002c */ float f;
/* 0x0030 */ float2x3 g;
/* 0x0050 */ float3x2 h;
- /* 0x0068 */ int8_t tint_pad[8];
- /* 0x0070 */ tint_array_wrapper i;
+ /* 0x0068 */ tint_array<int8_t, 8> tint_pad;
+ /* 0x0070 */ tint_array<int4, 4> i;
};
struct S {
- /* 0x0000 */ Inner arr[1];
+ /* 0x0000 */ tint_array<Inner, 1> arr;
};
void tint_symbol_inner(uint idx, const device S* const tint_symbol_1) {
@@ -42,7 +50,7 @@
float const f = (*(tint_symbol_1)).arr[idx].f;
float2x3 const g = (*(tint_symbol_1)).arr[idx].g;
float3x2 const h = (*(tint_symbol_1)).arr[idx].h;
- tint_array_wrapper const i = (*(tint_symbol_1)).arr[idx].i;
+ tint_array<int4, 4> const i = (*(tint_symbol_1)).arr[idx].i;
}
kernel void tint_symbol(const device S* tint_symbol_2 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
diff --git a/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.msl b/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.msl
index 291f5a9..e2430df 100644
--- a/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.msl
+++ b/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.msl
@@ -12,8 +12,16 @@
return vec<T, M>(lhs) * rhs;
}
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct Inner {
@@ -25,12 +33,12 @@
/* 0x002c */ float f;
/* 0x0030 */ float2x3 g;
/* 0x0050 */ float3x2 h;
- /* 0x0068 */ int8_t tint_pad[8];
- /* 0x0070 */ tint_array_wrapper i;
+ /* 0x0068 */ tint_array<int8_t, 8> tint_pad;
+ /* 0x0070 */ tint_array<int4, 4> i;
};
struct S {
- /* 0x0000 */ Inner arr[1];
+ /* 0x0000 */ tint_array<Inner, 1> arr;
};
void tint_symbol_inner(uint idx, device S* const tint_symbol_2) {
@@ -42,7 +50,7 @@
(*(tint_symbol_2)).arr[idx].f = 0.0f;
(*(tint_symbol_2)).arr[idx].g = float2x3(float3(0.0f), float3(0.0f));
(*(tint_symbol_2)).arr[idx].h = float3x2(float2(0.0f), float2(0.0f), float2(0.0f));
- tint_array_wrapper const tint_symbol_1 = {.arr={}};
+ tint_array<int4, 4> const tint_symbol_1 = tint_array<int4, 4>{};
(*(tint_symbol_2)).arr[idx].i = tint_symbol_1;
}
diff --git a/test/tint/buffer/storage/static_index/read.wgsl.expected.msl b/test/tint/buffer/storage/static_index/read.wgsl.expected.msl
index 8a4f444..8f891a2 100644
--- a/test/tint/buffer/storage/static_index/read.wgsl.expected.msl
+++ b/test/tint/buffer/storage/static_index/read.wgsl.expected.msl
@@ -12,12 +12,20 @@
return vec<T, M>(lhs) * rhs;
}
-struct Inner {
- /* 0x0000 */ int x;
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- /* 0x0000 */ Inner arr[4];
+struct Inner {
+ /* 0x0000 */ int x;
};
struct S {
@@ -30,8 +38,8 @@
/* 0x0030 */ float2x3 g;
/* 0x0050 */ float3x2 h;
/* 0x0068 */ Inner i;
- /* 0x006c */ tint_array_wrapper j;
- /* 0x007c */ int8_t tint_pad[4];
+ /* 0x006c */ tint_array<Inner, 4> j;
+ /* 0x007c */ tint_array<int8_t, 4> tint_pad;
};
kernel void tint_symbol(const device S* tint_symbol_1 [[buffer(0)]]) {
@@ -44,7 +52,7 @@
float2x3 const g = (*(tint_symbol_1)).g;
float3x2 const h = (*(tint_symbol_1)).h;
Inner const i = (*(tint_symbol_1)).i;
- tint_array_wrapper const j = (*(tint_symbol_1)).j;
+ tint_array<Inner, 4> const j = (*(tint_symbol_1)).j;
return;
}
diff --git a/test/tint/buffer/storage/static_index/write.wgsl.expected.msl b/test/tint/buffer/storage/static_index/write.wgsl.expected.msl
index ae3ab67..afb9718 100644
--- a/test/tint/buffer/storage/static_index/write.wgsl.expected.msl
+++ b/test/tint/buffer/storage/static_index/write.wgsl.expected.msl
@@ -12,12 +12,20 @@
return vec<T, M>(lhs) * rhs;
}
-struct Inner {
- /* 0x0000 */ int x;
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- /* 0x0000 */ Inner arr[4];
+struct Inner {
+ /* 0x0000 */ int x;
};
struct S {
@@ -30,8 +38,8 @@
/* 0x0030 */ float2x3 g;
/* 0x0050 */ float3x2 h;
/* 0x0068 */ Inner i;
- /* 0x006c */ tint_array_wrapper j;
- /* 0x007c */ int8_t tint_pad[4];
+ /* 0x006c */ tint_array<Inner, 4> j;
+ /* 0x007c */ tint_array<int8_t, 4> tint_pad;
};
kernel void tint_symbol(device S* tint_symbol_3 [[buffer(0)]]) {
@@ -45,7 +53,7 @@
(*(tint_symbol_3)).h = float3x2(float2(0.0f), float2(0.0f), float2(0.0f));
Inner const tint_symbol_1 = {};
(*(tint_symbol_3)).i = tint_symbol_1;
- tint_array_wrapper const tint_symbol_2 = {.arr={}};
+ tint_array<Inner, 4> const tint_symbol_2 = tint_array<Inner, 4>{};
(*(tint_symbol_3)).j = tint_symbol_2;
return;
}
diff --git a/test/tint/buffer/storage/types/array.wgsl.expected.msl b/test/tint/buffer/storage/types/array.wgsl.expected.msl
index 685b94a..9155f75 100644
--- a/test/tint/buffer/storage/types/array.wgsl.expected.msl
+++ b/test/tint/buffer/storage/types/array.wgsl.expected.msl
@@ -1,11 +1,20 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ float arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-kernel void tint_symbol(device tint_array_wrapper* tint_symbol_1 [[buffer(0)]], const device tint_array_wrapper* tint_symbol_2 [[buffer(1)]]) {
+kernel void tint_symbol(device tint_array<float, 4>* tint_symbol_1 [[buffer(0)]], const device tint_array<float, 4>* tint_symbol_2 [[buffer(1)]]) {
*(tint_symbol_1) = *(tint_symbol_2);
return;
}
diff --git a/test/tint/buffer/storage/types/runtime_array.wgsl.expected.msl b/test/tint/buffer/storage/types/runtime_array.wgsl.expected.msl
index 47fcb21..836dba1 100644
--- a/test/tint/buffer/storage/types/runtime_array.wgsl.expected.msl
+++ b/test/tint/buffer/storage/types/runtime_array.wgsl.expected.msl
@@ -1,16 +1,29 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ float f;
};
struct tint_symbol_2 {
- /* 0x0000 */ S arr[1];
+ /* 0x0000 */ tint_array<S, 1> arr;
};
struct tint_symbol_4 {
- /* 0x0000 */ S arr[1];
+ /* 0x0000 */ tint_array<S, 1> arr;
};
kernel void tint_symbol(device tint_symbol_2* tint_symbol_1 [[buffer(0)]], const device tint_symbol_4* tint_symbol_3 [[buffer(1)]]) {
diff --git a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.msl b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.msl
index d781b86..e361022 100644
--- a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.msl
@@ -12,8 +12,16 @@
return vec<T, M>(lhs) * rhs;
}
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct Inner {
@@ -27,30 +35,26 @@
/* 0x0038 */ int2 h;
/* 0x0040 */ float2x3 i;
/* 0x0060 */ float3x2 j;
- /* 0x0078 */ int8_t tint_pad[8];
- /* 0x0080 */ tint_array_wrapper k;
-};
-
-struct tint_array_wrapper_1 {
- /* 0x0000 */ Inner arr[8];
+ /* 0x0078 */ tint_array<int8_t, 8> tint_pad;
+ /* 0x0080 */ tint_array<int4, 4> k;
};
struct S {
- /* 0x0000 */ tint_array_wrapper_1 arr;
+ /* 0x0000 */ tint_array<Inner, 8> arr;
};
void tint_symbol_inner(uint idx, const constant S* const tint_symbol_1) {
- int3 const a = (*(tint_symbol_1)).arr.arr[idx].a;
- int const b = (*(tint_symbol_1)).arr.arr[idx].b;
- uint3 const c = (*(tint_symbol_1)).arr.arr[idx].c;
- uint const d = (*(tint_symbol_1)).arr.arr[idx].d;
- float3 const e = (*(tint_symbol_1)).arr.arr[idx].e;
- float const f = (*(tint_symbol_1)).arr.arr[idx].f;
- int2 const g = (*(tint_symbol_1)).arr.arr[idx].g;
- int2 const h = (*(tint_symbol_1)).arr.arr[idx].h;
- float2x3 const i = (*(tint_symbol_1)).arr.arr[idx].i;
- float3x2 const j = (*(tint_symbol_1)).arr.arr[idx].j;
- tint_array_wrapper const k = (*(tint_symbol_1)).arr.arr[idx].k;
+ int3 const a = (*(tint_symbol_1)).arr[idx].a;
+ int const b = (*(tint_symbol_1)).arr[idx].b;
+ uint3 const c = (*(tint_symbol_1)).arr[idx].c;
+ uint const d = (*(tint_symbol_1)).arr[idx].d;
+ float3 const e = (*(tint_symbol_1)).arr[idx].e;
+ float const f = (*(tint_symbol_1)).arr[idx].f;
+ int2 const g = (*(tint_symbol_1)).arr[idx].g;
+ int2 const h = (*(tint_symbol_1)).arr[idx].h;
+ float2x3 const i = (*(tint_symbol_1)).arr[idx].i;
+ float3x2 const j = (*(tint_symbol_1)).arr[idx].j;
+ tint_array<int4, 4> const k = (*(tint_symbol_1)).arr[idx].k;
}
kernel void tint_symbol(const constant S* tint_symbol_2 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
diff --git a/test/tint/buffer/uniform/static_index/read.wgsl.expected.msl b/test/tint/buffer/uniform/static_index/read.wgsl.expected.msl
index 26abf26..26497bd 100644
--- a/test/tint/buffer/uniform/static_index/read.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/static_index/read.wgsl.expected.msl
@@ -2,6 +2,18 @@
using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
return lhs * vec<T, N>(rhs);
@@ -14,11 +26,7 @@
struct Inner {
/* 0x0000 */ int x;
- /* 0x0004 */ int8_t tint_pad[12];
-};
-
-struct tint_array_wrapper {
- /* 0x0000 */ Inner arr[4];
+ /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
};
struct S {
@@ -32,9 +40,9 @@
/* 0x0038 */ int2 h;
/* 0x0040 */ float2x3 i;
/* 0x0060 */ float3x2 j;
- /* 0x0078 */ int8_t tint_pad_1[8];
+ /* 0x0078 */ tint_array<int8_t, 8> tint_pad_1;
/* 0x0080 */ Inner k;
- /* 0x0090 */ tint_array_wrapper l;
+ /* 0x0090 */ tint_array<Inner, 4> l;
};
kernel void tint_symbol(const constant S* tint_symbol_1 [[buffer(0)]]) {
@@ -49,7 +57,7 @@
float2x3 const i = (*(tint_symbol_1)).i;
float3x2 const j = (*(tint_symbol_1)).j;
Inner const k = (*(tint_symbol_1)).k;
- tint_array_wrapper const l = (*(tint_symbol_1)).l;
+ tint_array<Inner, 4> const l = (*(tint_symbol_1)).l;
return;
}
diff --git a/test/tint/buffer/uniform/types/array.wgsl.expected.msl b/test/tint/buffer/uniform/types/array.wgsl.expected.msl
index 71c0b99..730f4b1 100644
--- a/test/tint/buffer/uniform/types/array.wgsl.expected.msl
+++ b/test/tint/buffer/uniform/types/array.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ float4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-kernel void tint_symbol(const constant tint_array_wrapper* tint_symbol_1 [[buffer(0)]]) {
- tint_array_wrapper const x = *(tint_symbol_1);
+kernel void tint_symbol(const constant tint_array<float4, 4>* tint_symbol_1 [[buffer(0)]]) {
+ tint_array<float4, 4> const x = *(tint_symbol_1);
return;
}
diff --git a/test/tint/bug/chromium/1273230.wgsl.expected.msl b/test/tint/bug/chromium/1273230.wgsl.expected.msl
index 0052f59..08f7854 100644
--- a/test/tint/bug/chromium/1273230.wgsl.expected.msl
+++ b/test/tint/bug/chromium/1273230.wgsl.expected.msl
@@ -12,6 +12,18 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
void marg8uintin() {
}
@@ -21,9 +33,9 @@
/* 0x0008 */ uint puuuuuuuuuuuuuuuuad1;
/* 0x000c */ uint pad2;
/* 0x0010 */ packed_float3 bbMin;
- /* 0x001c */ int8_t tint_pad[4];
+ /* 0x001c */ tint_array<int8_t, 4> tint_pad;
/* 0x0020 */ packed_float3 bbMax;
- /* 0x002c */ int8_t tint_pad_1[4];
+ /* 0x002c */ tint_array<int8_t, 4> tint_pad_1;
};
struct Dbg {
@@ -42,23 +54,23 @@
};
struct F32s {
- /* 0x0000 */ float values[1];
+ /* 0x0000 */ tint_array<float, 1> values;
};
struct U32s {
- /* 0x0000 */ uint values[1];
+ /* 0x0000 */ tint_array<uint, 1> values;
};
struct I32s {
- int values[1];
+ tint_array<int, 1> values;
};
struct AU32s {
- /* 0x0000 */ atomic_uint values[1];
+ /* 0x0000 */ tint_array<atomic_uint, 1> values;
};
struct AI32s {
- /* 0x0000 */ atomic_int values[1];
+ /* 0x0000 */ tint_array<atomic_int, 1> values;
};
float3 toVoxelPos(float3 position, const constant Uniforms* const tint_symbol) {
diff --git a/test/tint/bug/chromium/1290107.wgsl.expected.msl b/test/tint/bug/chromium/1290107.wgsl.expected.msl
index 5b9d426..de7b6e3 100644
--- a/test/tint/bug/chromium/1290107.wgsl.expected.msl
+++ b/test/tint/bug/chromium/1290107.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct S {
diff --git a/test/tint/bug/dawn/947.wgsl.expected.msl b/test/tint/bug/dawn/947.wgsl.expected.msl
index f65b451..68d2045 100644
--- a/test/tint/bug/dawn/947.wgsl.expected.msl
+++ b/test/tint/bug/dawn/947.wgsl.expected.msl
@@ -13,6 +13,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ float2 u_scale;
/* 0x0008 */ float2 u_offset;
@@ -28,19 +41,15 @@
float4 position [[position]];
};
-struct tint_array_wrapper {
- float2 arr[3];
-};
-
VertexOutputs vs_main_inner(uint VertexIndex, const constant Uniforms* const tint_symbol_5) {
- tint_array_wrapper texcoord = {.arr={float2(-0.5f, 0.0f), float2(1.5f, 0.0f), float2(0.5f, 2.0f)}};
+ tint_array<float2, 3> texcoord = tint_array<float2, 3>{float2(-0.5f, 0.0f), float2(1.5f, 0.0f), float2(0.5f, 2.0f)};
VertexOutputs output = {};
- output.position = float4(((texcoord.arr[VertexIndex] * 2.0f) - float2(1.0f)), 0.0f, 1.0f);
+ output.position = float4(((texcoord[VertexIndex] * 2.0f) - float2(1.0f)), 0.0f, 1.0f);
bool flipY = ((*(tint_symbol_5)).u_scale[1] < 0.0f);
if (flipY) {
- output.texcoords = ((((texcoord.arr[VertexIndex] * (*(tint_symbol_5)).u_scale) + (*(tint_symbol_5)).u_offset) * float2(1.0f, -1.0f)) + float2(0.0f, 1.0f));
+ output.texcoords = ((((texcoord[VertexIndex] * (*(tint_symbol_5)).u_scale) + (*(tint_symbol_5)).u_offset) * float2(1.0f, -1.0f)) + float2(0.0f, 1.0f));
} else {
- output.texcoords = ((((texcoord.arr[VertexIndex] * float2(1.0f, -1.0f)) + float2(0.0f, 1.0f)) * (*(tint_symbol_5)).u_scale) + (*(tint_symbol_5)).u_offset);
+ output.texcoords = ((((texcoord[VertexIndex] * float2(1.0f, -1.0f)) + float2(0.0f, 1.0f)) * (*(tint_symbol_5)).u_scale) + (*(tint_symbol_5)).u_offset);
}
return output;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.msl
index 271eaa1..8f724a6 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -19,7 +28,7 @@
kernel void f(device Result* tint_symbol [[buffer(1)]], const constant UBO* tint_symbol_1 [[buffer(0)]]) {
S s = {};
- (*(tint_symbol)).out = s.data.arr[(*(tint_symbol_1)).dynamic_idx];
+ (*(tint_symbol)).out = s.data[(*(tint_symbol_1)).dynamic_idx];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl
index 00b6f03..8ac8114 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -19,7 +28,7 @@
kernel void f(device Result* tint_symbol [[buffer(1)]], const constant UBO* tint_symbol_2 [[buffer(0)]]) {
thread S tint_symbol_1 = {};
- (*(tint_symbol)).out = tint_symbol_1.data.arr[(*(tint_symbol_2)).dynamic_idx];
+ (*(tint_symbol)).out = tint_symbol_1.data[(*(tint_symbol_2)).dynamic_idx];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.msl
index 92fb6e6..c802c8f 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
@@ -9,16 +22,12 @@
/* 0x0000 */ int out;
};
-struct tint_array_wrapper {
- /* 0x0000 */ int arr[4];
-};
-
struct SSBO {
- /* 0x0000 */ tint_array_wrapper data;
+ /* 0x0000 */ tint_array<int, 4> data;
};
kernel void f(device Result* tint_symbol [[buffer(1)]], device SSBO* tint_symbol_1 [[buffer(2)]], const constant UBO* tint_symbol_2 [[buffer(0)]]) {
- (*(tint_symbol)).out = (*(tint_symbol_1)).data.arr[(*(tint_symbol_2)).dynamic_idx];
+ (*(tint_symbol)).out = (*(tint_symbol_1)).data[(*(tint_symbol_2)).dynamic_idx];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.msl
index 48d71be..c9ab959 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.msl
@@ -1,14 +1,23 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct UBO {
- /* 0x0000 */ tint_array_wrapper data;
+ /* 0x0000 */ tint_array<int4, 4> data;
/* 0x0040 */ int dynamic_idx;
- /* 0x0044 */ int8_t tint_pad[12];
+ /* 0x0044 */ tint_array<int8_t, 12> tint_pad;
};
struct Result {
@@ -16,7 +25,7 @@
};
kernel void f(device Result* tint_symbol [[buffer(1)]], const constant UBO* tint_symbol_1 [[buffer(0)]]) {
- (*(tint_symbol)).out = (*(tint_symbol_1)).data.arr[(*(tint_symbol_1)).dynamic_idx][0];
+ (*(tint_symbol)).out = (*(tint_symbol_1)).data[(*(tint_symbol_1)).dynamic_idx][0];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.msl
index 2566aba..b8557fd 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -20,10 +29,10 @@
void f_inner(uint local_invocation_index, threadgroup S* const tint_symbol, device Result* const tint_symbol_1, const constant UBO* const tint_symbol_2) {
for(uint idx = local_invocation_index; (idx < 64u); idx = (idx + 1u)) {
uint const i = idx;
- (*(tint_symbol)).data.arr[i] = 0;
+ (*(tint_symbol)).data[i] = 0;
}
threadgroup_barrier(mem_flags::mem_threadgroup);
- (*(tint_symbol_1)).out = (*(tint_symbol)).data.arr[(*(tint_symbol_2)).dynamic_idx];
+ (*(tint_symbol_1)).out = (*(tint_symbol)).data[(*(tint_symbol_2)).dynamic_idx];
}
kernel void f(device Result* tint_symbol_4 [[buffer(1)]], const constant UBO* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.msl
index c4e1dff..1fe02f1 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -19,8 +28,8 @@
kernel void f(const constant UBO* tint_symbol [[buffer(0)]], device Result* tint_symbol_1 [[buffer(1)]]) {
S s = {};
- s.data.arr[(*(tint_symbol)).dynamic_idx] = 1;
- (*(tint_symbol_1)).out = s.data.arr[3];
+ s.data[(*(tint_symbol)).dynamic_idx] = 1;
+ (*(tint_symbol_1)).out = s.data[3];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.msl
index b9efff8..5aabd3a 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -18,13 +27,13 @@
};
void x(thread S* const p, const constant UBO* const tint_symbol) {
- (*(p)).data.arr[(*(tint_symbol)).dynamic_idx] = 1;
+ (*(p)).data[(*(tint_symbol)).dynamic_idx] = 1;
}
kernel void f(const constant UBO* tint_symbol_1 [[buffer(0)]], device Result* tint_symbol_2 [[buffer(1)]]) {
S s = {};
x(&(s), tint_symbol_1);
- (*(tint_symbol_2)).out = s.data.arr[3];
+ (*(tint_symbol_2)).out = s.data[3];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl
index 2a59ee4..6f94f24 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -19,8 +28,8 @@
kernel void f(const constant UBO* tint_symbol_1 [[buffer(0)]], device Result* tint_symbol_2 [[buffer(1)]]) {
thread S tint_symbol = {};
- tint_symbol.data.arr[(*(tint_symbol_1)).dynamic_idx] = 1;
- (*(tint_symbol_2)).out = tint_symbol.data.arr[3];
+ tint_symbol.data[(*(tint_symbol_1)).dynamic_idx] = 1;
+ (*(tint_symbol_2)).out = tint_symbol.data[3];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl
index a27679e..0a31f28 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -18,13 +27,13 @@
};
void x(thread S* const p, const constant UBO* const tint_symbol) {
- (*(p)).data.arr[(*(tint_symbol)).dynamic_idx] = 1;
+ (*(p)).data[(*(tint_symbol)).dynamic_idx] = 1;
}
kernel void f(const constant UBO* tint_symbol_2 [[buffer(0)]], device Result* tint_symbol_3 [[buffer(1)]]) {
thread S tint_symbol_1 = {};
x(&(tint_symbol_1), tint_symbol_2);
- (*(tint_symbol_3)).out = tint_symbol_1.data.arr[3];
+ (*(tint_symbol_3)).out = tint_symbol_1.data[3];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.msl
index ca1afb5..747fc40 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
@@ -9,17 +22,13 @@
/* 0x0000 */ int out;
};
-struct tint_array_wrapper {
- /* 0x0000 */ int arr[4];
-};
-
struct SSBO {
- /* 0x0000 */ tint_array_wrapper data;
+ /* 0x0000 */ tint_array<int, 4> data;
};
kernel void f(device SSBO* tint_symbol [[buffer(1)]], const constant UBO* tint_symbol_1 [[buffer(0)]], device Result* tint_symbol_2 [[buffer(2)]]) {
- (*(tint_symbol)).data.arr[(*(tint_symbol_1)).dynamic_idx] = 1;
- (*(tint_symbol_2)).out = (*(tint_symbol)).data.arr[3];
+ (*(tint_symbol)).data[(*(tint_symbol_1)).dynamic_idx] = 1;
+ (*(tint_symbol_2)).out = (*(tint_symbol)).data[3];
return;
}
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.msl b/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.msl
index 2a33967..fa5f687 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.msl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UBO {
/* 0x0000 */ int dynamic_idx;
};
-struct tint_array_wrapper {
- int arr[64];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<int, 64> data;
};
struct Result {
@@ -20,11 +29,11 @@
void f_inner(uint local_invocation_index, threadgroup S* const tint_symbol, const constant UBO* const tint_symbol_1, device Result* const tint_symbol_2) {
for(uint idx = local_invocation_index; (idx < 64u); idx = (idx + 1u)) {
uint const i = idx;
- (*(tint_symbol)).data.arr[i] = 0;
+ (*(tint_symbol)).data[i] = 0;
}
threadgroup_barrier(mem_flags::mem_threadgroup);
- (*(tint_symbol)).data.arr[(*(tint_symbol_1)).dynamic_idx] = 1;
- (*(tint_symbol_2)).out = (*(tint_symbol)).data.arr[3];
+ (*(tint_symbol)).data[(*(tint_symbol_1)).dynamic_idx] = 1;
+ (*(tint_symbol_2)).out = (*(tint_symbol)).data[3];
}
kernel void f(const constant UBO* tint_symbol_4 [[buffer(0)]], device Result* tint_symbol_5 [[buffer(1)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
diff --git a/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.msl b/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.msl
index de2ff47..6507f58 100644
--- a/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.msl
+++ b/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.msl
@@ -2,6 +2,18 @@
using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
return lhs * vec<T, N>(rhs);
@@ -16,26 +28,22 @@
/* 0x0000 */ uint i;
};
-struct tint_array_wrapper {
- /* 0x0000 */ float3 arr[8];
-};
-
struct Particle {
- /* 0x0000 */ tint_array_wrapper position;
+ /* 0x0000 */ tint_array<float3, 8> position;
/* 0x0080 */ float lifetime;
- /* 0x0084 */ int8_t tint_pad[12];
+ /* 0x0084 */ tint_array<int8_t, 12> tint_pad;
/* 0x0090 */ float4 color;
/* 0x00a0 */ packed_float3 velocity;
- /* 0x00ac */ int8_t tint_pad_1[4];
+ /* 0x00ac */ tint_array<int8_t, 4> tint_pad_1;
};
struct Particles {
- /* 0x0000 */ Particle p[1];
+ /* 0x0000 */ tint_array<Particle, 1> p;
};
kernel void tint_symbol(const device Particles* tint_symbol_1 [[buffer(1)]], const constant Simulation* tint_symbol_2 [[buffer(0)]]) {
Particle particle = (*(tint_symbol_1)).p[0];
- particle.position.arr[(*(tint_symbol_2)).i] = particle.position.arr[(*(tint_symbol_2)).i];
+ particle.position[(*(tint_symbol_2)).i] = particle.position[(*(tint_symbol_2)).i];
return;
}
diff --git a/test/tint/bug/tint/1046.wgsl.expected.msl b/test/tint/bug/tint/1046.wgsl.expected.msl
index feb5d4d..c79bc0a 100644
--- a/test/tint/bug/tint/1046.wgsl.expected.msl
+++ b/test/tint/bug/tint/1046.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct PointLight {
float4 position;
};
struct PointLights {
- PointLight values[1];
+ tint_array<PointLight, 1> values;
};
struct Uniforms {
@@ -14,7 +27,7 @@
/* 0x0040 */ float4x4 proj;
/* 0x0080 */ uint numPointLights;
/* 0x0084 */ uint color_source;
- /* 0x0088 */ int8_t tint_pad[8];
+ /* 0x0088 */ tint_array<int8_t, 8> tint_pad;
/* 0x0090 */ float4 color;
};
diff --git a/test/tint/bug/tint/1088.spvasm.expected.msl b/test/tint/bug/tint/1088.spvasm.expected.msl
index b2533c6..392fd22 100644
--- a/test/tint/bug/tint/1088.spvasm.expected.msl
+++ b/test/tint/bug/tint/1088.spvasm.expected.msl
@@ -1,25 +1,30 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ float4x4 arr[2];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct strided_arr {
/* 0x0000 */ float el;
- /* 0x0004 */ int8_t tint_pad[12];
-};
-
-struct tint_array_wrapper_1 {
- /* 0x0000 */ strided_arr arr[4];
+ /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
};
struct LeftOver {
/* 0x0000 */ float4x4 worldViewProjection;
/* 0x0040 */ float time;
- /* 0x0044 */ int8_t tint_pad_1[12];
- /* 0x0050 */ tint_array_wrapper test2;
- /* 0x00d0 */ tint_array_wrapper_1 test;
+ /* 0x0044 */ tint_array<int8_t, 12> tint_pad_1;
+ /* 0x0050 */ tint_array<float4x4, 2> test2;
+ /* 0x00d0 */ tint_array<strided_arr, 4> test;
};
void main_1(thread float3* const tint_symbol_5, const constant LeftOver* const tint_symbol_6, thread float4* const tint_symbol_7, thread float2* const tint_symbol_8, thread float2* const tint_symbol_9) {
@@ -30,7 +35,7 @@
float4 const x_21 = q;
p = float3(x_21[0], x_21[1], x_21[2]);
float const x_27 = p[0];
- float const x_41 = (*(tint_symbol_6)).test.arr[0].el;
+ float const x_41 = (*(tint_symbol_6)).test[0].el;
float const x_45 = (*(tint_symbol_5))[1];
float const x_49 = (*(tint_symbol_6)).time;
p[0] = (x_27 + sin(((x_41 * x_45) + x_49)));
diff --git a/test/tint/bug/tint/1113.wgsl.expected.msl b/test/tint/bug/tint/1113.wgsl.expected.msl
index 2c4dcc8..b62d4c5 100644
--- a/test/tint/bug/tint/1113.wgsl.expected.msl
+++ b/test/tint/bug/tint/1113.wgsl.expected.msl
@@ -12,15 +12,27 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint numTriangles;
/* 0x0004 */ uint gridSize;
/* 0x0008 */ uint pad1;
/* 0x000c */ uint pad2;
/* 0x0010 */ packed_float3 bbMin;
- /* 0x001c */ int8_t tint_pad[4];
+ /* 0x001c */ tint_array<int8_t, 4> tint_pad;
/* 0x0020 */ packed_float3 bbMax;
- /* 0x002c */ int8_t tint_pad_1[4];
+ /* 0x002c */ tint_array<int8_t, 4> tint_pad_1;
};
struct Dbg {
@@ -39,23 +51,23 @@
};
struct F32s {
- /* 0x0000 */ float values[1];
+ /* 0x0000 */ tint_array<float, 1> values;
};
struct U32s {
- /* 0x0000 */ uint values[1];
+ /* 0x0000 */ tint_array<uint, 1> values;
};
struct I32s {
- int values[1];
+ tint_array<int, 1> values;
};
struct AU32s {
- /* 0x0000 */ atomic_uint values[1];
+ /* 0x0000 */ tint_array<atomic_uint, 1> values;
};
struct AI32s {
- /* 0x0000 */ atomic_int values[1];
+ /* 0x0000 */ tint_array<atomic_int, 1> values;
};
float3 toVoxelPos(float3 position, const constant Uniforms* const tint_symbol_1) {
diff --git a/test/tint/bug/tint/1121.wgsl.expected.msl b/test/tint/bug/tint/1121.wgsl.expected.msl
index 4800aec..5e8c10f 100644
--- a/test/tint/bug/tint/1121.wgsl.expected.msl
+++ b/test/tint/bug/tint/1121.wgsl.expected.msl
@@ -12,6 +12,18 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct LightData {
/* 0x0000 */ float4 position;
/* 0x0010 */ packed_float3 color;
@@ -19,24 +31,16 @@
};
struct LightsBuffer {
- /* 0x0000 */ LightData lights[1];
-};
-
-struct tint_array_wrapper {
- /* 0x0000 */ uint arr[64];
+ /* 0x0000 */ tint_array<LightData, 1> lights;
};
struct TileLightIdData {
/* 0x0000 */ atomic_uint count;
- /* 0x0004 */ tint_array_wrapper lightId;
-};
-
-struct tint_array_wrapper_1 {
- /* 0x0000 */ TileLightIdData arr[4];
+ /* 0x0004 */ tint_array<uint, 64> lightId;
};
struct Tiles {
- /* 0x0000 */ tint_array_wrapper_1 data;
+ /* 0x0000 */ tint_array<TileLightIdData, 4> data;
};
struct Config {
@@ -56,10 +60,6 @@
/* 0x00a0 */ float4 fullScreenSize;
};
-struct tint_array_wrapper_2 {
- float4 arr[6];
-};
-
void tint_symbol_inner(uint3 GlobalInvocationID, const constant Config* const tint_symbol_1, device LightsBuffer* const tint_symbol_2, const constant Uniforms* const tint_symbol_3, device Tiles* const tint_symbol_4) {
uint index = GlobalInvocationID[0];
if ((index >= (*(tint_symbol_1)).numLights)) {
@@ -78,9 +78,9 @@
float lightRadius = (*(tint_symbol_2)).lights[index].radius;
float4 boxMin = (lightPos - float4(float3(lightRadius), 0.0f));
float4 boxMax = (lightPos + float4(float3(lightRadius), 0.0f));
- tint_array_wrapper_2 frustumPlanes = {};
- frustumPlanes.arr[4] = float4(0.0f, 0.0f, -1.0f, viewNear);
- frustumPlanes.arr[5] = float4(0.0f, 0.0f, 1.0f, -(viewFar));
+ tint_array<float4, 6> frustumPlanes = {};
+ frustumPlanes[4] = float4(0.0f, 0.0f, -1.0f, viewNear);
+ frustumPlanes[5] = float4(0.0f, 0.0f, 1.0f, -(viewFar));
int const TILE_SIZE = 16;
int const TILE_COUNT_X = 2;
int const TILE_COUNT_Y = 2;
@@ -91,41 +91,41 @@
float2 ceilCoord = (((2.0f * float2(as_type<int2>((as_type<uint2>(tilePixel0Idx) + as_type<uint2>(int2(16)))))) / float4((*(tint_symbol_3)).fullScreenSize).xy) - float2(1.0f));
float2 viewFloorCoord = float2((((-(viewNear) * floorCoord[0]) - (M[2][0] * viewNear)) / M[0][0]), (((-(viewNear) * floorCoord[1]) - (M[2][1] * viewNear)) / M[1][1]));
float2 viewCeilCoord = float2((((-(viewNear) * ceilCoord[0]) - (M[2][0] * viewNear)) / M[0][0]), (((-(viewNear) * ceilCoord[1]) - (M[2][1] * viewNear)) / M[1][1]));
- frustumPlanes.arr[0] = float4(1.0f, 0.0f, (-(viewFloorCoord[0]) / viewNear), 0.0f);
- frustumPlanes.arr[1] = float4(-1.0f, 0.0f, (viewCeilCoord[0] / viewNear), 0.0f);
- frustumPlanes.arr[2] = float4(0.0f, 1.0f, (-(viewFloorCoord[1]) / viewNear), 0.0f);
- frustumPlanes.arr[3] = float4(0.0f, -1.0f, (viewCeilCoord[1] / viewNear), 0.0f);
+ frustumPlanes[0] = float4(1.0f, 0.0f, (-(viewFloorCoord[0]) / viewNear), 0.0f);
+ frustumPlanes[1] = float4(-1.0f, 0.0f, (viewCeilCoord[0] / viewNear), 0.0f);
+ frustumPlanes[2] = float4(0.0f, 1.0f, (-(viewFloorCoord[1]) / viewNear), 0.0f);
+ frustumPlanes[3] = float4(0.0f, -1.0f, (viewCeilCoord[1] / viewNear), 0.0f);
float dp = 0.0f;
for(uint i = 0u; (i < 6u); i = (i + 1u)) {
float4 p = 0.0f;
- if ((frustumPlanes.arr[i][0] > 0.0f)) {
+ if ((frustumPlanes[i][0] > 0.0f)) {
p[0] = boxMax[0];
} else {
p[0] = boxMin[0];
}
- if ((frustumPlanes.arr[i][1] > 0.0f)) {
+ if ((frustumPlanes[i][1] > 0.0f)) {
p[1] = boxMax[1];
} else {
p[1] = boxMin[1];
}
- if ((frustumPlanes.arr[i][2] > 0.0f)) {
+ if ((frustumPlanes[i][2] > 0.0f)) {
p[2] = boxMax[2];
} else {
p[2] = boxMin[2];
}
p[3] = 1.0f;
- dp = (dp + fmin(0.0f, dot(p, frustumPlanes.arr[i])));
+ dp = (dp + fmin(0.0f, dot(p, frustumPlanes[i])));
}
if ((dp >= 0.0f)) {
uint tileId = uint(as_type<int>((as_type<uint>(x_1) + as_type<uint>(as_type<int>((as_type<uint>(y_1) * as_type<uint>(2)))))));
if (((tileId < 0u) || (tileId >= (*(tint_symbol_1)).numTiles))) {
continue;
}
- uint offset = atomic_fetch_add_explicit(&((*(tint_symbol_4)).data.arr[tileId].count), 1u, memory_order_relaxed);
+ uint offset = atomic_fetch_add_explicit(&((*(tint_symbol_4)).data[tileId].count), 1u, memory_order_relaxed);
if ((offset >= (*(tint_symbol_1)).numTileLightSlot)) {
continue;
}
- (*(tint_symbol_4)).data.arr[tileId].lightId.arr[offset] = GlobalInvocationID[0];
+ (*(tint_symbol_4)).data[tileId].lightId[offset] = GlobalInvocationID[0];
}
}
}
diff --git a/test/tint/bug/tint/1321.wgsl.expected.msl b/test/tint/bug/tint/1321.wgsl.expected.msl
index 8c96d14..c67bb76 100644
--- a/test/tint/bug/tint/1321.wgsl.expected.msl
+++ b/test/tint/bug/tint/1321.wgsl.expected.msl
@@ -1,20 +1,29 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
int foo() {
return 1;
}
-struct tint_array_wrapper {
- float arr[4];
-};
-
fragment void tint_symbol() {
- tint_array_wrapper arr = {.arr={}};
+ tint_array<float, 4> arr = tint_array<float, 4>{};
int const tint_symbol_1 = foo();
int const a_save = tint_symbol_1;
for(; ; ) {
- float const x = arr.arr[a_save];
+ float const x = arr[a_save];
break;
}
return;
diff --git a/test/tint/bug/tint/1385.wgsl.expected.msl b/test/tint/bug/tint/1385.wgsl.expected.msl
index 838babd..c57afce 100644
--- a/test/tint/bug/tint/1385.wgsl.expected.msl
+++ b/test/tint/bug/tint/1385.wgsl.expected.msl
@@ -1,11 +1,24 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_symbol_3 {
- /* 0x0000 */ int arr[1];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-int foo(const device int (*const tint_symbol_1)[1]) {
+struct tint_symbol_3 {
+ /* 0x0000 */ tint_array<int, 1> arr;
+};
+
+int foo(const device tint_array<int, 1>* const tint_symbol_1) {
return (*(tint_symbol_1))[0];
}
diff --git a/test/tint/bug/tint/1520.spvasm.expected.msl b/test/tint/bug/tint/1520.spvasm.expected.msl
index 909a052..a556dee 100644
--- a/test/tint/bug/tint/1520.spvasm.expected.msl
+++ b/test/tint/bug/tint/1520.spvasm.expected.msl
@@ -1,10 +1,23 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct UniformBuffer {
- /* 0x0000 */ int8_t tint_pad[16];
+ /* 0x0000 */ tint_array<int8_t, 16> tint_pad;
/* 0x0010 */ float unknownInput_S1_c0;
- /* 0x0014 */ int8_t tint_pad_1[12];
+ /* 0x0014 */ tint_array<int8_t, 12> tint_pad_1;
/* 0x0020 */ float4 ucolorRed_S1_c0;
/* 0x0030 */ float4 ucolorGreen_S1_c0;
/* 0x0040 */ float3x3 umatrix_S1;
diff --git a/test/tint/bug/tint/221.wgsl.expected.msl b/test/tint/bug/tint/221.wgsl.expected.msl
index 880fc07..ad7d150 100644
--- a/test/tint/bug/tint/221.wgsl.expected.msl
+++ b/test/tint/bug/tint/221.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ uint arr[50];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct Buf {
/* 0x0000 */ uint count;
- /* 0x0004 */ tint_array_wrapper data;
+ /* 0x0004 */ tint_array<uint, 50> data;
};
kernel void tint_symbol(device Buf* tint_symbol_1 [[buffer(0)]]) {
@@ -19,14 +28,14 @@
uint const p_save = i;
if (((i % 2u) == 0u)) {
{
- (*(tint_symbol_1)).data.arr[p_save] = ((*(tint_symbol_1)).data.arr[p_save] * 2u);
+ (*(tint_symbol_1)).data[p_save] = ((*(tint_symbol_1)).data[p_save] * 2u);
i = (i + 1u);
}
continue;
}
- (*(tint_symbol_1)).data.arr[p_save] = 0u;
+ (*(tint_symbol_1)).data[p_save] = 0u;
{
- (*(tint_symbol_1)).data.arr[p_save] = ((*(tint_symbol_1)).data.arr[p_save] * 2u);
+ (*(tint_symbol_1)).data[p_save] = ((*(tint_symbol_1)).data[p_save] * 2u);
i = (i + 1u);
}
}
diff --git a/test/tint/bug/tint/294.wgsl.expected.msl b/test/tint/bug/tint/294.wgsl.expected.msl
index 09c1cf5..77c8cea 100644
--- a/test/tint/bug/tint/294.wgsl.expected.msl
+++ b/test/tint/bug/tint/294.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Light {
float3 position;
float3 colour;
};
struct Lights {
- Light light[1];
+ tint_array<Light, 1> light;
};
diff --git a/test/tint/bug/tint/403.wgsl.expected.msl b/test/tint/bug/tint/403.wgsl.expected.msl
index 94e0fbe..10c2d04 100644
--- a/test/tint/bug/tint/403.wgsl.expected.msl
+++ b/test/tint/bug/tint/403.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct vertexUniformBuffer1 {
/* 0x0000 */ float2x2 transform1;
};
@@ -13,18 +26,14 @@
float4 value [[position]];
};
-struct tint_array_wrapper {
- float2 arr[3];
-};
-
float4 tint_symbol_inner(uint gl_VertexIndex, const constant vertexUniformBuffer1* const tint_symbol_3, const constant vertexUniformBuffer2* const tint_symbol_4) {
- tint_array_wrapper indexable = {};
+ tint_array<float2, 3> indexable = {};
float2x2 const x_23 = (*(tint_symbol_3)).transform1;
float2x2 const x_28 = (*(tint_symbol_4)).transform2;
uint const x_46 = gl_VertexIndex;
- tint_array_wrapper const tint_symbol_2 = {.arr={float2(-1.0f, 1.0f), float2(1.0f), float2(-1.0f)}};
+ tint_array<float2, 3> const tint_symbol_2 = tint_array<float2, 3>{float2(-1.0f, 1.0f), float2(1.0f), float2(-1.0f)};
indexable = tint_symbol_2;
- float2 const x_51 = indexable.arr[x_46];
+ float2 const x_51 = indexable[x_46];
float2 const x_52 = (float2x2((x_23[0u] + x_28[0u]), (x_23[1u] + x_28[1u])) * x_51);
return float4(x_52[0], x_52[1], 0.0f, 1.0f);
}
diff --git a/test/tint/bug/tint/534.wgsl.expected.msl b/test/tint/bug/tint/534.wgsl.expected.msl
index a766b37..2323162 100644
--- a/test/tint/bug/tint/534.wgsl.expected.msl
+++ b/test/tint/bug/tint/534.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint dstTextureFlipY;
/* 0x0004 */ uint isFloat16;
@@ -9,7 +22,7 @@
};
struct OutputBuf {
- /* 0x0000 */ uint result[1];
+ /* 0x0000 */ tint_array<uint, 1> result;
};
uint ConvertToFp16FloatValue(float fp32) {
diff --git a/test/tint/bug/tint/744.wgsl.expected.msl b/test/tint/bug/tint/744.wgsl.expected.msl
index c4dc5b4..7c01635 100644
--- a/test/tint/bug/tint/744.wgsl.expected.msl
+++ b/test/tint/bug/tint/744.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint2 aShape;
/* 0x0008 */ uint2 bShape;
@@ -8,7 +21,7 @@
};
struct Matrix {
- /* 0x0000 */ uint numbers[1];
+ /* 0x0000 */ tint_array<uint, 1> numbers;
};
void tint_symbol_inner(uint3 global_id, const constant Uniforms* const tint_symbol_1, const device Matrix* const tint_symbol_2, const device Matrix* const tint_symbol_3, device Matrix* const tint_symbol_4) {
diff --git a/test/tint/bug/tint/749.spvasm.expected.msl b/test/tint/bug/tint/749.spvasm.expected.msl
index 89108e5..f14f399 100644
--- a/test/tint/bug/tint/749.spvasm.expected.msl
+++ b/test/tint/bug/tint/749.spvasm.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[10];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct QuicksortObject {
- tint_array_wrapper numbers;
+ tint_array<int, 10> numbers;
};
struct buf0 {
@@ -31,10 +40,10 @@
temp = 0;
temp = x_935;
int const x_30_save = x_28;
- int const x_936 = (*(tint_symbol_81)).numbers.arr[x_30_save];
- (*(tint_symbol_81)).numbers.arr[x_30_save] = 0;
- (*(tint_symbol_81)).numbers.arr[x_30_save] = x_936;
- int const x_31 = (*(tint_symbol_81)).numbers.arr[x_30_save];
+ int const x_936 = (*(tint_symbol_81)).numbers[x_30_save];
+ (*(tint_symbol_81)).numbers[x_30_save] = 0;
+ (*(tint_symbol_81)).numbers[x_30_save] = x_936;
+ int const x_31 = (*(tint_symbol_81)).numbers[x_30_save];
int const x_937 = temp;
temp = 0;
temp = x_937;
@@ -47,30 +56,30 @@
*(i) = 0;
*(i) = x_939;
int const x_32 = *(i);
- int const x_940 = (*(tint_symbol_81)).numbers.arr[x_30_save];
- (*(tint_symbol_81)).numbers.arr[x_30_save] = 0;
- (*(tint_symbol_81)).numbers.arr[x_30_save] = x_940;
+ int const x_940 = (*(tint_symbol_81)).numbers[x_30_save];
+ (*(tint_symbol_81)).numbers[x_30_save] = 0;
+ (*(tint_symbol_81)).numbers[x_30_save] = x_940;
int const x_33 = *(j);
int const x_941 = *(i);
*(i) = 0;
*(i) = x_941;
float3 const x_526 = float3(x_525[0], x_525[2], x_525[2]);
- int const x_942 = (*(tint_symbol_81)).numbers.arr[x_30_save];
- (*(tint_symbol_81)).numbers.arr[x_30_save] = 0;
- (*(tint_symbol_81)).numbers.arr[x_30_save] = x_942;
+ int const x_942 = (*(tint_symbol_81)).numbers[x_30_save];
+ (*(tint_symbol_81)).numbers[x_30_save] = 0;
+ (*(tint_symbol_81)).numbers[x_30_save] = x_942;
int const x_34_save = x_33;
- int const x_35 = (*(tint_symbol_81)).numbers.arr[x_34_save];
+ int const x_35 = (*(tint_symbol_81)).numbers[x_34_save];
QuicksortObject const x_943 = *(tint_symbol_81);
- tint_array_wrapper const tint_symbol_2 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_2 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_3 = {.numbers=tint_symbol_2};
*(tint_symbol_81) = tint_symbol_3;
*(tint_symbol_81) = x_943;
float2 const x_527 = float2(x_526[0], x_526[0]);
int const x_36_save = x_32;
float3 const x_528 = float3(x_524[0], x_524[2], x_524[0]);
- (*(tint_symbol_81)).numbers.arr[x_36_save] = x_35;
+ (*(tint_symbol_81)).numbers[x_36_save] = x_35;
QuicksortObject const x_944 = *(tint_symbol_81);
- tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_4 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_5 = {.numbers=tint_symbol_4};
*(tint_symbol_81) = tint_symbol_5;
*(tint_symbol_81) = x_944;
@@ -83,27 +92,27 @@
temp = 0;
temp = x_946;
float2 const x_530 = float2(x_529[2], x_529[1]);
- int const x_947 = (*(tint_symbol_81)).numbers.arr[x_34_save];
- (*(tint_symbol_81)).numbers.arr[x_34_save] = 0;
- (*(tint_symbol_81)).numbers.arr[x_34_save] = x_947;
+ int const x_947 = (*(tint_symbol_81)).numbers[x_34_save];
+ (*(tint_symbol_81)).numbers[x_34_save] = 0;
+ (*(tint_symbol_81)).numbers[x_34_save] = x_947;
int const x_38 = temp;
int const x_948 = *(j);
*(j) = 0;
*(j) = x_948;
float3 const x_531 = float3(x_527[0], x_526[1], x_526[0]);
- int const x_949 = (*(tint_symbol_81)).numbers.arr[x_36_save];
- (*(tint_symbol_81)).numbers.arr[x_36_save] = 0;
- (*(tint_symbol_81)).numbers.arr[x_36_save] = x_949;
+ int const x_949 = (*(tint_symbol_81)).numbers[x_36_save];
+ (*(tint_symbol_81)).numbers[x_36_save] = 0;
+ (*(tint_symbol_81)).numbers[x_36_save] = x_949;
QuicksortObject const x_950 = *(tint_symbol_81);
- tint_array_wrapper const tint_symbol_6 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_6 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_7 = {.numbers=tint_symbol_6};
*(tint_symbol_81) = tint_symbol_7;
*(tint_symbol_81) = x_950;
float3 const x_532 = float3(x_528[0], x_528[1], x_528[0]);
- int const x_951 = (*(tint_symbol_81)).numbers.arr[x_34_save];
- (*(tint_symbol_81)).numbers.arr[x_34_save] = 0;
- (*(tint_symbol_81)).numbers.arr[x_34_save] = x_951;
- (*(tint_symbol_81)).numbers.arr[x_37] = x_38;
+ int const x_951 = (*(tint_symbol_81)).numbers[x_34_save];
+ (*(tint_symbol_81)).numbers[x_34_save] = 0;
+ (*(tint_symbol_81)).numbers[x_34_save] = x_951;
+ (*(tint_symbol_81)).numbers[x_37] = x_38;
return;
}
@@ -125,10 +134,10 @@
*(l) = 0;
*(l) = x_953;
int const x_42_save = x_41;
- int const x_954 = (*(tint_symbol_82)).numbers.arr[x_42_save];
- (*(tint_symbol_82)).numbers.arr[x_42_save] = 0;
- (*(tint_symbol_82)).numbers.arr[x_42_save] = x_954;
- int const x_43 = (*(tint_symbol_82)).numbers.arr[x_42_save];
+ int const x_954 = (*(tint_symbol_82)).numbers[x_42_save];
+ (*(tint_symbol_82)).numbers[x_42_save] = 0;
+ (*(tint_symbol_82)).numbers[x_42_save] = x_954;
+ int const x_43 = (*(tint_symbol_82)).numbers[x_42_save];
int const x_955 = param_3;
param_3 = 0;
param_3 = x_955;
@@ -153,7 +162,7 @@
float3 const x_536 = float3(x_534[0], x_534[2], x_535[0]);
j_1 = 10;
QuicksortObject const x_960 = *(tint_symbol_82);
- tint_array_wrapper const tint_symbol_8 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_8 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_9 = {.numbers=tint_symbol_8};
*(tint_symbol_82) = tint_symbol_9;
*(tint_symbol_82) = x_960;
@@ -170,7 +179,7 @@
pivot = x_963;
x_537 = float2(float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[2]);
QuicksortObject const x_964 = *(tint_symbol_82);
- tint_array_wrapper const tint_symbol_10 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_10 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_11 = {.numbers=tint_symbol_10};
*(tint_symbol_82) = tint_symbol_11;
*(tint_symbol_82) = x_964;
@@ -193,9 +202,9 @@
break;
}
int const x_60 = j_1;
- int const x_969 = (*(tint_symbol_82)).numbers.arr[x_42_save];
- (*(tint_symbol_82)).numbers.arr[x_42_save] = 0;
- (*(tint_symbol_82)).numbers.arr[x_42_save] = x_969;
+ int const x_969 = (*(tint_symbol_82)).numbers[x_42_save];
+ (*(tint_symbol_82)).numbers[x_42_save] = 0;
+ (*(tint_symbol_82)).numbers[x_42_save] = x_969;
int const x_61_save = x_60;
int const x_970 = *(h);
*(h) = 0;
@@ -204,9 +213,9 @@
int const x_971 = param_1;
param_1 = 0;
param_1 = x_971;
- int const x_62 = (*(tint_symbol_82)).numbers.arr[x_61_save];
+ int const x_62 = (*(tint_symbol_82)).numbers[x_61_save];
QuicksortObject const x_972 = *(tint_symbol_82);
- tint_array_wrapper const tint_symbol_12 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_12 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_13 = {.numbers=tint_symbol_12};
*(tint_symbol_82) = tint_symbol_13;
*(tint_symbol_82) = x_972;
@@ -267,7 +276,7 @@
param_1 = x_985;
}
QuicksortObject const x_986 = *(tint_symbol_82);
- tint_array_wrapper const tint_symbol_14 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_14 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_15 = {.numbers=tint_symbol_14};
*(tint_symbol_82) = tint_symbol_15;
*(tint_symbol_82) = x_986;
@@ -280,9 +289,9 @@
*(h) = 0;
*(h) = x_988;
float3 const x_547 = float3(x_539[0], x_541[2], x_541[2]);
- int const x_989 = (*(tint_symbol_82)).numbers.arr[x_61_save];
- (*(tint_symbol_82)).numbers.arr[x_61_save] = 0;
- (*(tint_symbol_82)).numbers.arr[x_61_save] = x_989;
+ int const x_989 = (*(tint_symbol_82)).numbers[x_61_save];
+ (*(tint_symbol_82)).numbers[x_61_save] = 0;
+ (*(tint_symbol_82)).numbers[x_61_save] = x_989;
int const x_990 = param;
param = 0;
param = x_990;
@@ -291,18 +300,18 @@
param_1 = 0;
param_1 = x_991;
float3 const x_548 = float3(x_541[1], x_541[2], x_541[0]);
- int const x_992 = (*(tint_symbol_82)).numbers.arr[x_61_save];
- (*(tint_symbol_82)).numbers.arr[x_61_save] = 0;
- (*(tint_symbol_82)).numbers.arr[x_61_save] = x_992;
+ int const x_992 = (*(tint_symbol_82)).numbers[x_61_save];
+ (*(tint_symbol_82)).numbers[x_61_save] = 0;
+ (*(tint_symbol_82)).numbers[x_61_save] = x_992;
}
}
int const x_76 = i_1;
- int const x_993 = (*(tint_symbol_82)).numbers.arr[x_42_save];
- (*(tint_symbol_82)).numbers.arr[x_42_save] = 0;
- (*(tint_symbol_82)).numbers.arr[x_42_save] = x_993;
+ int const x_993 = (*(tint_symbol_82)).numbers[x_42_save];
+ (*(tint_symbol_82)).numbers[x_42_save] = 0;
+ (*(tint_symbol_82)).numbers[x_42_save] = x_993;
float2 const x_549 = float2(x_534[0], x_534[1]);
QuicksortObject const x_994 = *(tint_symbol_82);
- tint_array_wrapper const tint_symbol_16 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_16 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_17 = {.numbers=tint_symbol_16};
*(tint_symbol_82) = tint_symbol_17;
*(tint_symbol_82) = x_994;
@@ -364,15 +373,15 @@
int p = 0;
int l_1 = 0;
int top = 0;
- tint_array_wrapper stack = {};
+ tint_array<int, 10> stack = {};
int param_5 = 0;
l_1 = 0;
int const x_1007 = param_5;
param_5 = 0;
param_5 = x_1007;
h_1 = 9;
- tint_array_wrapper const x_1008 = stack;
- tint_array_wrapper const tint_symbol_18 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const x_1008 = stack;
+ tint_array<int, 10> const tint_symbol_18 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_18;
stack = x_1008;
float2 const x_556 = float2(float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[1]);
@@ -406,21 +415,21 @@
param_4 = x_1015;
int const x_95 = l_1;
QuicksortObject const x_1016 = *(tint_symbol_83);
- tint_array_wrapper const tint_symbol_19 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_19 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_20 = {.numbers=tint_symbol_19};
*(tint_symbol_83) = tint_symbol_20;
*(tint_symbol_83) = x_1016;
float3 const x_560 = float3(x_559[1], x_559[0], x_557[0]);
int const x_96_save = x_94;
- tint_array_wrapper const x_1017 = stack;
- tint_array_wrapper const tint_symbol_21 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const x_1017 = stack;
+ tint_array<int, 10> const tint_symbol_21 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_21;
stack = x_1017;
float3 const x_561 = float3(x_556[1], x_556[1], x_556[1]);
int const x_1018 = l_1;
l_1 = 0;
l_1 = 0;
- stack.arr[x_96_save] = x_95;
+ stack[x_96_save] = x_95;
int const x_1019 = param_5;
param_5 = 0;
param_5 = x_1019;
@@ -429,13 +438,13 @@
param_4 = 0;
param_4 = x_1020;
float3 const x_562 = float3(float3(1.0f, 2.0f, 3.0f)[2], x_558[1], float3(1.0f, 2.0f, 3.0f)[1]);
- int const x_1021 = stack.arr[x_96_save];
- stack.arr[x_96_save] = 0;
- stack.arr[x_96_save] = x_1021;
+ int const x_1021 = stack[x_96_save];
+ stack[x_96_save] = 0;
+ stack[x_96_save] = x_1021;
int const x_98 = as_type<int>((as_type<uint>(x_97) + as_type<uint>(1)));
- int const x_1022 = stack.arr[x_96_save];
- stack.arr[x_96_save] = 0;
- stack.arr[x_96_save] = x_1022;
+ int const x_1022 = stack[x_96_save];
+ stack[x_96_save] = 0;
+ stack[x_96_save] = x_1022;
float3 const x_563 = float3(x_559[0], x_559[2], x_556[1]);
top = x_98;
int const x_1023 = param_4;
@@ -457,19 +466,19 @@
int const x_1027 = p;
p = 0;
p = x_1027;
- stack.arr[x_100_save] = x_99;
+ stack[x_100_save] = x_99;
while (true) {
float3 const x_566 = float3(x_563[0], x_563[0], x_563[0]);
int const x_1028 = h_1;
h_1 = 0;
h_1 = x_1028;
- tint_array_wrapper const x_1029 = stack;
- tint_array_wrapper const tint_symbol_22 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const x_1029 = stack;
+ tint_array<int, 10> const tint_symbol_22 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_22;
stack = x_1029;
int const x_106 = top;
- tint_array_wrapper const x_1030 = stack;
- tint_array_wrapper const tint_symbol_23 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const x_1030 = stack;
+ tint_array<int, 10> const tint_symbol_23 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_23;
stack = x_1030;
float2 const x_567 = float2(x_558[0], x_564[2]);
@@ -481,7 +490,7 @@
break;
}
QuicksortObject const x_1032 = *(tint_symbol_83);
- tint_array_wrapper const tint_symbol_24 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_24 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_25 = {.numbers=tint_symbol_24};
*(tint_symbol_83) = tint_symbol_25;
*(tint_symbol_83) = x_1032;
@@ -503,12 +512,12 @@
p = 0;
p = x_1036;
int const x_110_save = x_108;
- int const x_1037 = stack.arr[x_96_save];
- stack.arr[x_96_save] = 0;
- stack.arr[x_96_save] = x_1037;
- int const x_111 = stack.arr[x_110_save];
- tint_array_wrapper const x_1038 = stack;
- tint_array_wrapper const tint_symbol_26 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ int const x_1037 = stack[x_96_save];
+ stack[x_96_save] = 0;
+ stack[x_96_save] = x_1037;
+ int const x_111 = stack[x_110_save];
+ tint_array<int, 10> const x_1038 = stack;
+ tint_array<int, 10> const tint_symbol_26 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_26;
stack = x_1038;
float3 const x_571 = float3(x_559[1], x_559[0], x_564[1]);
@@ -516,8 +525,8 @@
l_1 = 0;
l_1 = x_1039;
h_1 = x_111;
- tint_array_wrapper const x_1040 = stack;
- tint_array_wrapper const tint_symbol_27 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const x_1040 = stack;
+ tint_array<int, 10> const tint_symbol_27 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_27;
stack = x_1040;
float2 const x_572 = float2(x_562[1], x_561[1]);
@@ -528,9 +537,9 @@
int const x_1042 = param_4;
param_4 = 0;
param_4 = x_1042;
- int const x_1043 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1043;
+ int const x_1043 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1043;
float2 const x_573 = float2(float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[2]);
top = as_type<int>((as_type<uint>(x_112) - as_type<uint>(1)));
int const x_1044 = param_5;
@@ -542,10 +551,10 @@
h_1 = x_1045;
int const x_114_save = x_112;
float2 const x_575 = float2(x_564[1], x_564[2]);
- int const x_1046 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1046;
- int const x_115 = stack.arr[x_114_save];
+ int const x_1046 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1046;
+ int const x_115 = stack[x_114_save];
int const x_1047 = p;
p = 0;
p = x_1047;
@@ -559,16 +568,16 @@
top = x_1049;
int const x_118 = l_1;
param_4 = x_118;
- int const x_1050 = stack.arr[x_110_save];
- stack.arr[x_110_save] = 0;
- stack.arr[x_110_save] = x_1050;
+ int const x_1050 = stack[x_110_save];
+ stack[x_110_save] = 0;
+ stack[x_110_save] = x_1050;
float2 const x_577 = float2(x_569[1], x_569[2]);
int const x_120 = h_1;
float2 const x_578 = float2(x_558[0], float3(1.0f, 2.0f, 3.0f)[1]);
param_5 = x_120;
- int const x_1051 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1051;
+ int const x_1051 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1051;
int const x_121 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_83);
float2 const x_579 = float2(x_567[0], x_568[0]);
int const x_1052 = param_5;
@@ -590,140 +599,140 @@
h_1 = 0;
h_1 = x_1056;
int const x_124 = l_1;
- int const x_1057 = stack.arr[x_110_save];
- stack.arr[x_110_save] = 0;
- stack.arr[x_110_save] = x_1057;
+ int const x_1057 = stack[x_110_save];
+ stack[x_110_save] = 0;
+ stack[x_110_save] = x_1057;
int const x_1058 = h_1;
h_1 = 0;
h_1 = x_1058;
float2 const x_582 = float2(x_567[1], x_573[0]);
- int const x_1059 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1059;
+ int const x_1059 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1059;
if ((as_type<int>((as_type<uint>(x_122) - as_type<uint>(as_type<int>(1u)))) > x_124)) {
int const x_1060 = param_4;
param_4 = 0;
param_4 = x_1060;
int const x_128 = top;
float2 const x_583 = float2(x_571[1], x_556[1]);
- int const x_1061 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1061;
- tint_array_wrapper const x_1062 = stack;
- tint_array_wrapper const tint_symbol_28 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ int const x_1061 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1061;
+ tint_array<int, 10> const x_1062 = stack;
+ tint_array<int, 10> const tint_symbol_28 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_28;
stack = x_1062;
float2 const x_584 = float2(x_569[2], x_569[1]);
float3 const x_585 = float3(x_580[1], x_577[0], x_577[0]);
int const x_130 = l_1;
- int const x_1063 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1063;
+ int const x_1063 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1063;
float2 const x_586 = float2(x_564[0], x_585[0]);
int const x_1064 = param_5;
param_5 = 0;
param_5 = x_1064;
int const x_131_save = as_type<int>((as_type<uint>(1) + as_type<uint>(x_128)));
- int const x_1065 = stack.arr[x_110_save];
- stack.arr[x_110_save] = 0;
- stack.arr[x_110_save] = x_1065;
+ int const x_1065 = stack[x_110_save];
+ stack[x_110_save] = 0;
+ stack[x_110_save] = x_1065;
float3 const x_587 = float3(x_566[1], x_566[1], x_563[0]);
int const x_1066 = param_5;
param_5 = 0;
param_5 = x_1066;
- stack.arr[x_131_save] = x_130;
+ stack[x_131_save] = x_130;
int const x_132 = top;
- int const x_1067 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1067;
+ int const x_1067 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1067;
float2 const x_588 = float2(x_575[1], x_575[0]);
- int const x_1068 = stack.arr[x_131_save];
- stack.arr[x_131_save] = 0;
- stack.arr[x_131_save] = x_1068;
+ int const x_1068 = stack[x_131_save];
+ stack[x_131_save] = 0;
+ stack[x_131_save] = x_1068;
int const x_133 = as_type<int>((1u + as_type<uint>(x_132)));
- int const x_1069 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1069;
+ int const x_1069 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1069;
float3 const x_589 = float3(x_576[2], x_588[1], x_576[2]);
int const x_1070 = h_1;
h_1 = 0;
h_1 = x_1070;
top = x_133;
- tint_array_wrapper const x_1071 = stack;
- tint_array_wrapper const tint_symbol_29 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const x_1071 = stack;
+ tint_array<int, 10> const tint_symbol_29 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_29;
stack = x_1071;
int const x_134 = p;
float2 const x_590 = float2(x_576[0], x_573[1]);
- int const x_1072 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1072;
+ int const x_1072 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1072;
int const x_136_save = x_133;
- int const x_1073 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1073;
- stack.arr[x_136_save] = as_type<int>((as_type<uint>(x_134) - as_type<uint>(as_type<int>(1u))));
- int const x_1074 = stack.arr[x_96_save];
- stack.arr[x_96_save] = 0;
- stack.arr[x_96_save] = x_1074;
+ int const x_1073 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1073;
+ stack[x_136_save] = as_type<int>((as_type<uint>(x_134) - as_type<uint>(as_type<int>(1u))));
+ int const x_1074 = stack[x_96_save];
+ stack[x_96_save] = 0;
+ stack[x_96_save] = x_1074;
float2 const x_591 = float2(x_569[2], x_569[1]);
- int const x_1075 = stack.arr[x_136_save];
- stack.arr[x_136_save] = 0;
- stack.arr[x_136_save] = x_1075;
+ int const x_1075 = stack[x_136_save];
+ stack[x_136_save] = 0;
+ stack[x_136_save] = x_1075;
}
- int const x_1076 = stack.arr[x_96_save];
- stack.arr[x_96_save] = 0;
- stack.arr[x_96_save] = x_1076;
+ int const x_1076 = stack[x_96_save];
+ stack[x_96_save] = 0;
+ stack[x_96_save] = x_1076;
float2 const x_592 = float2(float3(1.0f, 2.0f, 3.0f)[0], float3(1.0f, 2.0f, 3.0f)[1]);
QuicksortObject const x_1077 = *(tint_symbol_83);
- tint_array_wrapper const tint_symbol_30 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_30 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_31 = {.numbers=tint_symbol_30};
*(tint_symbol_83) = tint_symbol_31;
*(tint_symbol_83) = x_1077;
int const x_137 = p;
- int const x_1078 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1078;
+ int const x_1078 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1078;
float3 const x_593 = float3(x_571[2], x_556[0], x_556[1]);
int const x_1079 = p;
p = 0;
p = x_1079;
float3 const x_594 = float3(x_563[2], x_563[0], x_575[0]);
- int const x_1080 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1080;
+ int const x_1080 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1080;
int const x_139 = h_1;
int const x_1081 = top;
top = 0;
top = x_1081;
float3 const x_595 = float3(x_560[2], x_568[0], x_560[0]);
- int const x_1082 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1082;
+ int const x_1082 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1082;
int const x_1083 = p;
p = 0;
p = x_1083;
if ((as_type<int>((1u + as_type<uint>(x_137))) < x_139)) {
- int const x_1084 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1084;
+ int const x_1084 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1084;
float2 const x_596 = float2(x_592[1], x_582[0]);
int const x_1085 = l_1;
l_1 = 0;
l_1 = x_1085;
int const x_143 = top;
- int const x_1086 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1086;
+ int const x_1086 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1086;
float3 const x_597 = float3(x_562[1], x_560[1], x_560[1]);
int const x_144 = as_type<int>((as_type<uint>(x_143) + as_type<uint>(1)));
int const x_1087 = param_5;
param_5 = 0;
param_5 = x_1087;
top = x_144;
- int const x_1088 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1088;
+ int const x_1088 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1088;
int const x_145 = p;
int const x_1089 = param_5;
param_5 = 0;
@@ -733,62 +742,62 @@
p = 0;
p = x_1090;
float3 const x_600 = float3(x_556[0], x_580[0], x_580[0]);
- int const x_1091 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1091;
+ int const x_1091 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1091;
int const x_147_save = x_144;
- int const x_1092 = stack.arr[x_110_save];
- stack.arr[x_110_save] = 0;
- stack.arr[x_110_save] = x_1092;
+ int const x_1092 = stack[x_110_save];
+ stack[x_110_save] = 0;
+ stack[x_110_save] = x_1092;
float2 const x_601 = float2(x_563[0], x_563[1]);
- stack.arr[x_147_save] = as_type<int>((1u + as_type<uint>(x_145)));
- tint_array_wrapper const x_1093 = stack;
- tint_array_wrapper const tint_symbol_32 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ stack[x_147_save] = as_type<int>((1u + as_type<uint>(x_145)));
+ tint_array<int, 10> const x_1093 = stack;
+ tint_array<int, 10> const tint_symbol_32 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_32;
stack = x_1093;
int const x_148 = top;
- int const x_1094 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1094;
+ int const x_1094 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1094;
float2 const x_602 = float2(x_565[1], x_599[1]);
- tint_array_wrapper const x_1095 = stack;
- tint_array_wrapper const tint_symbol_33 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const x_1095 = stack;
+ tint_array<int, 10> const tint_symbol_33 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
stack = tint_symbol_33;
stack = x_1095;
int const x_149 = as_type<int>((as_type<uint>(x_148) + as_type<uint>(as_type<int>(1u))));
- int const x_1096 = stack.arr[x_147_save];
- stack.arr[x_147_save] = 0;
- stack.arr[x_147_save] = x_1096;
+ int const x_1096 = stack[x_147_save];
+ stack[x_147_save] = 0;
+ stack[x_147_save] = x_1096;
top = x_149;
int const x_1097 = param_4;
param_4 = 0;
param_4 = x_1097;
int const x_150 = h_1;
- int const x_1098 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1098;
- int const x_1099 = stack.arr[x_96_save];
- stack.arr[x_96_save] = 0;
- stack.arr[x_96_save] = x_1099;
- stack.arr[x_149] = x_150;
- int const x_1100 = stack.arr[x_114_save];
- stack.arr[x_114_save] = 0;
- stack.arr[x_114_save] = x_1100;
+ int const x_1098 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1098;
+ int const x_1099 = stack[x_96_save];
+ stack[x_96_save] = 0;
+ stack[x_96_save] = x_1099;
+ stack[x_149] = x_150;
+ int const x_1100 = stack[x_114_save];
+ stack[x_114_save] = 0;
+ stack[x_114_save] = x_1100;
float3 const x_603 = float3(x_568[1], x_564[0], x_564[0]);
int const x_1101 = l_1;
l_1 = 0;
l_1 = x_1101;
}
- int const x_1102 = stack.arr[x_100_save];
- stack.arr[x_100_save] = 0;
- stack.arr[x_100_save] = x_1102;
+ int const x_1102 = stack[x_100_save];
+ stack[x_100_save] = 0;
+ stack[x_100_save] = x_1102;
{
int const x_1103 = l_1;
l_1 = 0;
l_1 = x_1103;
float2 const x_604 = float2(x_563[2], x_564[0]);
QuicksortObject const x_1104 = *(tint_symbol_83);
- tint_array_wrapper const tint_symbol_34 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_34 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_35 = {.numbers=tint_symbol_34};
*(tint_symbol_83) = tint_symbol_35;
*(tint_symbol_83) = x_1104;
@@ -809,13 +818,13 @@
uv = x_717;
i_2 = 0;
QuicksortObject const x_721 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_36 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_36 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_37 = {.numbers=tint_symbol_36};
*(tint_symbol_84) = tint_symbol_37;
*(tint_symbol_84) = x_721;
if (true) {
QuicksortObject const x_722 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_38 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_38 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_39 = {.numbers=tint_symbol_38};
*(tint_symbol_84) = tint_symbol_39;
*(tint_symbol_84) = x_722;
@@ -829,13 +838,13 @@
color = x_725;
float2 const x_432 = float2(x_431[1], x_431[1]);
QuicksortObject const x_726 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_40 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_40 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_41 = {.numbers=tint_symbol_40};
*(tint_symbol_84) = tint_symbol_41;
*(tint_symbol_84) = x_726;
}
QuicksortObject const x_756 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_42 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_42 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_43 = {.numbers=tint_symbol_42};
*(tint_symbol_84) = tint_symbol_43;
*(tint_symbol_84) = x_756;
@@ -845,7 +854,7 @@
i_2 = x_757;
quicksort_(tint_symbol_84);
QuicksortObject const x_758 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_44 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_44 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_45 = {.numbers=tint_symbol_44};
*(tint_symbol_84) = tint_symbol_45;
*(tint_symbol_84) = x_758;
@@ -860,7 +869,7 @@
float2 const x_185 = float2(x_184[0], x_184[1]);
float3 const x_448 = float3(x_185[1], x_446[1], x_446[1]);
QuicksortObject const x_761 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_46 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_46 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_47 = {.numbers=tint_symbol_46};
*(tint_symbol_84) = tint_symbol_47;
*(tint_symbol_84) = x_761;
@@ -869,7 +878,7 @@
uv = x_762;
float2 const x_191 = (*(tint_symbol_86)).resolution;
QuicksortObject const x_763 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_48 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_48 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_49 = {.numbers=tint_symbol_48};
*(tint_symbol_84) = tint_symbol_49;
*(tint_symbol_84) = x_763;
@@ -879,7 +888,7 @@
color = x_764;
float2 const x_192 = (x_185 / x_191);
QuicksortObject const x_765 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_50 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_50 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_51 = {.numbers=tint_symbol_50};
*(tint_symbol_84) = tint_symbol_51;
*(tint_symbol_84) = x_765;
@@ -897,22 +906,22 @@
color = x_768;
float3 const x_451 = float3(x_185[0], x_185[1], x_446[1]);
QuicksortObject const x_769 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_52 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_52 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_53 = {.numbers=tint_symbol_52};
*(tint_symbol_84) = tint_symbol_53;
*(tint_symbol_84) = x_769;
- int const x_770 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_770;
- int const x_201 = (*(tint_symbol_84)).numbers.arr[0u];
+ int const x_770 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_770;
+ int const x_201 = (*(tint_symbol_84)).numbers[0u];
QuicksortObject const x_771 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_54 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_54 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_55 = {.numbers=tint_symbol_54};
*(tint_symbol_84) = tint_symbol_55;
*(tint_symbol_84) = x_771;
- int const x_772 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_772;
+ int const x_772 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_772;
float const x_206 = color[0];
float const x_773 = color[0];
color[0] = 0.0f;
@@ -922,7 +931,7 @@
i_2 = 0;
i_2 = x_774;
QuicksortObject const x_775 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_56 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_56 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_57 = {.numbers=tint_symbol_56};
*(tint_symbol_84) = tint_symbol_57;
*(tint_symbol_84) = x_775;
@@ -941,7 +950,7 @@
uv[0] = 0.0f;
uv[0] = x_778;
QuicksortObject const x_779 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_58 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_58 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_59 = {.numbers=tint_symbol_58};
*(tint_symbol_84) = tint_symbol_59;
*(tint_symbol_84) = x_779;
@@ -949,16 +958,16 @@
int const x_780 = i_2;
i_2 = 0;
i_2 = x_780;
- int const x_781 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_781;
+ int const x_781 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_781;
float3 const x_456 = float3(float2(0.0f)[1], x_448[1], x_448[1]);
float const x_782 = uv[0];
uv[0] = 0.0f;
uv[0] = x_782;
- int const x_216 = (*(tint_symbol_84)).numbers.arr[1];
+ int const x_216 = (*(tint_symbol_84)).numbers[1];
QuicksortObject const x_783 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_60 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_60 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_61 = {.numbers=tint_symbol_60};
*(tint_symbol_84) = tint_symbol_61;
*(tint_symbol_84) = x_783;
@@ -967,7 +976,7 @@
uv = float2(0.0f);
uv = x_784;
QuicksortObject const x_785 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_62 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_62 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_63 = {.numbers=tint_symbol_62};
*(tint_symbol_84) = tint_symbol_63;
*(tint_symbol_84) = x_785;
@@ -990,9 +999,9 @@
color[0] = 0.0f;
color[0] = x_790;
color[0] = (float(x_216) + x_219);
- int const x_791 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_791;
+ int const x_791 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_791;
}
float const x_792 = uv[0];
uv[0] = 0.0f;
@@ -1030,24 +1039,24 @@
float const x_801 = color[0];
color[0] = 0.0f;
color[0] = x_801;
- int const x_230 = (*(tint_symbol_84)).numbers.arr[2u];
+ int const x_230 = (*(tint_symbol_84)).numbers[2u];
float const x_802 = uv[0];
uv[0] = 0.0f;
uv[0] = x_802;
float const x_803 = color[0];
color[0] = 0.0f;
color[0] = x_803;
- int const x_804 = (*(tint_symbol_84)).numbers.arr[2u];
- (*(tint_symbol_84)).numbers.arr[2u] = 0;
- (*(tint_symbol_84)).numbers.arr[2u] = x_804;
+ int const x_804 = (*(tint_symbol_84)).numbers[2u];
+ (*(tint_symbol_84)).numbers[2u] = 0;
+ (*(tint_symbol_84)).numbers[2u] = x_804;
float2 const x_464 = float2(x_450[1], x_191[0]);
float const x_805 = color[1];
color[1] = 0.0f;
color[1] = x_805;
float const x_234 = color[1];
- int const x_806 = (*(tint_symbol_84)).numbers.arr[2u];
- (*(tint_symbol_84)).numbers.arr[2u] = 0;
- (*(tint_symbol_84)).numbers.arr[2u] = x_806;
+ int const x_806 = (*(tint_symbol_84)).numbers[2u];
+ (*(tint_symbol_84)).numbers[2u] = 0;
+ (*(tint_symbol_84)).numbers[2u] = x_806;
float2 const x_465 = float2(x_463[0], x_185[0]);
float const x_807 = color[0];
color[0] = 0.0f;
@@ -1082,12 +1091,12 @@
float const x_815 = color[0];
color[0] = 0.0f;
color[0] = x_815;
- int const x_245 = (*(tint_symbol_84)).numbers.arr[3];
+ int const x_245 = (*(tint_symbol_84)).numbers[3];
float const x_816 = color[0];
color[0] = 0.0f;
color[0] = x_816;
QuicksortObject const x_817 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_64 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_64 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_65 = {.numbers=tint_symbol_64};
*(tint_symbol_84) = tint_symbol_65;
*(tint_symbol_84) = x_817;
@@ -1106,9 +1115,9 @@
float const x_821 = color[2];
color[2] = 0.0f;
color[2] = x_821;
- int const x_822 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_822;
+ int const x_822 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_822;
float2 const x_470 = float2(float2(0.0f)[0], float2(0.0f)[1]);
float const x_823 = color[2];
color[2] = 0.0f;
@@ -1123,7 +1132,7 @@
uv[0] = 0.0f;
uv[0] = x_825;
float3 const x_472 = float3(x_454[0], x_454[1], x_454[1]);
- int const x_254 = (*(tint_symbol_84)).numbers.arr[4];
+ int const x_254 = (*(tint_symbol_84)).numbers[4];
float const x_826 = uv[0];
uv[0] = 0.0f;
uv[0] = x_826;
@@ -1131,9 +1140,9 @@
color = float3(0.0f);
color = x_827;
float3 const x_473 = float3(x_446[1], x_453[0], x_453[0]);
- int const x_828 = (*(tint_symbol_84)).numbers.arr[4];
- (*(tint_symbol_84)).numbers.arr[4] = 0;
- (*(tint_symbol_84)).numbers.arr[4] = x_828;
+ int const x_828 = (*(tint_symbol_84)).numbers[4];
+ (*(tint_symbol_84)).numbers[4] = 0;
+ (*(tint_symbol_84)).numbers[4] = x_828;
float2 const x_474 = float2(x_191[0], x_184[2]);
float const x_829 = uv[0];
uv[0] = 0.0f;
@@ -1167,9 +1176,9 @@
i_2 = 0;
i_2 = x_836;
float3 const x_479 = float3(float2(0.0f)[1], x_454[1], float2(0.0f)[0]);
- int const x_837 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_837;
+ int const x_837 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_837;
float const x_838 = color[1];
color[1] = 0.0f;
color[1] = x_838;
@@ -1182,7 +1191,7 @@
float3 const x_840 = color;
color = float3(0.0f);
color = x_840;
- int const x_267 = (*(tint_symbol_84)).numbers.arr[5u];
+ int const x_267 = (*(tint_symbol_84)).numbers[5u];
float const x_841 = color[0];
color[0] = 0.0f;
color[0] = x_841;
@@ -1198,7 +1207,7 @@
uv[0] = x_844;
float3 const x_482 = float3(x_455[0], x_475[1], x_455[1]);
QuicksortObject const x_845 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_66 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_66 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_67 = {.numbers=tint_symbol_66};
*(tint_symbol_84) = tint_symbol_67;
*(tint_symbol_84) = x_845;
@@ -1225,13 +1234,13 @@
float const x_851 = uv[1];
uv[1] = 0.0f;
uv[1] = x_851;
- int const x_852 = (*(tint_symbol_84)).numbers.arr[4];
- (*(tint_symbol_84)).numbers.arr[4] = 0;
- (*(tint_symbol_84)).numbers.arr[4] = x_852;
+ int const x_852 = (*(tint_symbol_84)).numbers[4];
+ (*(tint_symbol_84)).numbers[4] = 0;
+ (*(tint_symbol_84)).numbers[4] = x_852;
float const x_274 = uv[1];
- int const x_853 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_853;
+ int const x_853 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_853;
if ((x_274 > 0.5f)) {
float const x_854 = uv[0];
uv[0] = 0.0f;
@@ -1244,16 +1253,16 @@
float const x_856 = uv[1];
uv[1] = 0.0f;
uv[1] = x_856;
- int const x_280 = (*(tint_symbol_84)).numbers.arr[6u];
+ int const x_280 = (*(tint_symbol_84)).numbers[6u];
float const x_857 = uv[1];
uv[1] = 0.0f;
uv[1] = x_857;
int const x_858 = i_2;
i_2 = 0;
i_2 = x_858;
- int const x_859 = (*(tint_symbol_84)).numbers.arr[4];
- (*(tint_symbol_84)).numbers.arr[4] = 0;
- (*(tint_symbol_84)).numbers.arr[4] = x_859;
+ int const x_859 = (*(tint_symbol_84)).numbers[4];
+ (*(tint_symbol_84)).numbers[4] = 0;
+ (*(tint_symbol_84)).numbers[4] = x_859;
float2 const x_488 = float2(x_473[2], x_473[1]);
float const x_283 = color[1];
float2 const x_860 = uv;
@@ -1263,15 +1272,15 @@
color[0] = 0.0f;
color[0] = x_861;
float2 const x_489 = float2(x_475[1], x_475[0]);
- int const x_862 = (*(tint_symbol_84)).numbers.arr[6u];
- (*(tint_symbol_84)).numbers.arr[6u] = 0;
- (*(tint_symbol_84)).numbers.arr[6u] = x_862;
- int const x_863 = (*(tint_symbol_84)).numbers.arr[6u];
- (*(tint_symbol_84)).numbers.arr[6u] = 0;
- (*(tint_symbol_84)).numbers.arr[6u] = x_863;
+ int const x_862 = (*(tint_symbol_84)).numbers[6u];
+ (*(tint_symbol_84)).numbers[6u] = 0;
+ (*(tint_symbol_84)).numbers[6u] = x_862;
+ int const x_863 = (*(tint_symbol_84)).numbers[6u];
+ (*(tint_symbol_84)).numbers[6u] = 0;
+ (*(tint_symbol_84)).numbers[6u] = x_863;
float2 const x_490 = float2(x_480[2], x_480[2]);
QuicksortObject const x_864 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_68 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_68 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_69 = {.numbers=tint_symbol_68};
*(tint_symbol_84) = tint_symbol_69;
*(tint_symbol_84) = x_864;
@@ -1290,7 +1299,7 @@
color[0] = x_867;
float const x_287 = uv[1];
QuicksortObject const x_868 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_70 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_70 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_71 = {.numbers=tint_symbol_70};
*(tint_symbol_84) = tint_symbol_71;
*(tint_symbol_84) = x_868;
@@ -1302,9 +1311,9 @@
color[1] = 0.0f;
color[1] = x_870;
float3 const x_494 = float3(x_191[0], x_191[1], x_191[1]);
- int const x_871 = (*(tint_symbol_84)).numbers.arr[4];
- (*(tint_symbol_84)).numbers.arr[4] = 0;
- (*(tint_symbol_84)).numbers.arr[4] = x_871;
+ int const x_871 = (*(tint_symbol_84)).numbers[4];
+ (*(tint_symbol_84)).numbers[4] = 0;
+ (*(tint_symbol_84)).numbers[4] = x_871;
if ((x_287 > 0.75f)) {
float3 const x_872 = color;
color = float3(0.0f);
@@ -1316,7 +1325,7 @@
float3 const x_874 = color;
color = float3(0.0f);
color = x_874;
- int const x_293 = (*(tint_symbol_84)).numbers.arr[7];
+ int const x_293 = (*(tint_symbol_84)).numbers[7];
float const x_875 = uv[0];
uv[0] = 0.0f;
uv[0] = x_875;
@@ -1325,9 +1334,9 @@
color[1] = 0.0f;
color[1] = x_876;
float2 const x_497 = float2(x_477[0], x_461[1]);
- int const x_877 = (*(tint_symbol_84)).numbers.arr[0u];
- (*(tint_symbol_84)).numbers.arr[0u] = 0;
- (*(tint_symbol_84)).numbers.arr[0u] = x_877;
+ int const x_877 = (*(tint_symbol_84)).numbers[0u];
+ (*(tint_symbol_84)).numbers[0u] = 0;
+ (*(tint_symbol_84)).numbers[0u] = x_877;
float const x_878 = color[1];
color[1] = 0.0f;
color[1] = x_878;
@@ -1369,14 +1378,14 @@
float2 const x_888 = uv;
uv = float2(0.0f);
uv = x_888;
- int const x_301 = (*(tint_symbol_84)).numbers.arr[8];
+ int const x_301 = (*(tint_symbol_84)).numbers[8];
int const x_889 = i_2;
i_2 = 0;
i_2 = x_889;
float2 const x_503 = float2(x_185[0], x_451[2]);
- int const x_890 = (*(tint_symbol_84)).numbers.arr[8];
- (*(tint_symbol_84)).numbers.arr[8] = 0;
- (*(tint_symbol_84)).numbers.arr[8] = x_890;
+ int const x_890 = (*(tint_symbol_84)).numbers[8];
+ (*(tint_symbol_84)).numbers[8] = 0;
+ (*(tint_symbol_84)).numbers[8] = x_890;
float const x_891 = color[1];
color[1] = 0.0f;
color[1] = x_891;
@@ -1393,9 +1402,9 @@
color[0] = 0.0f;
color[0] = x_894;
float2 const x_506 = float2(x_493[0], x_492[0]);
- int const x_895 = (*(tint_symbol_84)).numbers.arr[4];
- (*(tint_symbol_84)).numbers.arr[4] = 0;
- (*(tint_symbol_84)).numbers.arr[4] = x_895;
+ int const x_895 = (*(tint_symbol_84)).numbers[4];
+ (*(tint_symbol_84)).numbers[4] = 0;
+ (*(tint_symbol_84)).numbers[4] = x_895;
float const x_896 = uv[1];
uv[1] = 0.0f;
uv[1] = x_896;
@@ -1444,23 +1453,23 @@
uv[1] = 0.0f;
uv[1] = x_908;
float3 const x_512 = float3(x_455[1], x_455[1], x_455[1]);
- int const x_909 = (*(tint_symbol_84)).numbers.arr[4];
- (*(tint_symbol_84)).numbers.arr[4] = 0;
- (*(tint_symbol_84)).numbers.arr[4] = x_909;
+ int const x_909 = (*(tint_symbol_84)).numbers[4];
+ (*(tint_symbol_84)).numbers[4] = 0;
+ (*(tint_symbol_84)).numbers[4] = x_909;
if ((fabs((x_308 - x_310)) < 0.25f)) {
float const x_910 = uv[0];
uv[0] = 0.0f;
uv[0] = x_910;
QuicksortObject const x_911 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_72 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_72 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_73 = {.numbers=tint_symbol_72};
*(tint_symbol_84) = tint_symbol_73;
*(tint_symbol_84) = x_911;
float3 const x_513 = float3(x_505[2], x_505[0], x_448[0]);
- int const x_912 = (*(tint_symbol_84)).numbers.arr[8];
- (*(tint_symbol_84)).numbers.arr[8] = 0;
- (*(tint_symbol_84)).numbers.arr[8] = x_912;
- int const x_317 = (*(tint_symbol_84)).numbers.arr[9u];
+ int const x_912 = (*(tint_symbol_84)).numbers[8];
+ (*(tint_symbol_84)).numbers[8] = 0;
+ (*(tint_symbol_84)).numbers[8] = x_912;
+ int const x_317 = (*(tint_symbol_84)).numbers[9u];
float3 const x_514 = float3(x_474[1], x_474[1], x_474[1]);
float const x_913 = uv[1];
uv[1] = 0.0f;
@@ -1506,12 +1515,12 @@
uv[0] = 0.0f;
uv[0] = x_923;
QuicksortObject const x_924 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_74 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_74 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_75 = {.numbers=tint_symbol_74};
*(tint_symbol_84) = tint_symbol_75;
*(tint_symbol_84) = x_924;
QuicksortObject const x_925 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_76 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_76 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_77 = {.numbers=tint_symbol_76};
*(tint_symbol_84) = tint_symbol_77;
*(tint_symbol_84) = x_925;
@@ -1532,7 +1541,7 @@
uv[0] = x_929;
*(tint_symbol_87) = x_330;
QuicksortObject const x_930 = *(tint_symbol_84);
- tint_array_wrapper const tint_symbol_78 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ tint_array<int, 10> const tint_symbol_78 = tint_array<int, 10>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QuicksortObject const tint_symbol_79 = {.numbers=tint_symbol_78};
*(tint_symbol_84) = tint_symbol_79;
*(tint_symbol_84) = x_930;
diff --git a/test/tint/bug/tint/757.wgsl.expected.msl b/test/tint/bug/tint/757.wgsl.expected.msl
index 35bf540..b0644d0 100644
--- a/test/tint/bug/tint/757.wgsl.expected.msl
+++ b/test/tint/bug/tint/757.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Constants {
int level;
};
struct Result {
- /* 0x0000 */ float values[1];
+ /* 0x0000 */ tint_array<float, 1> values;
};
void tint_symbol_inner(uint3 GlobalInvocationID, texture2d_array<float, access::sample> tint_symbol_1, device Result* const tint_symbol_2) {
diff --git a/test/tint/bug/tint/782.wgsl.expected.msl b/test/tint/bug/tint/782.wgsl.expected.msl
index a568ecb..0d4e877 100644
--- a/test/tint/bug/tint/782.wgsl.expected.msl
+++ b/test/tint/bug/tint/782.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[2];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void foo() {
- tint_array_wrapper tint_symbol = {};
- tint_array_wrapper implict = {};
+ tint_array<int, 2> tint_symbol = {};
+ tint_array<int, 2> implict = {};
implict = tint_symbol;
}
diff --git a/test/tint/bug/tint/824.wgsl.expected.msl b/test/tint/bug/tint/824.wgsl.expected.msl
index c9a884c..4427773 100644
--- a/test/tint/bug/tint/824.wgsl.expected.msl
+++ b/test/tint/bug/tint/824.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Output {
float4 Position;
float4 color;
@@ -11,21 +24,13 @@
float4 Position [[position]];
};
-struct tint_array_wrapper {
- float2 arr[4];
-};
-
-struct tint_array_wrapper_1 {
- float4 arr[4];
-};
-
Output tint_symbol_inner(uint VertexIndex, uint InstanceIndex) {
- tint_array_wrapper const zv = {.arr={float2(0.200000003f), float2(0.300000012f), float2(-0.100000001f), float2(1.100000024f)}};
- float const z = zv.arr[InstanceIndex][0];
+ tint_array<float2, 4> const zv = tint_array<float2, 4>{float2(0.200000003f), float2(0.300000012f), float2(-0.100000001f), float2(1.100000024f)};
+ float const z = zv[InstanceIndex][0];
Output output = {};
output.Position = float4(0.5f, 0.5f, z, 1.0f);
- tint_array_wrapper_1 const colors = {.arr={float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f)}};
- output.color = colors.arr[InstanceIndex];
+ tint_array<float4, 4> const colors = tint_array<float4, 4>{float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f)};
+ output.color = colors[InstanceIndex];
return output;
}
diff --git a/test/tint/bug/tint/827.wgsl.expected.msl b/test/tint/bug/tint/827.wgsl.expected.msl
index 532283a..4ea4405 100644
--- a/test/tint/bug/tint/827.wgsl.expected.msl
+++ b/test/tint/bug/tint/827.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Result {
- /* 0x0000 */ float values[1];
+ /* 0x0000 */ tint_array<float, 1> values;
};
constant uint width = 128u;
diff --git a/test/tint/bug/tint/870.spvasm.expected.msl b/test/tint/bug/tint/870.spvasm.expected.msl
index 05b9e33..9a97441 100644
--- a/test/tint/bug/tint/870.spvasm.expected.msl
+++ b/test/tint/bug/tint/870.spvasm.expected.msl
@@ -1,15 +1,24 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int arr[6];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct sspp962805860buildInformationS {
/* 0x0000 */ float4 footprint;
/* 0x0010 */ float4 offset;
/* 0x0020 */ int essence;
- /* 0x0024 */ tint_array_wrapper orientation;
+ /* 0x0024 */ tint_array<int, 6> orientation;
};
struct x_B4_BuildInformation {
@@ -17,14 +26,14 @@
};
void main_1(const device x_B4_BuildInformation* const tint_symbol_1) {
- tint_array_wrapper orientation = {};
- tint_array_wrapper const x_23 = (*(tint_symbol_1)).passthru.orientation;
- orientation.arr[0] = x_23.arr[0u];
- orientation.arr[1] = x_23.arr[1u];
- orientation.arr[2] = x_23.arr[2u];
- orientation.arr[3] = x_23.arr[3u];
- orientation.arr[4] = x_23.arr[4u];
- orientation.arr[5] = x_23.arr[5u];
+ tint_array<int, 6> orientation = {};
+ tint_array<int, 6> const x_23 = (*(tint_symbol_1)).passthru.orientation;
+ orientation[0] = x_23[0u];
+ orientation[1] = x_23[1u];
+ orientation[2] = x_23[2u];
+ orientation[3] = x_23[3u];
+ orientation[4] = x_23[4u];
+ orientation[5] = x_23[5u];
return;
}
diff --git a/test/tint/bug/tint/913.wgsl.expected.msl b/test/tint/bug/tint/913.wgsl.expected.msl
index e326a9b..3acacc7 100644
--- a/test/tint/bug/tint/913.wgsl.expected.msl
+++ b/test/tint/bug/tint/913.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint dstTextureFlipY;
/* 0x0004 */ uint channelCount;
@@ -10,7 +23,7 @@
};
struct OutputBuf {
- /* 0x0000 */ uint result[1];
+ /* 0x0000 */ tint_array<uint, 1> result;
};
bool aboutEqual(float value, float expect) {
diff --git a/test/tint/bug/tint/914.wgsl.expected.msl b/test/tint/bug/tint/914.wgsl.expected.msl
index c6aad93..b7a253c 100644
--- a/test/tint/bug/tint/914.wgsl.expected.msl
+++ b/test/tint/bug/tint/914.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint dimAOuter;
/* 0x0004 */ uint dimInner;
@@ -8,7 +21,7 @@
};
struct Matrix {
- /* 0x0000 */ float numbers[1];
+ /* 0x0000 */ tint_array<float, 1> numbers;
};
float mm_readA(uint row, uint col, const constant Uniforms* const tint_symbol_3, const device Matrix* const tint_symbol_4) {
@@ -44,28 +57,12 @@
constant uint TileInner = 64u;
-struct tint_array_wrapper_1 {
- float arr[64];
-};
-
-struct tint_array_wrapper {
- tint_array_wrapper_1 arr[64];
-};
-
-struct tint_array_wrapper_2 {
- float arr[16];
-};
-
-struct tint_array_wrapper_3 {
- float arr[4];
-};
-
-void tint_symbol_inner(uint3 local_id, uint3 global_id, uint local_invocation_index, threadgroup tint_array_wrapper* const tint_symbol_9, threadgroup tint_array_wrapper* const tint_symbol_10, const constant Uniforms* const tint_symbol_11, const device Matrix* const tint_symbol_12, const device Matrix* const tint_symbol_13, device Matrix* const tint_symbol_14) {
+void tint_symbol_inner(uint3 local_id, uint3 global_id, uint local_invocation_index, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_9, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_10, const constant Uniforms* const tint_symbol_11, const device Matrix* const tint_symbol_12, const device Matrix* const tint_symbol_13, device Matrix* const tint_symbol_14) {
for(uint idx = local_invocation_index; (idx < 4096u); idx = (idx + 256u)) {
uint const i = (idx / 64u);
uint const i_1 = (idx % 64u);
- (*(tint_symbol_9)).arr[i].arr[i_1] = 0.0f;
- (*(tint_symbol_10)).arr[i].arr[i_1] = 0.0f;
+ (*(tint_symbol_9))[i][i_1] = 0.0f;
+ (*(tint_symbol_10))[i][i_1] = 0.0f;
}
threadgroup_barrier(mem_flags::mem_threadgroup);
uint const tileRow = (local_id[1] * 4u);
@@ -73,11 +70,11 @@
uint const globalRow = (global_id[1] * 4u);
uint const globalCol = (global_id[0] * 4u);
uint const numTiles = ((((*(tint_symbol_11)).dimInner - 1u) / 64u) + 1u);
- tint_array_wrapper_2 acc = {};
+ tint_array<float, 16> acc = {};
float ACached = 0.0f;
- tint_array_wrapper_3 BCached = {};
+ tint_array<float, 4> BCached = {};
for(uint index = 0u; (index < (4u * 4u)); index = (index + 1u)) {
- acc.arr[index] = 0.0f;
+ acc[index] = 0.0f;
}
uint const ColPerThreadA = (64u / 16u);
uint const tileColA = (local_id[0] * ColPerThreadA);
@@ -89,7 +86,7 @@
uint const inputRow = (tileRow + innerRow);
uint const inputCol = (tileColA + innerCol);
float const tint_symbol_1 = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol), tint_symbol_11, tint_symbol_12);
- (*(tint_symbol_9)).arr[inputRow].arr[inputCol] = tint_symbol_1;
+ (*(tint_symbol_9))[inputRow][inputCol] = tint_symbol_1;
}
}
for(uint innerRow = 0u; (innerRow < RowPerThreadB); innerRow = (innerRow + 1u)) {
@@ -97,19 +94,19 @@
uint const inputRow = (tileRowB + innerRow);
uint const inputCol = (tileCol + innerCol);
float const tint_symbol_2 = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol), tint_symbol_11, tint_symbol_13);
- (*(tint_symbol_10)).arr[innerCol].arr[inputCol] = tint_symbol_2;
+ (*(tint_symbol_10))[innerCol][inputCol] = tint_symbol_2;
}
}
threadgroup_barrier(mem_flags::mem_threadgroup);
for(uint k = 0u; (k < 64u); k = (k + 1u)) {
for(uint inner = 0u; (inner < 4u); inner = (inner + 1u)) {
- BCached.arr[inner] = (*(tint_symbol_10)).arr[k].arr[(tileCol + inner)];
+ BCached[inner] = (*(tint_symbol_10))[k][(tileCol + inner)];
}
for(uint innerRow = 0u; (innerRow < 4u); innerRow = (innerRow + 1u)) {
- ACached = (*(tint_symbol_9)).arr[(tileRow + innerRow)].arr[k];
+ ACached = (*(tint_symbol_9))[(tileRow + innerRow)][k];
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
uint const index = ((innerRow * 4u) + innerCol);
- acc.arr[index] = (acc.arr[index] + (ACached * BCached.arr[innerCol]));
+ acc[index] = (acc[index] + (ACached * BCached[innerCol]));
}
}
}
@@ -118,14 +115,14 @@
for(uint innerRow = 0u; (innerRow < 4u); innerRow = (innerRow + 1u)) {
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
uint const index = ((innerRow * 4u) + innerCol);
- mm_write((globalRow + innerRow), (globalCol + innerCol), acc.arr[index], tint_symbol_11, tint_symbol_14);
+ mm_write((globalRow + innerRow), (globalCol + innerCol), acc[index], tint_symbol_11, tint_symbol_14);
}
}
}
kernel void tint_symbol(const constant Uniforms* tint_symbol_17 [[buffer(0)]], const device Matrix* tint_symbol_18 [[buffer(2)]], const device Matrix* tint_symbol_19 [[buffer(3)]], device Matrix* tint_symbol_20 [[buffer(1)]], uint3 local_id [[thread_position_in_threadgroup]], uint3 global_id [[thread_position_in_grid]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
- threadgroup tint_array_wrapper tint_symbol_15;
- threadgroup tint_array_wrapper tint_symbol_16;
+ threadgroup tint_array<tint_array<float, 64>, 64> tint_symbol_15;
+ threadgroup tint_array<tint_array<float, 64>, 64> tint_symbol_16;
tint_symbol_inner(local_id, global_id, local_invocation_index, &(tint_symbol_15), &(tint_symbol_16), tint_symbol_17, tint_symbol_18, tint_symbol_19, tint_symbol_20);
return;
}
diff --git a/test/tint/bug/tint/922.wgsl.expected.msl b/test/tint/bug/tint/922.wgsl.expected.msl
index 584f9e4..56d2fe7 100644
--- a/test/tint/bug/tint/922.wgsl.expected.msl
+++ b/test/tint/bug/tint/922.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Mat4x4_ {
/* 0x0000 */ float4 mx;
/* 0x0010 */ float4 my;
@@ -23,21 +36,13 @@
/* 0x0000 */ Mat4x4_ u_Projection;
};
-struct tint_array_wrapper {
- /* 0x0000 */ Mat4x2_ arr[1];
-};
-
struct ub_MaterialParams {
- /* 0x0000 */ tint_array_wrapper u_TexMtx;
+ /* 0x0000 */ tint_array<Mat4x2_, 1> u_TexMtx;
/* 0x0020 */ float4 u_Misc0_;
};
-struct tint_array_wrapper_1 {
- /* 0x0000 */ Mat4x3_ arr[32];
-};
-
struct ub_PacketParams {
- /* 0x0000 */ tint_array_wrapper_1 u_PosMtx;
+ /* 0x0000 */ tint_array<Mat4x3_, 32> u_PosMtx;
};
struct VertexOutput {
@@ -222,7 +227,7 @@
Mat4x3_ t_PosMtx = {};
float2 t_TexSpaceCoord = 0.0f;
float const x_e15 = *(tint_symbol_5);
- Mat4x3_ const x_e18 = (*(tint_symbol_6)).u_PosMtx.arr[int(x_e15)];
+ Mat4x3_ const x_e18 = (*(tint_symbol_6)).u_PosMtx[int(x_e15)];
t_PosMtx = x_e18;
Mat4x3_ const x_e23 = t_PosMtx;
Mat4x4_ const x_e24 = x_Mat4x4_1(x_e23);
@@ -247,7 +252,7 @@
if ((x_e52[0] == 2.0f)) {
{
float3 const x_e59 = *(tint_symbol_13);
- Mat4x2_ const x_e64 = (*(tint_symbol_12)).u_TexMtx.arr[0];
+ Mat4x2_ const x_e64 = (*(tint_symbol_12)).u_TexMtx[0];
float3 const x_e65 = *(tint_symbol_13);
float2 const x_e68 = Mul2(x_e64, float4(x_e65, 1.0f));
*(tint_symbol_14) = float2(x_e68).xy;
@@ -256,7 +261,7 @@
} else {
{
float2 const x_e73 = *(tint_symbol_15);
- Mat4x2_ const x_e79 = (*(tint_symbol_12)).u_TexMtx.arr[0];
+ Mat4x2_ const x_e79 = (*(tint_symbol_12)).u_TexMtx[0];
float2 const x_e80 = *(tint_symbol_15);
float2 const x_e84 = Mul2(x_e79, float4(x_e80, 1.0f, 1.0f));
*(tint_symbol_14) = float2(x_e84).xy;
diff --git a/test/tint/bug/tint/942.wgsl.expected.msl b/test/tint/bug/tint/942.wgsl.expected.msl
index 6693f72..cca7a67 100644
--- a/test/tint/bug/tint/942.wgsl.expected.msl
+++ b/test/tint/bug/tint/942.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Params {
/* 0x0000 */ uint filterDim;
/* 0x0004 */ uint blockDim;
@@ -10,19 +23,11 @@
/* 0x0000 */ uint value;
};
-struct tint_array_wrapper_1 {
- float3 arr[256];
-};
-
-struct tint_array_wrapper {
- tint_array_wrapper_1 arr[4];
-};
-
-void tint_symbol_inner(uint3 WorkGroupID, uint3 LocalInvocationID, uint local_invocation_index, threadgroup tint_array_wrapper* const tint_symbol_1, const constant Params* const tint_symbol_2, texture2d<float, access::sample> tint_symbol_3, const constant Flip* const tint_symbol_4, sampler tint_symbol_5, texture2d<float, access::write> tint_symbol_6) {
+void tint_symbol_inner(uint3 WorkGroupID, uint3 LocalInvocationID, uint local_invocation_index, threadgroup tint_array<tint_array<float3, 256>, 4>* const tint_symbol_1, const constant Params* const tint_symbol_2, texture2d<float, access::sample> tint_symbol_3, const constant Flip* const tint_symbol_4, sampler tint_symbol_5, texture2d<float, access::write> tint_symbol_6) {
for(uint idx = local_invocation_index; (idx < 1024u); idx = (idx + 64u)) {
uint const i_1 = (idx / 256u);
uint const i_2 = (idx % 256u);
- (*(tint_symbol_1)).arr[i_1].arr[i_2] = float3(0.0f);
+ (*(tint_symbol_1))[i_1][i_2] = float3(0.0f);
}
threadgroup_barrier(mem_flags::mem_threadgroup);
uint const filterOffset = (((*(tint_symbol_2)).filterDim - 1u) / 2u);
@@ -34,7 +39,7 @@
if (((*(tint_symbol_4)).value != 0u)) {
loadIndex = int2(loadIndex).yx;
}
- (*(tint_symbol_1)).arr[r].arr[((4u * LocalInvocationID[0]) + c)] = float4(tint_symbol_3.sample(tint_symbol_5, ((float2(loadIndex) + float2(0.25f)) / float2(dims)), level(0.0f))).rgb;
+ (*(tint_symbol_1))[r][((4u * LocalInvocationID[0]) + c)] = float4(tint_symbol_3.sample(tint_symbol_5, ((float2(loadIndex) + float2(0.25f)) / float2(dims)), level(0.0f))).rgb;
}
}
threadgroup_barrier(mem_flags::mem_threadgroup);
@@ -49,7 +54,7 @@
float3 acc = float3(0.0f);
for(uint f = 0u; (f < (*(tint_symbol_2)).filterDim); f = (f + 1u)) {
uint i = ((center + f) - filterOffset);
- acc = (acc + ((1.0f / float((*(tint_symbol_2)).filterDim)) * (*(tint_symbol_1)).arr[r].arr[i]));
+ acc = (acc + ((1.0f / float((*(tint_symbol_2)).filterDim)) * (*(tint_symbol_1))[r][i]));
}
tint_symbol_6.write(float4(acc, 1.0f), uint2(writeIndex));
}
@@ -58,7 +63,7 @@
}
kernel void tint_symbol(const constant Params* tint_symbol_8 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_9 [[texture(0)]], const constant Flip* tint_symbol_10 [[buffer(1)]], sampler tint_symbol_11 [[sampler(0)]], texture2d<float, access::write> tint_symbol_12 [[texture(1)]], uint3 WorkGroupID [[threadgroup_position_in_grid]], uint3 LocalInvocationID [[thread_position_in_threadgroup]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
- threadgroup tint_array_wrapper tint_symbol_7;
+ threadgroup tint_array<tint_array<float3, 256>, 4> tint_symbol_7;
tint_symbol_inner(WorkGroupID, LocalInvocationID, local_invocation_index, &(tint_symbol_7), tint_symbol_8, tint_symbol_9, tint_symbol_10, tint_symbol_11, tint_symbol_12);
return;
}
diff --git a/test/tint/bug/tint/943.spvasm.expected.msl b/test/tint/bug/tint/943.spvasm.expected.msl
index 6093a20..48563e2 100644
--- a/test/tint/bug/tint/943.spvasm.expected.msl
+++ b/test/tint/bug/tint/943.spvasm.expected.msl
@@ -4,44 +4,41 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ float tint_symbol;
- /* 0x0004 */ int8_t tint_pad[12];
+ /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
/* 0x0010 */ packed_int3 aShape;
- /* 0x001c */ int8_t tint_pad_1[4];
+ /* 0x001c */ tint_array<int8_t, 4> tint_pad_1;
/* 0x0020 */ packed_int3 bShape;
- /* 0x002c */ int8_t tint_pad_2[4];
+ /* 0x002c */ tint_array<int8_t, 4> tint_pad_2;
/* 0x0030 */ packed_int3 outShape;
- /* 0x003c */ int8_t tint_pad_3[4];
+ /* 0x003c */ tint_array<int8_t, 4> tint_pad_3;
/* 0x0040 */ int2 outShapeStrides;
};
struct ssbOut {
- /* 0x0000 */ float result[1];
+ /* 0x0000 */ tint_array<float, 1> result;
};
struct ssbA {
- /* 0x0000 */ float A[1];
+ /* 0x0000 */ tint_array<float, 1> A;
};
struct ssbB {
- /* 0x0000 */ float B[1];
-};
-
-struct tint_array_wrapper_1 {
- float arr[64];
-};
-
-struct tint_array_wrapper {
- tint_array_wrapper_1 arr[64];
-};
-
-struct tint_array_wrapper_3 {
- float arr[1];
-};
-
-struct tint_array_wrapper_2 {
- tint_array_wrapper_3 arr[64];
+ /* 0x0000 */ tint_array<float, 1> B;
};
bool coordsInBounds_vi2_vi2_(thread int2* const coord, thread int2* const shape) {
@@ -175,11 +172,7 @@
return;
}
-struct tint_array_wrapper_4 {
- tint_array_wrapper_3 arr[1];
-};
-
-void mm_matMul_i1_i1_i1_(thread int* const dimAOuter, thread int* const dimInner, thread int* const dimBOuter, thread uint3* const tint_symbol_19, thread uint3* const tint_symbol_20, const constant Uniforms* const tint_symbol_21, thread int* const tint_symbol_22, thread int* const tint_symbol_23, thread int* const tint_symbol_24, const device ssbA* const tint_symbol_25, threadgroup tint_array_wrapper* const tint_symbol_26, thread int* const tint_symbol_27, const device ssbB* const tint_symbol_28, threadgroup tint_array_wrapper_2* const tint_symbol_29, device ssbOut* const tint_symbol_30) {
+void mm_matMul_i1_i1_i1_(thread int* const dimAOuter, thread int* const dimInner, thread int* const dimBOuter, thread uint3* const tint_symbol_19, thread uint3* const tint_symbol_20, const constant Uniforms* const tint_symbol_21, thread int* const tint_symbol_22, thread int* const tint_symbol_23, thread int* const tint_symbol_24, const device ssbA* const tint_symbol_25, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_26, thread int* const tint_symbol_27, const device ssbB* const tint_symbol_28, threadgroup tint_array<tint_array<float, 1>, 64>* const tint_symbol_29, device ssbOut* const tint_symbol_30) {
int tileRow = 0;
int tileCol = 0;
int globalRow = 0;
@@ -187,7 +180,7 @@
int numTiles = 0;
int innerRow = 0;
int innerCol = 0;
- tint_array_wrapper_4 acc = {};
+ tint_array<tint_array<float, 1>, 1> acc = {};
int tileColA = 0;
int tileRowB = 0;
int t = 0;
@@ -205,7 +198,7 @@
int param_6 = 0;
int k = 0;
int inner = 0;
- tint_array_wrapper_3 BCached = {};
+ tint_array<float, 1> BCached = {};
int innerRow_3 = 0;
float ACached = 0.0f;
int innerCol_3 = 0;
@@ -240,7 +233,7 @@
}
int const x_177 = innerRow;
int const x_178 = innerCol;
- acc.arr[x_177].arr[x_178] = 0.0f;
+ acc[x_177][x_178] = 0.0f;
{
int const x_181 = innerCol;
innerCol = as_type<int>((as_type<uint>(x_181) + as_type<uint>(1)));
@@ -292,7 +285,7 @@
param_3 = as_type<int>((as_type<uint>(x_235) + as_type<uint>(x_236)));
param_4 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_238) * as_type<uint>(64)))) + as_type<uint>(x_240)));
float const x_244 = mm_readA_i1_i1_(&(param_3), &(param_4), tint_symbol_21, tint_symbol_22, tint_symbol_23, tint_symbol_24, tint_symbol_25);
- (*(tint_symbol_26)).arr[x_233].arr[x_234] = x_244;
+ (*(tint_symbol_26))[x_233][x_234] = x_244;
{
int const x_247 = innerCol_1;
innerCol_1 = as_type<int>((as_type<uint>(x_247) + as_type<uint>(1)));
@@ -332,7 +325,7 @@
param_5 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_280) * as_type<uint>(64)))) + as_type<uint>(x_282)));
param_6 = as_type<int>((as_type<uint>(x_284) + as_type<uint>(x_285)));
float const x_289 = mm_readB_i1_i1_(&(param_5), &(param_6), tint_symbol_21, tint_symbol_23, tint_symbol_27, tint_symbol_24, tint_symbol_28);
- (*(tint_symbol_29)).arr[x_278].arr[x_279] = x_289;
+ (*(tint_symbol_29))[x_278][x_279] = x_289;
{
int const x_291 = innerCol_2;
innerCol_2 = as_type<int>((as_type<uint>(x_291) + as_type<uint>(1)));
@@ -362,8 +355,8 @@
int const x_315 = k;
int const x_316 = tileCol;
int const x_317 = inner;
- float const x_320 = (*(tint_symbol_29)).arr[x_315].arr[as_type<int>((as_type<uint>(x_316) + as_type<uint>(x_317)))];
- BCached.arr[x_314] = x_320;
+ float const x_320 = (*(tint_symbol_29))[x_315][as_type<int>((as_type<uint>(x_316) + as_type<uint>(x_317)))];
+ BCached[x_314] = x_320;
{
int const x_322 = inner;
inner = as_type<int>((as_type<uint>(x_322) + as_type<uint>(1)));
@@ -379,7 +372,7 @@
int const x_333 = tileRow;
int const x_334 = innerRow_3;
int const x_336 = k;
- float const x_338 = (*(tint_symbol_26)).arr[as_type<int>((as_type<uint>(x_333) + as_type<uint>(x_334)))].arr[x_336];
+ float const x_338 = (*(tint_symbol_26))[as_type<int>((as_type<uint>(x_333) + as_type<uint>(x_334)))][x_336];
ACached = x_338;
innerCol_3 = 0;
while (true) {
@@ -392,9 +385,9 @@
int const x_348 = innerCol_3;
float const x_349 = ACached;
int const x_350 = innerCol_3;
- float const x_352 = BCached.arr[x_350];
- float const x_355 = acc.arr[x_347].arr[x_348];
- acc.arr[x_347].arr[x_348] = (x_355 + (x_349 * x_352));
+ float const x_352 = BCached[x_350];
+ float const x_355 = acc[x_347][x_348];
+ acc[x_347][x_348] = (x_355 + (x_349 * x_352));
{
int const x_358 = innerCol_3;
innerCol_3 = as_type<int>((as_type<uint>(x_358) + as_type<uint>(1)));
@@ -454,7 +447,7 @@
int const x_404 = innerCol_4;
param_7 = as_type<int>((as_type<uint>(x_397) + as_type<uint>(x_398)));
param_8 = as_type<int>((as_type<uint>(x_400) + as_type<uint>(x_401)));
- float const x_409 = acc.arr[x_403].arr[x_404];
+ float const x_409 = acc[x_403][x_404];
param_9 = x_409;
mm_write_i1_i1_f1_(&(param_7), &(param_8), &(param_9), tint_symbol_24, tint_symbol_21, tint_symbol_30);
}
@@ -471,7 +464,7 @@
return;
}
-void main_1(const constant Uniforms* const tint_symbol_31, thread int* const tint_symbol_32, thread int* const tint_symbol_33, thread int* const tint_symbol_34, thread uint3* const tint_symbol_35, thread int* const tint_symbol_36, thread uint3* const tint_symbol_37, const device ssbA* const tint_symbol_38, threadgroup tint_array_wrapper* const tint_symbol_39, const device ssbB* const tint_symbol_40, threadgroup tint_array_wrapper_2* const tint_symbol_41, device ssbOut* const tint_symbol_42) {
+void main_1(const constant Uniforms* const tint_symbol_31, thread int* const tint_symbol_32, thread int* const tint_symbol_33, thread int* const tint_symbol_34, thread uint3* const tint_symbol_35, thread int* const tint_symbol_36, thread uint3* const tint_symbol_37, const device ssbA* const tint_symbol_38, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_39, const device ssbB* const tint_symbol_40, threadgroup tint_array<tint_array<float, 1>, 64>* const tint_symbol_41, device ssbOut* const tint_symbol_42) {
int param_18 = 0;
int param_19 = 0;
int param_20 = 0;
@@ -493,16 +486,16 @@
return;
}
-void tint_symbol_1_inner(uint3 gl_LocalInvocationID_param, uint3 gl_GlobalInvocationID_param, uint local_invocation_index, threadgroup tint_array_wrapper_2* const tint_symbol_43, threadgroup tint_array_wrapper* const tint_symbol_44, thread uint3* const tint_symbol_45, thread uint3* const tint_symbol_46, const constant Uniforms* const tint_symbol_47, thread int* const tint_symbol_48, thread int* const tint_symbol_49, thread int* const tint_symbol_50, thread int* const tint_symbol_51, const device ssbA* const tint_symbol_52, const device ssbB* const tint_symbol_53, device ssbOut* const tint_symbol_54) {
+void tint_symbol_1_inner(uint3 gl_LocalInvocationID_param, uint3 gl_GlobalInvocationID_param, uint local_invocation_index, threadgroup tint_array<tint_array<float, 1>, 64>* const tint_symbol_43, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_44, thread uint3* const tint_symbol_45, thread uint3* const tint_symbol_46, const constant Uniforms* const tint_symbol_47, thread int* const tint_symbol_48, thread int* const tint_symbol_49, thread int* const tint_symbol_50, thread int* const tint_symbol_51, const device ssbA* const tint_symbol_52, const device ssbB* const tint_symbol_53, device ssbOut* const tint_symbol_54) {
{
uint const i_1 = local_invocation_index;
uint const i_2 = (local_invocation_index % 1u);
- (*(tint_symbol_43)).arr[i_1].arr[i_2] = 0.0f;
+ (*(tint_symbol_43))[i_1][i_2] = 0.0f;
}
for(uint idx = local_invocation_index; (idx < 4096u); idx = (idx + 64u)) {
uint const i = (idx / 64u);
uint const i_1 = (idx % 64u);
- (*(tint_symbol_44)).arr[i].arr[i_1] = 0.0f;
+ (*(tint_symbol_44))[i][i_1] = 0.0f;
}
threadgroup_barrier(mem_flags::mem_threadgroup);
*(tint_symbol_45) = gl_LocalInvocationID_param;
@@ -511,8 +504,8 @@
}
kernel void tint_symbol_1(const constant Uniforms* tint_symbol_59 [[buffer(0)]], const device ssbA* tint_symbol_64 [[buffer(2)]], const device ssbB* tint_symbol_65 [[buffer(3)]], device ssbOut* tint_symbol_66 [[buffer(1)]], uint3 gl_LocalInvocationID_param [[thread_position_in_threadgroup]], uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
- threadgroup tint_array_wrapper_2 tint_symbol_55;
- threadgroup tint_array_wrapper tint_symbol_56;
+ threadgroup tint_array<tint_array<float, 1>, 64> tint_symbol_55;
+ threadgroup tint_array<tint_array<float, 64>, 64> tint_symbol_56;
thread uint3 tint_symbol_57 = 0u;
thread uint3 tint_symbol_58 = 0u;
thread int tint_symbol_60 = 0;
diff --git a/test/tint/bug/tint/948.wgsl.expected.msl b/test/tint/bug/tint/948.wgsl.expected.msl
index c03a21b..c21d89f 100644
--- a/test/tint/bug/tint/948.wgsl.expected.msl
+++ b/test/tint/bug/tint/948.wgsl.expected.msl
@@ -14,6 +14,18 @@
using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
return lhs * vec<T, N>(rhs);
@@ -27,7 +39,7 @@
struct LeftOver {
/* 0x0000 */ float time;
/* 0x0004 */ uint padding;
- /* 0x0008 */ int8_t tint_pad[8];
+ /* 0x0008 */ tint_array<int8_t, 8> tint_pad;
/* 0x0010 */ float4x4 worldViewProjection;
/* 0x0050 */ float2 outputSize;
/* 0x0058 */ float2 stageSize;
@@ -35,7 +47,7 @@
/* 0x0068 */ float stageScale;
/* 0x006c */ float spriteCount;
/* 0x0070 */ packed_float3 colorMul;
- /* 0x007c */ int8_t tint_pad_1[4];
+ /* 0x007c */ tint_array<int8_t, 4> tint_pad_1;
};
float4x4 getFrameData_f1_(thread float* const frameID, const constant LeftOver* const tint_symbol_5, texture2d<float, access::sample> tint_symbol_6, sampler tint_symbol_7) {
diff --git a/test/tint/bug/tint/949.wgsl.expected.msl b/test/tint/bug/tint/949.wgsl.expected.msl
index 5aab1bd..9b8daf4 100644
--- a/test/tint/bug/tint/949.wgsl.expected.msl
+++ b/test/tint/bug/tint/949.wgsl.expected.msl
@@ -14,6 +14,18 @@
using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
return lhs * vec<T, N>(rhs);
@@ -34,7 +46,7 @@
/* 0x0040 */ float4x4 u_ViewProjection;
/* 0x0080 */ float u_bumpStrength;
/* 0x0084 */ uint padding;
- /* 0x0088 */ int8_t tint_pad[8];
+ /* 0x0088 */ tint_array<int8_t, 8> tint_pad;
/* 0x0090 */ packed_float3 u_cameraPosition;
/* 0x009c */ float u_parallaxScale;
/* 0x00a0 */ float textureInfoName;
@@ -50,7 +62,7 @@
/* 0x003c */ uint padding_2;
/* 0x0040 */ float4 shadowsInfo;
/* 0x0050 */ float2 depthValues;
- /* 0x0058 */ int8_t tint_pad_1[8];
+ /* 0x0058 */ tint_array<int8_t, 8> tint_pad_1;
};
float3x3 cotangent_frame_vf3_vf3_vf2_vf2_(thread float3* const normal_1, thread float3* const p, thread float2* const uv, thread float2* const tangentSpaceParams) {
diff --git a/test/tint/bug/tint/951.spvasm.expected.msl b/test/tint/bug/tint/951.spvasm.expected.msl
index 80a05a7..0e5fdff 100644
--- a/test/tint/bug/tint/951.spvasm.expected.msl
+++ b/test/tint/bug/tint/951.spvasm.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct ssbOut {
- /* 0x0000 */ float result[1];
+ /* 0x0000 */ tint_array<float, 1> result;
};
struct ssbA {
- /* 0x0000 */ float A[1];
+ /* 0x0000 */ tint_array<float, 1> A;
};
struct Uniforms {
diff --git a/test/tint/bug/tint/977.spvasm.expected.msl b/test/tint/bug/tint/977.spvasm.expected.msl
index 16062d0..83b2b6c 100644
--- a/test/tint/bug/tint/977.spvasm.expected.msl
+++ b/test/tint/bug/tint/977.spvasm.expected.msl
@@ -1,16 +1,29 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct ResultMatrix {
- /* 0x0000 */ float numbers[1];
+ /* 0x0000 */ tint_array<float, 1> numbers;
};
struct FirstMatrix {
- float numbers[1];
+ tint_array<float, 1> numbers;
};
struct SecondMatrix {
- float numbers[1];
+ tint_array<float, 1> numbers;
};
struct Uniforms {
diff --git a/test/tint/bug/tint/993.wgsl.expected.msl b/test/tint/bug/tint/993.wgsl.expected.msl
index 98f5117..7b82d95 100644
--- a/test/tint/bug/tint/993.wgsl.expected.msl
+++ b/test/tint/bug/tint/993.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Constants {
/* 0x0000 */ uint zero;
};
@@ -9,16 +22,12 @@
/* 0x0000 */ uint value;
};
-struct tint_array_wrapper {
- /* 0x0000 */ atomic_int arr[3];
-};
-
struct TestData {
- /* 0x0000 */ tint_array_wrapper data;
+ /* 0x0000 */ tint_array<atomic_int, 3> data;
};
int runTest(device TestData* const tint_symbol_3, const constant Constants* const tint_symbol_4) {
- return atomic_load_explicit(&((*(tint_symbol_3)).data.arr[(0u + uint((*(tint_symbol_4)).zero))]), memory_order_relaxed);
+ return atomic_load_explicit(&((*(tint_symbol_3)).data[(0u + uint((*(tint_symbol_4)).zero))]), memory_order_relaxed);
}
kernel void tint_symbol(device TestData* tint_symbol_5 [[buffer(2)]], const constant Constants* tint_symbol_6 [[buffer(0)]], device Result* tint_symbol_7 [[buffer(1)]]) {
diff --git a/test/tint/bug/tint/998.wgsl.expected.msl b/test/tint/bug/tint/998.wgsl.expected.msl
index 740838e..c9dd773 100644
--- a/test/tint/bug/tint/998.wgsl.expected.msl
+++ b/test/tint/bug/tint/998.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Constants {
/* 0x0000 */ uint zero;
};
@@ -9,17 +22,13 @@
uint value;
};
-struct tint_array_wrapper {
- uint arr[3];
-};
-
struct S {
- tint_array_wrapper data;
+ tint_array<uint, 3> data;
};
kernel void tint_symbol(const constant Constants* tint_symbol_2 [[buffer(0)]]) {
thread S tint_symbol_1 = {};
- tint_symbol_1.data.arr[(*(tint_symbol_2)).zero] = 0u;
+ tint_symbol_1.data[(*(tint_symbol_2)).zero] = 0u;
return;
}
diff --git a/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.msl b/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.msl
index 537a453..f92477a 100644
--- a/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct S {
- int a[1];
+ tint_array<int, 1> a;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.msl b/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.msl
index 0ab65d1..3fb5295 100644
--- a/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/deprecated.wgsl.expected.msl b/test/tint/builtins/arrayLength/deprecated.wgsl.expected.msl
index bf8e5b0..bc4e7ca 100644
--- a/test/tint/builtins/arrayLength/deprecated.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/deprecated.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct S {
- int a[1];
+ tint_array<int, 1> a;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/simple.wgsl.expected.msl b/test/tint/builtins/arrayLength/simple.wgsl.expected.msl
index 537a453..f92477a 100644
--- a/test/tint/builtins/arrayLength/simple.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/simple.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct S {
- int a[1];
+ tint_array<int, 1> a;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.msl b/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.msl
index 0ab65d1..3fb5295 100644
--- a/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/via_let.wgsl.expected.msl b/test/tint/builtins/arrayLength/via_let.wgsl.expected.msl
index 537a453..f92477a 100644
--- a/test/tint/builtins/arrayLength/via_let.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/via_let.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct S {
- int a[1];
+ tint_array<int, 1> a;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.msl b/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.msl
index 537a453..f92477a 100644
--- a/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct S {
- int a[1];
+ tint_array<int, 1> a;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.msl b/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.msl
index 0ab65d1..3fb5295 100644
--- a/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.msl b/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.msl
index 0ab65d1..3fb5295 100644
--- a/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.msl
+++ b/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
kernel void tint_symbol(const constant tint_symbol_1* tint_symbol_3 [[buffer(30)]]) {
diff --git a/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.msl
index 1f8ac29..8f9b209 100644
--- a/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RO {
- int arg_0[1];
+ tint_array<int, 1> arg_0;
};
void arrayLength_1588cd(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.msl
index 9fa02f3..a0b7187 100644
--- a/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RW {
- int arg_0[1];
+ tint_array<int, 1> arg_0;
};
void arrayLength_61b1c7(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.msl
index f1b7785..b0aba71 100644
--- a/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RO {
- float arg_0[1];
+ tint_array<float, 1> arg_0;
};
void arrayLength_a0f5ca(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.msl
index 22cfa6c..b7fe50b 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RW {
- float arg_0[1];
+ tint_array<float, 1> arg_0;
};
void arrayLength_cdd123(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.msl
index d64c1e0..f62106e 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RO {
- uint arg_0[1];
+ tint_array<uint, 1> arg_0;
};
void arrayLength_cfca0a(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.msl
index 4412853..05c3bc9 100644
--- a/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RW {
- uint arg_0[1];
+ tint_array<uint, 1> arg_0;
};
void arrayLength_eb510f(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
index 04f882d..617b8df 100644
--- a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct GammaTransferParams {
/* 0x0000 */ float G;
/* 0x0004 */ float A;
@@ -15,7 +28,7 @@
struct ExternalTextureParams {
/* 0x0000 */ uint numPlanes;
/* 0x0004 */ uint doYuvToRgbConversionOnly;
- /* 0x0008 */ int8_t tint_pad[8];
+ /* 0x0008 */ tint_array<int8_t, 8> tint_pad;
/* 0x0010 */ float3x4 yuvToRgbConversionMatrix;
/* 0x0040 */ GammaTransferParams gammaDecodeParams;
/* 0x0060 */ GammaTransferParams gammaEncodeParams;
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.msl
index fa5b6c3..5b65152 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct GammaTransferParams {
/* 0x0000 */ float G;
/* 0x0004 */ float A;
@@ -15,7 +28,7 @@
struct ExternalTextureParams {
/* 0x0000 */ uint numPlanes;
/* 0x0004 */ uint doYuvToRgbConversionOnly;
- /* 0x0008 */ int8_t tint_pad[8];
+ /* 0x0008 */ tint_array<int8_t, 8> tint_pad;
/* 0x0010 */ float3x4 yuvToRgbConversionMatrix;
/* 0x0040 */ GammaTransferParams gammaDecodeParams;
/* 0x0060 */ GammaTransferParams gammaEncodeParams;
diff --git a/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.msl b/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.msl
index 1f8ac29..8f9b209 100644
--- a/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RO {
- int arg_0[1];
+ tint_array<int, 1> arg_0;
};
void arrayLength_1588cd(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.msl b/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.msl
index 9fa02f3..a0b7187 100644
--- a/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RW {
- int arg_0[1];
+ tint_array<int, 1> arg_0;
};
void arrayLength_61b1c7(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.msl b/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.msl
index f1b7785..b0aba71 100644
--- a/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RO {
- float arg_0[1];
+ tint_array<float, 1> arg_0;
};
void arrayLength_a0f5ca(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.msl b/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.msl
index 22cfa6c..b7fe50b 100644
--- a/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RW {
- float arg_0[1];
+ tint_array<float, 1> arg_0;
};
void arrayLength_cdd123(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.msl b/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.msl
index d64c1e0..f62106e 100644
--- a/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RO {
- uint arg_0[1];
+ tint_array<uint, 1> arg_0;
};
void arrayLength_cfca0a(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.msl b/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.msl
index 4412853..05c3bc9 100644
--- a/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
- /* 0x0000 */ uint4 buffer_size[1];
+ /* 0x0000 */ tint_array<uint4, 1> buffer_size;
};
struct SB_RW {
- uint arg_0[1];
+ tint_array<uint, 1> arg_0;
};
void arrayLength_eb510f(const constant tint_symbol_1* const tint_symbol_3) {
diff --git a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl
index 5f8b2c3..d6fff77 100644
--- a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct GammaTransferParams {
/* 0x0000 */ float G;
/* 0x0004 */ float A;
@@ -15,7 +28,7 @@
struct ExternalTextureParams {
/* 0x0000 */ uint numPlanes;
/* 0x0004 */ uint doYuvToRgbConversionOnly;
- /* 0x0008 */ int8_t tint_pad[8];
+ /* 0x0008 */ tint_array<int8_t, 8> tint_pad;
/* 0x0010 */ float3x4 yuvToRgbConversionMatrix;
/* 0x0040 */ GammaTransferParams gammaDecodeParams;
/* 0x0060 */ GammaTransferParams gammaEncodeParams;
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.msl b/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.msl
index a84758c..9622213 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct GammaTransferParams {
/* 0x0000 */ float G;
/* 0x0004 */ float A;
@@ -15,7 +28,7 @@
struct ExternalTextureParams {
/* 0x0000 */ uint numPlanes;
/* 0x0004 */ uint doYuvToRgbConversionOnly;
- /* 0x0008 */ int8_t tint_pad[8];
+ /* 0x0008 */ tint_array<int8_t, 8> tint_pad;
/* 0x0010 */ float3x4 yuvToRgbConversionMatrix;
/* 0x0040 */ GammaTransferParams gammaDecodeParams;
/* 0x0060 */ GammaTransferParams gammaEncodeParams;
diff --git a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl
index a7d71cc..2afc801 100644
--- a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl
+++ b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct GammaTransferParams {
/* 0x0000 */ float G;
/* 0x0004 */ float A;
@@ -15,7 +28,7 @@
struct ExternalTextureParams {
/* 0x0000 */ uint numPlanes;
/* 0x0004 */ uint doYuvToRgbConversionOnly;
- /* 0x0008 */ int8_t tint_pad[8];
+ /* 0x0008 */ tint_array<int8_t, 8> tint_pad;
/* 0x0010 */ float3x4 yuvToRgbConversionMatrix;
/* 0x0040 */ GammaTransferParams gammaDecodeParams;
/* 0x0060 */ GammaTransferParams gammaEncodeParams;
diff --git a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.msl b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.msl
index 31add65..e210c3c 100644
--- a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.msl
@@ -2,6 +2,18 @@
using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
return lhs * vec<T, N>(rhs);
@@ -14,9 +26,9 @@
struct S {
/* 0x0000 */ float3x2 tint_symbol;
- /* 0x0018 */ int8_t tint_pad[8];
+ /* 0x0018 */ tint_array<int8_t, 8> tint_pad;
/* 0x0020 */ packed_float3 vector;
- /* 0x002c */ int8_t tint_pad_1[4];
+ /* 0x002c */ tint_array<int8_t, 4> tint_pad_1;
};
fragment void tint_symbol_1(const constant S* tint_symbol_2 [[buffer(0)]]) {
diff --git a/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.msl b/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.msl
index 40ec533..8f4ff55 100644
--- a/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.msl
@@ -12,10 +12,22 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ float3x3 tint_symbol;
/* 0x0030 */ packed_float3 vector;
- /* 0x003c */ int8_t tint_pad[4];
+ /* 0x003c */ tint_array<int8_t, 4> tint_pad;
};
fragment void tint_symbol_1(const constant S* tint_symbol_2 [[buffer(0)]]) {
diff --git a/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.msl b/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.msl
index a5da864..d9fc80b 100644
--- a/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.msl
@@ -12,10 +12,22 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ float3x3 tint_symbol;
/* 0x0030 */ packed_float3 vector;
- /* 0x003c */ int8_t tint_pad[4];
+ /* 0x003c */ tint_array<int8_t, 4> tint_pad;
};
fragment void tint_symbol_1(const constant S* tint_symbol_2 [[buffer(0)]]) {
diff --git a/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.msl b/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.msl
index 36412ba..3f66659 100644
--- a/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.msl
@@ -12,10 +12,22 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ float4x3 tint_symbol;
/* 0x0040 */ packed_float3 vector;
- /* 0x004c */ int8_t tint_pad[4];
+ /* 0x004c */ tint_array<int8_t, 4> tint_pad;
};
fragment void tint_symbol_1(const constant S* tint_symbol_2 [[buffer(0)]]) {
diff --git a/test/tint/expressions/index/let/let/literal/array.wgsl.expected.msl b/test/tint/expressions/index/let/let/literal/array.wgsl.expected.msl
index 6a9487f..c5f5865 100644
--- a/test/tint/expressions/index/let/let/literal/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/let/let/literal/array.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f() {
- tint_array_wrapper const a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
+ tint_array<int, 8> const a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
int const i = 1;
- return a.arr[1];
+ return 2;
}
diff --git a/test/tint/expressions/index/let/let/param/array.wgsl.expected.msl b/test/tint/expressions/index/let/let/param/array.wgsl.expected.msl
index 7b941e4..11906e9 100644
--- a/test/tint/expressions/index/let/let/param/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/let/let/param/array.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f(int x) {
- tint_array_wrapper const a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
+ tint_array<int, 8> const a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
int const i = x;
- return a.arr[i];
+ return a[i];
}
diff --git a/test/tint/expressions/index/let/literal/array.wgsl.expected.msl b/test/tint/expressions/index/let/literal/array.wgsl.expected.msl
index d4d28b1..e0a4066 100644
--- a/test/tint/expressions/index/let/literal/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/let/literal/array.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f() {
- tint_array_wrapper const a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
- return a.arr[1];
+ tint_array<int, 8> const a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+ return 2;
}
diff --git a/test/tint/expressions/index/let/param/array.wgsl.expected.msl b/test/tint/expressions/index/let/param/array.wgsl.expected.msl
index eac5c42..d3bbdae 100644
--- a/test/tint/expressions/index/let/param/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/let/param/array.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f(int i) {
- tint_array_wrapper const a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
- return a.arr[i];
+ tint_array<int, 8> const a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+ return a[i];
}
diff --git a/test/tint/expressions/index/let/var/literal/array.wgsl.expected.msl b/test/tint/expressions/index/let/var/literal/array.wgsl.expected.msl
index 30f40e9..74fc40d 100644
--- a/test/tint/expressions/index/let/var/literal/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/let/var/literal/array.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f() {
- tint_array_wrapper a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
+ tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
int const i = 1;
- return a.arr[1];
+ return a[1];
}
diff --git a/test/tint/expressions/index/var/let/literal/array.wgsl.expected.msl b/test/tint/expressions/index/var/let/literal/array.wgsl.expected.msl
index 30f40e9..74fc40d 100644
--- a/test/tint/expressions/index/var/let/literal/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/var/let/literal/array.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f() {
- tint_array_wrapper a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
+ tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
int const i = 1;
- return a.arr[1];
+ return a[1];
}
diff --git a/test/tint/expressions/index/var/let/param/array.wgsl.expected.msl b/test/tint/expressions/index/var/let/param/array.wgsl.expected.msl
index b1e207d..970f617 100644
--- a/test/tint/expressions/index/var/let/param/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/var/let/param/array.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f(int x) {
- tint_array_wrapper a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
+ tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
int const i = x;
- return a.arr[i];
+ return a[i];
}
diff --git a/test/tint/expressions/index/var/literal/array.wgsl.expected.msl b/test/tint/expressions/index/var/literal/array.wgsl.expected.msl
index ae2d9ca..5cc2f07 100644
--- a/test/tint/expressions/index/var/literal/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/var/literal/array.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f() {
- tint_array_wrapper a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
- return a.arr[1];
+ tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+ return a[1];
}
diff --git a/test/tint/expressions/index/var/param/array.wgsl.expected.msl b/test/tint/expressions/index/var/param/array.wgsl.expected.msl
index 9d03b80..918a63b 100644
--- a/test/tint/expressions/index/var/param/array.wgsl.expected.msl
+++ b/test/tint/expressions/index/var/param/array.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
int f(int i) {
- tint_array_wrapper a = {.arr={1, 2, 3, 4, 5, 6, 7, 8}};
- return a.arr[i];
+ tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+ return a[i];
}
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.msl b/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.msl
index 9f40be1..e2bbca3 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.msl
@@ -12,9 +12,21 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ packed_float3 v;
- /* 0x000c */ int8_t tint_pad[4];
+ /* 0x000c */ tint_array<int8_t, 4> tint_pad;
};
void f(const constant S* const tint_symbol) {
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.msl b/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.msl
index d396d1f..7a93a59 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.msl
@@ -1,9 +1,22 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ packed_int3 v;
- /* 0x000c */ int8_t tint_pad[4];
+ /* 0x000c */ tint_array<int8_t, 4> tint_pad;
};
void f(const constant S* const tint_symbol) {
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.msl b/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.msl
index 8f6a4a6..7444f75 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.msl
@@ -1,9 +1,22 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ packed_uint3 v;
- /* 0x000c */ int8_t tint_pad[4];
+ /* 0x000c */ tint_array<int8_t, 4> tint_pad;
};
void f(const constant S* const tint_symbol) {
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.msl b/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.msl
index 2e63ec7..7599cbc 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.msl
@@ -12,9 +12,21 @@
return vec<T, M>(lhs) * rhs;
}
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ packed_float3 v;
- /* 0x000c */ int8_t tint_pad[4];
+ /* 0x000c */ tint_array<int8_t, 4> tint_pad;
};
void f(device S* const tint_symbol) {
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.msl b/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.msl
index 2bcecc1..06cb457 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.msl
@@ -1,9 +1,22 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ packed_int3 v;
- /* 0x000c */ int8_t tint_pad[4];
+ /* 0x000c */ tint_array<int8_t, 4> tint_pad;
};
void f(device S* const tint_symbol) {
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.msl b/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.msl
index b55912d..e8e4904 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.msl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.msl
@@ -1,9 +1,22 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ packed_uint3 v;
- /* 0x000c */ int8_t tint_pad[4];
+ /* 0x000c */ tint_array<int8_t, 4> tint_pad;
};
void f(device S* const tint_symbol) {
diff --git a/test/tint/expressions/zero_init/array/bool.wgsl.expected.msl b/test/tint/expressions/zero_init/array/bool.wgsl.expected.msl
index ead82c7..8b8b451 100644
--- a/test/tint/expressions/zero_init/array/bool.wgsl.expected.msl
+++ b/test/tint/expressions/zero_init/array/bool.wgsl.expected.msl
@@ -1,11 +1,20 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- bool arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void f() {
- tint_array_wrapper v = {.arr={}};
+ tint_array<bool, 4> v = tint_array<bool, 4>{};
}
diff --git a/test/tint/expressions/zero_init/array/f32.wgsl.expected.msl b/test/tint/expressions/zero_init/array/f32.wgsl.expected.msl
index 7a8df6c..60e142d 100644
--- a/test/tint/expressions/zero_init/array/f32.wgsl.expected.msl
+++ b/test/tint/expressions/zero_init/array/f32.wgsl.expected.msl
@@ -1,11 +1,20 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- float arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void f() {
- tint_array_wrapper v = {.arr={}};
+ tint_array<float, 4> v = tint_array<float, 4>{};
}
diff --git a/test/tint/expressions/zero_init/array/i32.wgsl.expected.msl b/test/tint/expressions/zero_init/array/i32.wgsl.expected.msl
index e8cd266..42ecab7 100644
--- a/test/tint/expressions/zero_init/array/i32.wgsl.expected.msl
+++ b/test/tint/expressions/zero_init/array/i32.wgsl.expected.msl
@@ -1,11 +1,20 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void f() {
- tint_array_wrapper v = {.arr={}};
+ tint_array<int, 4> v = tint_array<int, 4>{};
}
diff --git a/test/tint/expressions/zero_init/array/struct.wgsl.expected.msl b/test/tint/expressions/zero_init/array/struct.wgsl.expected.msl
index 79d7fd7..5101891 100644
--- a/test/tint/expressions/zero_init/array/struct.wgsl.expected.msl
+++ b/test/tint/expressions/zero_init/array/struct.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
int i;
uint u;
@@ -8,11 +21,7 @@
bool b;
};
-struct tint_array_wrapper {
- S arr[4];
-};
-
void f() {
- tint_array_wrapper v = {.arr={}};
+ tint_array<S, 4> v = tint_array<S, 4>{};
}
diff --git a/test/tint/expressions/zero_init/array/u32.wgsl.expected.msl b/test/tint/expressions/zero_init/array/u32.wgsl.expected.msl
index 83dceb0..b2f7135 100644
--- a/test/tint/expressions/zero_init/array/u32.wgsl.expected.msl
+++ b/test/tint/expressions/zero_init/array/u32.wgsl.expected.msl
@@ -1,11 +1,20 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- uint arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void f() {
- tint_array_wrapper v = {.arr={}};
+ tint_array<uint, 4> v = tint_array<uint, 4>{};
}
diff --git a/test/tint/expressions/zero_init/struct/array.wgsl.expected.msl b/test/tint/expressions/zero_init/struct/array.wgsl.expected.msl
index 2600536..ec53d10 100644
--- a/test/tint/expressions/zero_init/struct/array.wgsl.expected.msl
+++ b/test/tint/expressions/zero_init/struct/array.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- float arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- tint_array_wrapper a;
+ tint_array<float, 4> a;
};
void f() {
diff --git a/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.msl b/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.msl
index abb676b..860459d 100644
--- a/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.msl
+++ b/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.msl
@@ -1,33 +1,42 @@
#include <metal_stdlib>
using namespace metal;
-struct strided_arr {
- /* 0x0000 */ float2 el;
- /* 0x0008 */ int8_t tint_pad[8];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- /* 0x0000 */ strided_arr arr[2];
+struct strided_arr {
+ /* 0x0000 */ float2 el;
+ /* 0x0008 */ tint_array<int8_t, 8> tint_pad;
};
struct SSBO {
- /* 0x0000 */ tint_array_wrapper m;
+ /* 0x0000 */ tint_array<strided_arr, 2> m;
};
-float2x2 arr_to_mat2x2_stride_16(tint_array_wrapper arr) {
- return float2x2(arr.arr[0u].el, arr.arr[1u].el);
+float2x2 arr_to_mat2x2_stride_16(tint_array<strided_arr, 2> arr) {
+ return float2x2(arr[0u].el, arr[1u].el);
}
-tint_array_wrapper mat2x2_stride_16_to_arr(float2x2 m) {
+tint_array<strided_arr, 2> mat2x2_stride_16_to_arr(float2x2 m) {
strided_arr const tint_symbol_1 = {.el=m[0u]};
strided_arr const tint_symbol_2 = {.el=m[1u]};
- tint_array_wrapper const tint_symbol_3 = {.arr={tint_symbol_1, tint_symbol_2}};
+ tint_array<strided_arr, 2> const tint_symbol_3 = tint_array<strided_arr, 2>{tint_symbol_1, tint_symbol_2};
return tint_symbol_3;
}
void f_1(device SSBO* const tint_symbol_4) {
float2x2 const x_15 = arr_to_mat2x2_stride_16((*(tint_symbol_4)).m);
- tint_array_wrapper const tint_symbol = mat2x2_stride_16_to_arr(x_15);
+ tint_array<strided_arr, 2> const tint_symbol = mat2x2_stride_16_to_arr(x_15);
(*(tint_symbol_4)).m = tint_symbol;
return;
}
diff --git a/test/tint/let/global/global.wgsl.expected.msl b/test/tint/let/global/global.wgsl.expected.msl
index 72d5df7..d4ded52 100644
--- a/test/tint/let/global/global.wgsl.expected.msl
+++ b/test/tint/let/global/global.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct MyStruct {
- float f1;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- float arr[10];
+struct MyStruct {
+ float f1;
};
constant int v1 = 1;
@@ -25,7 +34,7 @@
constant MyStruct v8 = {};
-constant tint_array_wrapper v9 = {.arr={}};
+constant tint_array<float, 10> v9 = tint_array<float, 10>{};
struct tint_symbol_1 {
float4 value [[color(0)]];
diff --git a/test/tint/let/inferred/function.wgsl.expected.msl b/test/tint/let/inferred/function.wgsl.expected.msl
index 9d93fcf..604c979 100644
--- a/test/tint/let/inferred/function.wgsl.expected.msl
+++ b/test/tint/let/inferred/function.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct MyStruct {
- float f1;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- float arr[10];
+struct MyStruct {
+ float f1;
};
int ret_i32() {
@@ -26,8 +35,8 @@
return tint_symbol_2;
}
-tint_array_wrapper ret_MyArray() {
- tint_array_wrapper const tint_symbol_3 = {.arr={}};
+tint_array<float, 10> ret_MyArray() {
+ tint_array<float, 10> const tint_symbol_3 = tint_array<float, 10>{};
return tint_symbol_3;
}
@@ -40,13 +49,13 @@
float3 const v6 = float3(1.0f);
float3x3 const v7 = float3x3(float3(1.0f), float3(1.0f), float3(1.0f));
MyStruct const v8 = {.f1=1.0f};
- tint_array_wrapper const v9 = {.arr={}};
+ tint_array<float, 10> const v9 = tint_array<float, 10>{};
int const v10 = ret_i32();
uint const v11 = ret_u32();
float const v12 = ret_f32();
MyStruct const v13 = ret_MyStruct();
MyStruct const v14 = ret_MyStruct();
- tint_array_wrapper const v15 = ret_MyArray();
+ tint_array<float, 10> const v15 = ret_MyArray();
}
struct tint_symbol_1 {
diff --git a/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl b/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl
index e345a6d..3baeea6 100644
--- a/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl
+++ b/test/tint/out_of_order_decls/array/alias.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
fragment void f() {
- thread tint_array_wrapper tint_symbol = {};
- tint_symbol.arr[0] = 1;
+ thread tint_array<int, 4> tint_symbol = {};
+ tint_symbol[0] = 1;
return;
}
diff --git a/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl b/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl
index 4e91e2e..98b6893 100644
--- a/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl
+++ b/test/tint/out_of_order_decls/array/struct.wgsl.expected.msl
@@ -1,18 +1,27 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
int m;
};
-struct tint_array_wrapper {
- S arr[4];
-};
-
fragment void f() {
- thread tint_array_wrapper tint_symbol_1 = {};
+ thread tint_array<S, 4> tint_symbol_1 = {};
S const tint_symbol = {.m=1};
- tint_symbol_1.arr[0] = tint_symbol;
+ tint_symbol_1[0] = tint_symbol;
return;
}
diff --git a/test/tint/samples/compute_boids.wgsl.expected.msl b/test/tint/samples/compute_boids.wgsl.expected.msl
index cf438ab..a3cb32a 100644
--- a/test/tint/samples/compute_boids.wgsl.expected.msl
+++ b/test/tint/samples/compute_boids.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct tint_symbol_1 {
float2 a_particlePos [[attribute(0)]];
float2 a_particleVel [[attribute(1)]];
@@ -54,12 +67,8 @@
/* 0x0018 */ float rule3Scale;
};
-struct tint_array_wrapper {
- /* 0x0000 */ Particle arr[5];
-};
-
struct Particles {
- /* 0x0000 */ tint_array_wrapper particles;
+ /* 0x0000 */ tint_array<Particle, 5> particles;
};
void comp_main_inner(uint3 gl_GlobalInvocationID, device Particles* const tint_symbol_4, const constant SimParams* const tint_symbol_5, device Particles* const tint_symbol_6) {
@@ -67,8 +76,8 @@
if ((index >= 5u)) {
return;
}
- float2 vPos = (*(tint_symbol_4)).particles.arr[index].pos;
- float2 vVel = (*(tint_symbol_4)).particles.arr[index].vel;
+ float2 vPos = (*(tint_symbol_4)).particles[index].pos;
+ float2 vVel = (*(tint_symbol_4)).particles[index].vel;
float2 cMass = float2(0.0f);
float2 cVel = float2(0.0f);
float2 colVel = float2(0.0f);
@@ -80,8 +89,8 @@
if ((i == index)) {
continue;
}
- pos = float2((*(tint_symbol_4)).particles.arr[i].pos).xy;
- vel = float2((*(tint_symbol_4)).particles.arr[i].vel).xy;
+ pos = float2((*(tint_symbol_4)).particles[i].pos).xy;
+ vel = float2((*(tint_symbol_4)).particles[i].vel).xy;
if ((distance(pos, vPos) < (*(tint_symbol_5)).rule1Distance)) {
cMass = (cMass + pos);
cMassCount = as_type<int>((as_type<uint>(cMassCount) + as_type<uint>(1)));
@@ -115,8 +124,8 @@
if ((vPos[1] > 1.0f)) {
vPos[1] = -1.0f;
}
- (*(tint_symbol_6)).particles.arr[index].pos = vPos;
- (*(tint_symbol_6)).particles.arr[index].vel = vVel;
+ (*(tint_symbol_6)).particles[index].pos = vPos;
+ (*(tint_symbol_6)).particles[index].vel = vVel;
}
kernel void comp_main(device Particles* tint_symbol_7 [[buffer(1)]], const constant SimParams* tint_symbol_8 [[buffer(0)]], device Particles* tint_symbol_9 [[buffer(2)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) {
diff --git a/test/tint/samples/triangle.wgsl.expected.msl b/test/tint/samples/triangle.wgsl.expected.msl
index 51fb847..664ec4e 100644
--- a/test/tint/samples/triangle.wgsl.expected.msl
+++ b/test/tint/samples/triangle.wgsl.expected.msl
@@ -1,18 +1,27 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- float2 arr[3];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-constant tint_array_wrapper pos = {.arr={float2(0.0f, 0.5f), float2(-0.5f), float2(0.5f, -0.5f)}};
+constant tint_array<float2, 3> pos = tint_array<float2, 3>{float2(0.0f, 0.5f), float2(-0.5f), float2(0.5f, -0.5f)};
struct tint_symbol {
float4 value [[position]];
};
float4 vtx_main_inner(uint VertexIndex) {
- return float4(pos.arr[VertexIndex], 0.0f, 1.0f);
+ return float4(pos[VertexIndex], 0.0f, 1.0f);
}
vertex tint_symbol vtx_main(uint VertexIndex [[vertex_id]]) {
diff --git a/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.msl b/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.msl
index 7b765f6..b086e52 100644
--- a/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.msl
+++ b/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.msl
@@ -1,12 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
/* 0x0000 */ float f;
/* 0x0004 */ uint u;
- /* 0x0008 */ int8_t tint_pad[120];
+ /* 0x0008 */ tint_array<int8_t, 120> tint_pad;
/* 0x0080 */ float4 v;
- /* 0x0090 */ int8_t tint_pad_1[112];
+ /* 0x0090 */ tint_array<int8_t, 112> tint_pad_1;
};
struct tint_symbol_1 {
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.msl
index acf0cc6..939ff14 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,19 +22,15 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<InnerS, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
for(int i = 0; (i < 4); i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)))) {
- s1.a1.arr[(*(tint_symbol_1)).i] = v;
+ s1.a1[(*(tint_symbol_1)).i] = v;
}
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.msl
index 60c282a..76e27e9 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,18 +22,14 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<InnerS, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
- for(int i = 0; (i < 4); s1.a1.arr[(*(tint_symbol_1)).i] = v) {
+ for(int i = 0; (i < 4); s1.a1[(*(tint_symbol_1)).i] = v) {
i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)));
}
return;
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.msl
index 8f33141..82e2101 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,19 +22,15 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<InnerS, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
int i = 0;
- for(s1.a1.arr[(*(tint_symbol_1)).i] = v; (i < 4); i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)))) {
+ for(s1.a1[(*(tint_symbol_1)).i] = v; (i < 4); i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)))) {
}
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl
index 7652337..76c3cca 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
/* 0x0004 */ uint j;
@@ -10,20 +23,12 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct S1 {
- tint_array_wrapper a2;
-};
-
-struct tint_array_wrapper_1 {
- S1 arr[8];
+ tint_array<InnerS, 8> a2;
};
struct OuterS {
- tint_array_wrapper_1 a1;
+ tint_array<S1, 8> a1;
};
uint getNextIndex(thread uint* const tint_symbol_3) {
@@ -37,7 +42,7 @@
OuterS s = {};
InnerS const tint_symbol_1 = v;
uint const tint_symbol_2 = getNextIndex(&(tint_symbol_4));
- s.a1.arr[tint_symbol_2].a2.arr[(*(tint_symbol_5)).j] = tint_symbol_1;
+ s.a1[tint_symbol_2].a2[(*(tint_symbol_5)).j] = tint_symbol_1;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.msl
index 17a3a5e..6e93e31 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,18 +22,14 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<InnerS, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
- s1.a1.arr[(*(tint_symbol_1)).i] = v;
+ s1.a1[(*(tint_symbol_1)).i] = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.msl
index 12691cd..05ae52c 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
/* 0x0004 */ uint j;
@@ -10,22 +23,14 @@
int v;
};
-struct tint_array_wrapper_1 {
- InnerS arr[8];
-};
-
-struct tint_array_wrapper {
- tint_array_wrapper_1 arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<tint_array<InnerS, 8>, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
- s1.a1.arr[(*(tint_symbol_1)).i].arr[(*(tint_symbol_1)).j] = v;
+ s1.a1[(*(tint_symbol_1)).i][(*(tint_symbol_1)).j] = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.msl
index 7686939..9ad4660 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -13,18 +26,14 @@
InnerS s2;
};
-struct tint_array_wrapper {
- S1 arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<S1, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
- s1.a1.arr[(*(tint_symbol_1)).i].s2 = v;
+ s1.a1[(*(tint_symbol_1)).i].s2 = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.msl
index a638c3f..c92d7c4 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
/* 0x0004 */ uint j;
@@ -10,26 +23,18 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct S1 {
- tint_array_wrapper a2;
-};
-
-struct tint_array_wrapper_1 {
- S1 arr[8];
+ tint_array<InnerS, 8> a2;
};
struct OuterS {
- tint_array_wrapper_1 a1;
+ tint_array<S1, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s = {};
- s.a1.arr[(*(tint_symbol_1)).i].a2.arr[(*(tint_symbol_1)).j] = v;
+ s.a1[(*(tint_symbol_1)).i].a2[(*(tint_symbol_1)).j] = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.msl
index 6d0fc32..ac9d29d 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -10,7 +23,7 @@
};
struct OuterS {
- /* 0x0000 */ InnerS a1[1];
+ /* 0x0000 */ tint_array<InnerS, 1> a1;
};
kernel void tint_symbol(device OuterS* tint_symbol_1 [[buffer(1)]], const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.msl
index 2b23084..b9abd21 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
/* 0x0004 */ uint j;
@@ -10,21 +23,17 @@
/* 0x0000 */ int v;
};
-struct tint_array_wrapper {
- /* 0x0000 */ InnerS arr[8];
-};
-
struct S1 {
- /* 0x0000 */ tint_array_wrapper a2;
+ /* 0x0000 */ tint_array<InnerS, 8> a2;
};
struct OuterS {
- /* 0x0000 */ S1 a1[1];
+ /* 0x0000 */ tint_array<S1, 1> a1;
};
kernel void tint_symbol(device OuterS* tint_symbol_1 [[buffer(1)]], const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
InnerS v = {};
- (*(tint_symbol_1)).a1[(*(tint_symbol_2)).i].a2.arr[(*(tint_symbol_2)).j] = v;
+ (*(tint_symbol_1)).a1[(*(tint_symbol_2)).i].a2[(*(tint_symbol_2)).j] = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.msl
index 3a268a0..6bdd4e5 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,20 +22,16 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
- tint_array_wrapper a2;
+ tint_array<InnerS, 8> a1;
+ tint_array<InnerS, 8> a2;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
- s1.a1.arr[(*(tint_symbol_1)).i] = v;
- s1.a2.arr[(*(tint_symbol_1)).i] = v;
+ s1.a1[(*(tint_symbol_1)).i] = v;
+ s1.a2[(*(tint_symbol_1)).i] = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.msl
index 2d164b2..375695c 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,12 +22,8 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct S1 {
- tint_array_wrapper a;
+ tint_array<InnerS, 8> a;
};
struct OuterS {
@@ -24,7 +33,7 @@
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
- s1.s2.a.arr[(*(tint_symbol_1)).i] = v;
+ s1.s2.a[(*(tint_symbol_1)).i] = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.msl
index 766be46..bccd603 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.msl
@@ -1,16 +1,25 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
-struct tint_array_wrapper {
- uint arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<uint, 8> a1;
};
uint f(uint i) {
@@ -20,8 +29,8 @@
kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
OuterS s1 = {};
float3 v = 0.0f;
- v[s1.a1.arr[(*(tint_symbol_2)).i]] = 1.0f;
- uint const tint_symbol_1 = f(s1.a1.arr[(*(tint_symbol_2)).i]);
+ v[s1.a1[(*(tint_symbol_2)).i]] = 1.0f;
+ uint const tint_symbol_1 = f(s1.a1[(*(tint_symbol_2)).i]);
v[tint_symbol_1] = 1.0f;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.msl
index 2f71f6e..573c567 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,19 +22,15 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<InnerS, 8> a1;
};
kernel void tint_symbol(const constant Uniforms* tint_symbol_1 [[buffer(0)]]) {
InnerS v = {};
OuterS s1 = {};
uint const p_save = (*(tint_symbol_1)).i;
- s1.a1.arr[p_save] = v;
+ s1.a1[p_save] = v;
return;
}
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.msl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.msl
index 6ceb36f..9d025d3 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.msl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct Uniforms {
/* 0x0000 */ uint i;
};
@@ -9,17 +22,13 @@
int v;
};
-struct tint_array_wrapper {
- InnerS arr[8];
-};
-
struct OuterS {
- tint_array_wrapper a1;
+ tint_array<InnerS, 8> a1;
};
void f(thread OuterS* const p, const constant Uniforms* const tint_symbol_1) {
InnerS v = {};
- (*(p)).a1.arr[(*(tint_symbol_1)).i] = v;
+ (*(p)).a1[(*(tint_symbol_1)).i] = v;
}
kernel void tint_symbol(const constant Uniforms* tint_symbol_2 [[buffer(0)]]) {
diff --git a/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.msl b/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.msl
index 2f29265..90a2b8d 100644
--- a/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.msl
+++ b/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
- int arr[1];
+ tint_array<int, 1> arr;
};
kernel void tint_symbol() {
diff --git a/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.msl b/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.msl
index 2f29265..90a2b8d 100644
--- a/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.msl
+++ b/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.msl
@@ -1,8 +1,21 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
- int arr[1];
+ tint_array<int, 1> arr;
};
kernel void tint_symbol() {
diff --git a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl
index 6a6d978..26fb806 100644
--- a/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl
+++ b/test/tint/statements/compound_assign/complex_lhs.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- tint_array_wrapper a;
+ tint_array<int4, 4> a;
};
int foo(thread int* const tint_symbol_4) {
@@ -24,6 +33,6 @@
int const tint_symbol_3 = foo(tint_symbol_6);
int const tint_symbol_1_save = tint_symbol_3;
int const tint_symbol_2 = bar(tint_symbol_6);
- x.a.arr[tint_symbol_1_save][tint_symbol_2] = as_type<int>((as_type<uint>(x.a.arr[tint_symbol_1_save][tint_symbol_2]) + as_type<uint>(5)));
+ x.a[tint_symbol_1_save][tint_symbol_2] = as_type<int>((as_type<uint>(x.a[tint_symbol_1_save][tint_symbol_2]) + as_type<uint>(5)));
}
diff --git a/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl b/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl
index 4fb8c50..36309e9 100644
--- a/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl
+++ b/test/tint/statements/compound_assign/for_loop.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
int a;
float4 b;
@@ -22,19 +35,15 @@
return 1;
}
-struct tint_array_wrapper {
- float arr[4];
-};
-
void foo(thread uint* const tint_symbol_8) {
- tint_array_wrapper a = {.arr={}};
+ tint_array<float, 4> a = tint_array<float, 4>{};
int const tint_symbol_2 = idx1(tint_symbol_8);
int const tint_symbol_save = tint_symbol_2;
{
- a.arr[tint_symbol_save] = (a.arr[tint_symbol_save] * 2.0f);
+ a[tint_symbol_save] = (a[tint_symbol_save] * 2.0f);
while (true) {
int const tint_symbol_3 = idx2(tint_symbol_8);
- if (!((a.arr[tint_symbol_3] < 10.0f))) {
+ if (!((a[tint_symbol_3] < 10.0f))) {
break;
}
{
@@ -42,7 +51,7 @@
{
int const tint_symbol_4 = idx3(tint_symbol_8);
int const tint_symbol_1_save = tint_symbol_4;
- a.arr[tint_symbol_1_save] = (a.arr[tint_symbol_1_save] + 1.0f);
+ a[tint_symbol_1_save] = (a[tint_symbol_1_save] + 1.0f);
}
}
}
diff --git a/test/tint/statements/decrement/array_element.wgsl.expected.msl b/test/tint/statements/decrement/array_element.wgsl.expected.msl
index 03752fb..56896d1 100644
--- a/test/tint/statements/decrement/array_element.wgsl.expected.msl
+++ b/test/tint/statements/decrement/array_element.wgsl.expected.msl
@@ -1,7 +1,20 @@
#include <metal_stdlib>
using namespace metal;
-void tint_symbol(device uint (*const tint_symbol_2)[1]) {
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+void tint_symbol(device tint_array<uint, 1>* const tint_symbol_2) {
(*(tint_symbol_2))[1] = ((*(tint_symbol_2))[1] - 1u);
}
diff --git a/test/tint/statements/decrement/complex.wgsl.expected.msl b/test/tint/statements/decrement/complex.wgsl.expected.msl
index e7e4a6c..ece89e4 100644
--- a/test/tint/statements/decrement/complex.wgsl.expected.msl
+++ b/test/tint/statements/decrement/complex.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- /* 0x0000 */ tint_array_wrapper a;
+ /* 0x0000 */ tint_array<int4, 4> a;
};
int idx1(thread uint* const tint_symbol_10) {
@@ -39,14 +48,14 @@
return 2;
}
-void tint_symbol_1(thread uint* const tint_symbol_16, device S (*const tint_symbol_17)[1]) {
+void tint_symbol_1(thread uint* const tint_symbol_16, device tint_array<S, 1>* const tint_symbol_17) {
int const tint_symbol_6 = idx1(tint_symbol_16);
int const tint_symbol_7 = idx2(tint_symbol_16);
int const tint_symbol_2_save = tint_symbol_6;
int const tint_symbol_2_save_1 = tint_symbol_7;
int const tint_symbol_3 = idx3(tint_symbol_16);
{
- (*(tint_symbol_17))[tint_symbol_2_save].a.arr[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_2_save].a.arr[tint_symbol_2_save_1][tint_symbol_3]) - as_type<uint>(1)));
+ (*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3]) - as_type<uint>(1)));
while (true) {
if (!((*(tint_symbol_16) < 10u))) {
break;
@@ -59,7 +68,7 @@
int const tint_symbol_4_save = tint_symbol_8;
int const tint_symbol_4_save_1 = tint_symbol_9;
int const tint_symbol_5 = idx6(tint_symbol_16);
- (*(tint_symbol_17))[tint_symbol_4_save].a.arr[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_4_save].a.arr[tint_symbol_4_save_1][tint_symbol_5]) - as_type<uint>(1)));
+ (*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5]) - as_type<uint>(1)));
}
}
}
diff --git a/test/tint/statements/for/condition/array_ctor.wgsl.expected.msl b/test/tint/statements/for/condition/array_ctor.wgsl.expected.msl
index 5aefd59..ffacf97 100644
--- a/test/tint/statements/for/condition/array_ctor.wgsl.expected.msl
+++ b/test/tint/statements/for/condition/array_ctor.wgsl.expected.msl
@@ -1,15 +1,24 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[1];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void f() {
int i = 0;
while (true) {
- tint_array_wrapper const tint_symbol = {.arr={1}};
- if (!((i < tint_symbol.arr[0]))) {
+ tint_array<int, 1> const tint_symbol = tint_array<int, 1>{1};
+ if (!((i < 1))) {
break;
}
{
diff --git a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.msl b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.msl
index ac6ffc2..e596e14 100644
--- a/test/tint/statements/for/continuing/array_ctor.wgsl.expected.msl
+++ b/test/tint/statements/for/continuing/array_ctor.wgsl.expected.msl
@@ -1,8 +1,17 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[1];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void f() {
@@ -14,8 +23,8 @@
{
}
{
- tint_array_wrapper const tint_symbol = {.arr={1}};
- i = as_type<int>((as_type<uint>(i) + as_type<uint>(tint_symbol.arr[0])));
+ tint_array<int, 1> const tint_symbol = tint_array<int, 1>{1};
+ i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)));
}
}
}
diff --git a/test/tint/statements/for/initializer/array_ctor.wgsl.expected.msl b/test/tint/statements/for/initializer/array_ctor.wgsl.expected.msl
index aa3d065..f729fc7 100644
--- a/test/tint/statements/for/initializer/array_ctor.wgsl.expected.msl
+++ b/test/tint/statements/for/initializer/array_ctor.wgsl.expected.msl
@@ -1,13 +1,22 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- int arr[1];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
void f() {
- tint_array_wrapper const tint_symbol = {.arr={1}};
- for(int i = tint_symbol.arr[0]; false; ) {
+ tint_array<int, 1> const tint_symbol = tint_array<int, 1>{1};
+ for(int i = 1; false; ) {
}
}
diff --git a/test/tint/statements/increment/array_element.wgsl.expected.msl b/test/tint/statements/increment/array_element.wgsl.expected.msl
index 0347508..4d41bf9 100644
--- a/test/tint/statements/increment/array_element.wgsl.expected.msl
+++ b/test/tint/statements/increment/array_element.wgsl.expected.msl
@@ -1,7 +1,20 @@
#include <metal_stdlib>
using namespace metal;
-void tint_symbol(device uint (*const tint_symbol_2)[1]) {
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+void tint_symbol(device tint_array<uint, 1>* const tint_symbol_2) {
(*(tint_symbol_2))[1] = ((*(tint_symbol_2))[1] + 1u);
}
diff --git a/test/tint/statements/increment/complex.wgsl.expected.msl b/test/tint/statements/increment/complex.wgsl.expected.msl
index fbc0f9c..3f31988 100644
--- a/test/tint/statements/increment/complex.wgsl.expected.msl
+++ b/test/tint/statements/increment/complex.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct tint_array_wrapper {
- /* 0x0000 */ int4 arr[4];
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
struct S {
- /* 0x0000 */ tint_array_wrapper a;
+ /* 0x0000 */ tint_array<int4, 4> a;
};
int idx1(thread uint* const tint_symbol_10) {
@@ -39,14 +48,14 @@
return 2;
}
-void tint_symbol_1(thread uint* const tint_symbol_16, device S (*const tint_symbol_17)[1]) {
+void tint_symbol_1(thread uint* const tint_symbol_16, device tint_array<S, 1>* const tint_symbol_17) {
int const tint_symbol_6 = idx1(tint_symbol_16);
int const tint_symbol_7 = idx2(tint_symbol_16);
int const tint_symbol_2_save = tint_symbol_6;
int const tint_symbol_2_save_1 = tint_symbol_7;
int const tint_symbol_3 = idx3(tint_symbol_16);
{
- (*(tint_symbol_17))[tint_symbol_2_save].a.arr[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_2_save].a.arr[tint_symbol_2_save_1][tint_symbol_3]) + as_type<uint>(1)));
+ (*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3]) + as_type<uint>(1)));
while (true) {
if (!((*(tint_symbol_16) < 10u))) {
break;
@@ -59,7 +68,7 @@
int const tint_symbol_4_save = tint_symbol_8;
int const tint_symbol_4_save_1 = tint_symbol_9;
int const tint_symbol_5 = idx6(tint_symbol_16);
- (*(tint_symbol_17))[tint_symbol_4_save].a.arr[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_4_save].a.arr[tint_symbol_4_save_1][tint_symbol_5]) + as_type<uint>(1)));
+ (*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5]) + as_type<uint>(1)));
}
}
}
diff --git a/test/tint/struct/type_constructor.wgsl.expected.msl b/test/tint/struct/type_constructor.wgsl.expected.msl
index d0449b8..6e691c0 100644
--- a/test/tint/struct/type_constructor.wgsl.expected.msl
+++ b/test/tint/struct/type_constructor.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S1 {
int a;
int b;
@@ -19,16 +32,8 @@
S2 i;
};
-struct tint_array_wrapper {
- int arr[2];
-};
-
struct T {
- tint_array_wrapper a;
-};
-
-struct tint_array_wrapper_1 {
- T arr[2];
+ tint_array<int, 2> a;
};
kernel void tint_symbol() {
@@ -58,15 +63,15 @@
S1 const tint_symbol_12 = {.a=2, .b=42, .c=as_type<int>((as_type<uint>(42) + as_type<uint>(1))), .d=nested_nonempty.i.f.d};
S2 const tint_symbol_13 = {.e=1, .f=tint_symbol_12};
S1 const subexpr_nested_nonempty_with_expr = tint_symbol_13.f;
- tint_array_wrapper_1 const aosoa_empty = {.arr={}};
- tint_array_wrapper const tint_symbol_14 = {.arr={1, 2}};
+ tint_array<T, 2> const aosoa_empty = tint_array<T, 2>{};
+ tint_array<int, 2> const tint_symbol_14 = tint_array<int, 2>{1, 2};
T const tint_symbol_15 = {.a=tint_symbol_14};
- tint_array_wrapper const tint_symbol_16 = {.arr={3, 4}};
+ tint_array<int, 2> const tint_symbol_16 = tint_array<int, 2>{3, 4};
T const tint_symbol_17 = {.a=tint_symbol_16};
- tint_array_wrapper_1 const aosoa_nonempty = {.arr={tint_symbol_15, tint_symbol_17}};
- tint_array_wrapper const tint_symbol_18 = {.arr={1, as_type<int>((as_type<uint>(aosoa_nonempty.arr[0].a.arr[0]) + as_type<uint>(1)))}};
+ tint_array<T, 2> const aosoa_nonempty = tint_array<T, 2>{tint_symbol_15, tint_symbol_17};
+ tint_array<int, 2> const tint_symbol_18 = tint_array<int, 2>{1, as_type<int>((as_type<uint>(aosoa_nonempty[0].a[0]) + as_type<uint>(1)))};
T const tint_symbol_19 = {.a=tint_symbol_18};
- tint_array_wrapper_1 const aosoa_nonempty_with_expr = {.arr={tint_symbol_19, aosoa_nonempty.arr[1]}};
+ tint_array<T, 2> const aosoa_nonempty_with_expr = tint_array<T, 2>{tint_symbol_19, aosoa_nonempty[1]};
return;
}
diff --git a/test/tint/types/function_scope_declarations.wgsl.expected.msl b/test/tint/types/function_scope_declarations.wgsl.expected.msl
index 799d28a..a7cd381 100644
--- a/test/tint/types/function_scope_declarations.wgsl.expected.msl
+++ b/test/tint/types/function_scope_declarations.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct S {
- float a;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- float arr[4];
+struct S {
+ float a;
};
kernel void tint_symbol() {
@@ -26,8 +35,8 @@
float4 const v4f32_let = float4(0.0f);
float2x3 m2x3_var = float2x3(float3(0.0f), float3(0.0f));
float3x4 const m3x4_let = float3x4(float4(0.0f), float4(0.0f), float4(0.0f));
- tint_array_wrapper arr_var = {.arr={}};
- tint_array_wrapper const arr_let = {.arr={}};
+ tint_array<float, 4> arr_var = tint_array<float, 4>{};
+ tint_array<float, 4> const arr_let = tint_array<float, 4>{};
S struct_var = {};
S const struct_let = {};
return;
diff --git a/test/tint/types/module_scope_let.wgsl.expected.msl b/test/tint/types/module_scope_let.wgsl.expected.msl
index 33ba095..a48f863 100644
--- a/test/tint/types/module_scope_let.wgsl.expected.msl
+++ b/test/tint/types/module_scope_let.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
float a;
};
@@ -21,11 +34,7 @@
constant float3x4 m3x4_let = float3x4(float4(0.0f), float4(0.0f), float4(0.0f));
-struct tint_array_wrapper {
- float arr[4];
-};
-
-constant tint_array_wrapper arr_let = {.arr={}};
+constant tint_array<float, 4> arr_let = tint_array<float, 4>{};
constant S struct_let = {};
diff --git a/test/tint/types/module_scope_var.wgsl.expected.msl b/test/tint/types/module_scope_var.wgsl.expected.msl
index b4cb6cd..50d0091 100644
--- a/test/tint/types/module_scope_var.wgsl.expected.msl
+++ b/test/tint/types/module_scope_var.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct S {
- float a;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- float arr[4];
+struct S {
+ float a;
};
kernel void tint_symbol() {
@@ -18,7 +27,7 @@
thread uint3 tint_symbol_8 = 0u;
thread float4 tint_symbol_9 = 0.0f;
thread float2x3 tint_symbol_10 = float2x3(0.0f);
- thread tint_array_wrapper tint_symbol_11 = {};
+ thread tint_array<float, 4> tint_symbol_11 = {};
thread S tint_symbol_12 = {};
tint_symbol_3 = false;
tint_symbol_4 = 0;
@@ -28,7 +37,7 @@
tint_symbol_8 = uint3(0u);
tint_symbol_9 = float4(0.0f);
tint_symbol_10 = float2x3(float3(0.0f), float3(0.0f));
- tint_array_wrapper const tint_symbol_1 = {.arr={}};
+ tint_array<float, 4> const tint_symbol_1 = tint_array<float, 4>{};
tint_symbol_11 = tint_symbol_1;
S const tint_symbol_2 = {};
tint_symbol_12 = tint_symbol_2;
diff --git a/test/tint/types/module_scope_var_initializers.wgsl.expected.msl b/test/tint/types/module_scope_var_initializers.wgsl.expected.msl
index 815f9fb..e56e653 100644
--- a/test/tint/types/module_scope_var_initializers.wgsl.expected.msl
+++ b/test/tint/types/module_scope_var_initializers.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct S {
- float a;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- float arr[4];
+struct S {
+ float a;
};
kernel void tint_symbol() {
@@ -18,7 +27,7 @@
thread uint3 tint_symbol_8 = uint3(0u);
thread float4 tint_symbol_9 = float4(0.0f);
thread float2x3 tint_symbol_10 = float2x3(float3(0.0f), float3(0.0f));
- thread tint_array_wrapper tint_symbol_11 = {.arr={}};
+ thread tint_array<float, 4> tint_symbol_11 = tint_array<float, 4>{};
thread S tint_symbol_12 = {};
tint_symbol_3 = false;
tint_symbol_4 = 0;
@@ -28,7 +37,7 @@
tint_symbol_8 = uint3(0u);
tint_symbol_9 = float4(0.0f);
tint_symbol_10 = float2x3(float3(0.0f), float3(0.0f));
- tint_array_wrapper const tint_symbol_1 = {.arr={}};
+ tint_array<float, 4> const tint_symbol_1 = tint_array<float, 4>{};
tint_symbol_11 = tint_symbol_1;
S const tint_symbol_2 = {};
tint_symbol_12 = tint_symbol_2;
diff --git a/test/tint/types/parameters.wgsl.expected.msl b/test/tint/types/parameters.wgsl.expected.msl
index 3c1db25..54ad948 100644
--- a/test/tint/types/parameters.wgsl.expected.msl
+++ b/test/tint/types/parameters.wgsl.expected.msl
@@ -1,15 +1,24 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
float a;
};
-struct tint_array_wrapper {
- float arr[4];
-};
-
-void foo(bool param_bool, int param_i32, uint param_u32, float param_f32, int2 param_v2i32, uint3 param_v3u32, float4 param_v4f32, float2x3 param_m2x3, tint_array_wrapper param_arr, S param_struct, thread float* const param_ptr_f32, thread float4* const param_ptr_vec, thread tint_array_wrapper* const param_ptr_arr) {
+void foo(bool param_bool, int param_i32, uint param_u32, float param_f32, int2 param_v2i32, uint3 param_v3u32, float4 param_v4f32, float2x3 param_m2x3, tint_array<float, 4> param_arr, S param_struct, thread float* const param_ptr_f32, thread float4* const param_ptr_vec, thread tint_array<float, 4>* const param_ptr_arr) {
}
kernel void tint_symbol() {
diff --git a/test/tint/types/return_types.wgsl.expected.msl b/test/tint/types/return_types.wgsl.expected.msl
index 769204e..a0cf7b6 100644
--- a/test/tint/types/return_types.wgsl.expected.msl
+++ b/test/tint/types/return_types.wgsl.expected.msl
@@ -1,6 +1,19 @@
#include <metal_stdlib>
using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
struct S {
float a;
};
@@ -37,12 +50,8 @@
return float2x3(float3(0.0f), float3(0.0f));
}
-struct tint_array_wrapper {
- float arr[4];
-};
-
-tint_array_wrapper ret_arr() {
- tint_array_wrapper const tint_symbol_1 = {.arr={}};
+tint_array<float, 4> ret_arr() {
+ tint_array<float, 4> const tint_symbol_1 = tint_array<float, 4>{};
return tint_symbol_1;
}
diff --git a/test/tint/types/struct_members.wgsl.expected.msl b/test/tint/types/struct_members.wgsl.expected.msl
index a43d5e0..03c6b97 100644
--- a/test/tint/types/struct_members.wgsl.expected.msl
+++ b/test/tint/types/struct_members.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct S_inner {
- float a;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- float arr[4];
+struct S_inner {
+ float a;
};
struct S {
@@ -18,7 +27,7 @@
uint3 member_v3u32;
float4 member_v4f32;
float2x3 member_m2x3;
- tint_array_wrapper member_arr;
+ tint_array<float, 4> member_arr;
S_inner member_struct;
};
diff --git a/test/tint/var/inferred/function.wgsl.expected.msl b/test/tint/var/inferred/function.wgsl.expected.msl
index 8eebc86..8809684 100644
--- a/test/tint/var/inferred/function.wgsl.expected.msl
+++ b/test/tint/var/inferred/function.wgsl.expected.msl
@@ -1,12 +1,21 @@
#include <metal_stdlib>
using namespace metal;
-struct MyStruct {
- float f1;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
};
-struct tint_array_wrapper {
- float arr[10];
+struct MyStruct {
+ float f1;
};
int ret_i32() {
@@ -26,8 +35,8 @@
return tint_symbol_2;
}
-tint_array_wrapper ret_MyArray() {
- tint_array_wrapper const tint_symbol_3 = {.arr={}};
+tint_array<float, 10> ret_MyArray() {
+ tint_array<float, 10> const tint_symbol_3 = tint_array<float, 10>{};
return tint_symbol_3;
}
@@ -40,13 +49,13 @@
float3 v6 = float3(1.0f);
float3x3 v7 = float3x3(v6, v6, v6);
MyStruct v8 = {.f1=1.0f};
- tint_array_wrapper v9 = {.arr={}};
+ tint_array<float, 10> v9 = tint_array<float, 10>{};
int v10 = ret_i32();
uint v11 = ret_u32();
float v12 = ret_f32();
MyStruct v13 = ret_MyStruct();
MyStruct v14 = ret_MyStruct();
- tint_array_wrapper v15 = ret_MyArray();
+ tint_array<float, 10> v15 = ret_MyArray();
}
struct tint_symbol_1 {
diff --git a/test/tint/var/initialization/function/array.wgsl b/test/tint/var/initialization/function/array.wgsl
deleted file mode 100644
index 7b33431..0000000
--- a/test/tint/var/initialization/function/array.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn main() {
- var v : array<i32, 3>;
- _ = v;
-}
diff --git a/test/tint/var/initialization/function/array.wgsl.expected.glsl b/test/tint/var/initialization/function/array.wgsl.expected.glsl
deleted file mode 100644
index 645b82c..0000000
--- a/test/tint/var/initialization/function/array.wgsl.expected.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-#version 310 es
-
-void tint_symbol() {
- int v[3] = int[3](0, 0, 0);
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
- tint_symbol();
- return;
-}
diff --git a/test/tint/var/initialization/function/array.wgsl.expected.hlsl b/test/tint/var/initialization/function/array.wgsl.expected.hlsl
deleted file mode 100644
index 7f979a0..0000000
--- a/test/tint/var/initialization/function/array.wgsl.expected.hlsl
+++ /dev/null
@@ -1,5 +0,0 @@
-[numthreads(1, 1, 1)]
-void main() {
- int v[3] = (int[3])0;
- return;
-}
diff --git a/test/tint/var/initialization/function/array.wgsl.expected.msl b/test/tint/var/initialization/function/array.wgsl.expected.msl
deleted file mode 100644
index f441184..0000000
--- a/test/tint/var/initialization/function/array.wgsl.expected.msl
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-struct tint_array_wrapper {
- int arr[3];
-};
-
-kernel void tint_symbol() {
- tint_array_wrapper v = {};
- return;
-}
-
diff --git a/test/tint/var/initialization/function/array.wgsl.expected.wgsl b/test/tint/var/initialization/function/array.wgsl.expected.wgsl
deleted file mode 100644
index fc5ed43..0000000
--- a/test/tint/var/initialization/function/array.wgsl.expected.wgsl
+++ /dev/null
@@ -1,5 +0,0 @@
-@compute @workgroup_size(1)
-fn main() {
- var v : array<i32, 3>;
- _ = v;
-}
diff --git a/test/tint/var/initialization/function/array/array_i32.wgsl b/test/tint/var/initialization/function/array/array_i32.wgsl
new file mode 100644
index 0000000..80db613
--- /dev/null
+++ b/test/tint/var/initialization/function/array/array_i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn main() {
+ var zero : array<array<i32, 3>, 2>;
+ var init : array<array<i32, 3>, 2> = array<array<i32, 3>, 2>(array<i32, 3>(1, 2, 3), array<i32, 3>(4, 5, 6));
+}
diff --git a/test/tint/var/initialization/function/array/array_i32.wgsl.expected.glsl b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.glsl
new file mode 100644
index 0000000..132ba50
--- /dev/null
+++ b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.glsl
@@ -0,0 +1,14 @@
+#version 310 es
+
+void tint_symbol() {
+ int zero[2][3] = int[2][3](int[3](0, 0, 0), int[3](0, 0, 0));
+ int tint_symbol_1[3] = int[3](1, 2, 3);
+ int tint_symbol_2[3] = int[3](4, 5, 6);
+ int init[2][3] = int[2][3](tint_symbol_1, tint_symbol_2);
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+ tint_symbol();
+ return;
+}
diff --git a/test/tint/var/initialization/function/array/array_i32.wgsl.expected.hlsl b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..88d2dd3
--- /dev/null
+++ b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.hlsl
@@ -0,0 +1,8 @@
+[numthreads(1, 1, 1)]
+void main() {
+ int zero[2][3] = (int[2][3])0;
+ const int tint_symbol[3] = {1, 2, 3};
+ const int tint_symbol_1[3] = {4, 5, 6};
+ int init[2][3] = {tint_symbol, tint_symbol_1};
+ return;
+}
diff --git a/test/tint/var/initialization/function/array/array_i32.wgsl.expected.msl b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.msl
new file mode 100644
index 0000000..7ad097e
--- /dev/null
+++ b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.msl
@@ -0,0 +1,24 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+kernel void tint_symbol() {
+ tint_array<tint_array<int, 3>, 2> zero = {};
+ tint_array<int, 3> const tint_symbol_1 = tint_array<int, 3>{1, 2, 3};
+ tint_array<int, 3> const tint_symbol_2 = tint_array<int, 3>{4, 5, 6};
+ tint_array<tint_array<int, 3>, 2> init = tint_array<tint_array<int, 3>, 2>{tint_symbol_1, tint_symbol_2};
+ return;
+}
+
diff --git a/test/tint/var/initialization/function/array/array_i32.wgsl.expected.spvasm b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..12e87cc
--- /dev/null
+++ b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.spvasm
@@ -0,0 +1,40 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 24
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpName %main "main"
+ OpName %zero "zero"
+ OpName %init "init"
+ OpDecorate %_arr_int_uint_3 ArrayStride 4
+ OpDecorate %_arr__arr_int_uint_3_uint_2 ArrayStride 12
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+ %uint_2 = OpConstant %uint 2
+%_arr__arr_int_uint_3_uint_2 = OpTypeArray %_arr_int_uint_3 %uint_2
+%_ptr_Function__arr__arr_int_uint_3_uint_2 = OpTypePointer Function %_arr__arr_int_uint_3_uint_2
+ %13 = OpConstantNull %_arr__arr_int_uint_3_uint_2
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %17 = OpConstantComposite %_arr_int_uint_3 %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %21 = OpConstantComposite %_arr_int_uint_3 %int_4 %int_5 %int_6
+ %22 = OpConstantComposite %_arr__arr_int_uint_3_uint_2 %17 %21
+ %main = OpFunction %void None %1
+ %4 = OpLabel
+ %zero = OpVariable %_ptr_Function__arr__arr_int_uint_3_uint_2 Function %13
+ %init = OpVariable %_ptr_Function__arr__arr_int_uint_3_uint_2 Function %13
+ OpStore %init %22
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/var/initialization/function/array/array_i32.wgsl.expected.wgsl b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..9bf3787
--- /dev/null
+++ b/test/tint/var/initialization/function/array/array_i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn main() {
+ var zero : array<array<i32, 3>, 2>;
+ var init : array<array<i32, 3>, 2> = array<array<i32, 3>, 2>(array<i32, 3>(1, 2, 3), array<i32, 3>(4, 5, 6));
+}
diff --git a/test/tint/var/initialization/function/array/i32.wgsl b/test/tint/var/initialization/function/array/i32.wgsl
new file mode 100644
index 0000000..5e83d39
--- /dev/null
+++ b/test/tint/var/initialization/function/array/i32.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn main() {
+ var zero : array<i32, 3>;
+ var init : array<i32, 3> = array<i32, 3>(1, 2, 3);
+}
diff --git a/test/tint/var/initialization/private/array.wgsl.expected.glsl b/test/tint/var/initialization/function/array/i32.wgsl.expected.glsl
similarity index 69%
rename from test/tint/var/initialization/private/array.wgsl.expected.glsl
rename to test/tint/var/initialization/function/array/i32.wgsl.expected.glsl
index 7bbaf79..8cc2174 100644
--- a/test/tint/var/initialization/private/array.wgsl.expected.glsl
+++ b/test/tint/var/initialization/function/array/i32.wgsl.expected.glsl
@@ -1,7 +1,8 @@
#version 310 es
-int v[3] = int[3](0, 0, 0);
void tint_symbol() {
+ int zero[3] = int[3](0, 0, 0);
+ int init[3] = int[3](1, 2, 3);
}
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/var/initialization/function/array/i32.wgsl.expected.hlsl b/test/tint/var/initialization/function/array/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..93ed2c5
--- /dev/null
+++ b/test/tint/var/initialization/function/array/i32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void main() {
+ int zero[3] = (int[3])0;
+ int init[3] = {1, 2, 3};
+ return;
+}
diff --git a/test/tint/var/initialization/function/array/i32.wgsl.expected.msl b/test/tint/var/initialization/function/array/i32.wgsl.expected.msl
new file mode 100644
index 0000000..e171bf3
--- /dev/null
+++ b/test/tint/var/initialization/function/array/i32.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+kernel void tint_symbol() {
+ tint_array<int, 3> zero = {};
+ tint_array<int, 3> init = tint_array<int, 3>{1, 2, 3};
+ return;
+}
+
diff --git a/test/tint/var/initialization/function/array.wgsl.expected.spvasm b/test/tint/var/initialization/function/array/i32.wgsl.expected.spvasm
similarity index 65%
rename from test/tint/var/initialization/function/array.wgsl.expected.spvasm
rename to test/tint/var/initialization/function/array/i32.wgsl.expected.spvasm
index 2112361..e61c1ab 100644
--- a/test/tint/var/initialization/function/array.wgsl.expected.spvasm
+++ b/test/tint/var/initialization/function/array/i32.wgsl.expected.spvasm
@@ -1,14 +1,15 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
-; Bound: 12
+; Bound: 17
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %main "main"
- OpName %v "v"
+ OpName %zero "zero"
+ OpName %init "init"
OpDecorate %_arr_int_uint_3 ArrayStride 4
%void = OpTypeVoid
%1 = OpTypeFunction %void
@@ -18,8 +19,14 @@
%_arr_int_uint_3 = OpTypeArray %int %uint_3
%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
%11 = OpConstantNull %_arr_int_uint_3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %15 = OpConstantComposite %_arr_int_uint_3 %int_1 %int_2 %int_3
%main = OpFunction %void None %1
%4 = OpLabel
- %v = OpVariable %_ptr_Function__arr_int_uint_3 Function %11
+ %zero = OpVariable %_ptr_Function__arr_int_uint_3 Function %11
+ %init = OpVariable %_ptr_Function__arr_int_uint_3 Function %11
+ OpStore %init %15
OpReturn
OpFunctionEnd
diff --git a/test/tint/var/initialization/function/array/i32.wgsl.expected.wgsl b/test/tint/var/initialization/function/array/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..70f7f20
--- /dev/null
+++ b/test/tint/var/initialization/function/array/i32.wgsl.expected.wgsl
@@ -0,0 +1,5 @@
+@compute @workgroup_size(1)
+fn main() {
+ var zero : array<i32, 3>;
+ var init : array<i32, 3> = array<i32, 3>(1, 2, 3);
+}
diff --git a/test/tint/var/initialization/private/array.wgsl b/test/tint/var/initialization/private/array.wgsl
deleted file mode 100644
index 266e4f2..0000000
--- a/test/tint/var/initialization/private/array.wgsl
+++ /dev/null
@@ -1,6 +0,0 @@
-var<private> v : array<i32, 3>;
-
-@compute @workgroup_size(1)
-fn main() {
- _ = v;
-}
diff --git a/test/tint/var/initialization/private/array.wgsl.expected.hlsl b/test/tint/var/initialization/private/array.wgsl.expected.hlsl
deleted file mode 100644
index 5cedea9..0000000
--- a/test/tint/var/initialization/private/array.wgsl.expected.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-static int v[3] = (int[3])0;
-
-[numthreads(1, 1, 1)]
-void main() {
- return;
-}
diff --git a/test/tint/var/initialization/private/array.wgsl.expected.msl b/test/tint/var/initialization/private/array.wgsl.expected.msl
deleted file mode 100644
index e80edf9..0000000
--- a/test/tint/var/initialization/private/array.wgsl.expected.msl
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-struct tint_array_wrapper {
- int arr[3];
-};
-
-kernel void tint_symbol() {
- return;
-}
-
diff --git a/test/tint/var/initialization/private/array.wgsl.expected.spvasm b/test/tint/var/initialization/private/array.wgsl.expected.spvasm
deleted file mode 100644
index 90c0ea5..0000000
--- a/test/tint/var/initialization/private/array.wgsl.expected.spvasm
+++ /dev/null
@@ -1,25 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 12
-; Schema: 0
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %main "main"
- OpExecutionMode %main LocalSize 1 1 1
- OpName %v "v"
- OpName %main "main"
- OpDecorate %_arr_int_uint_3 ArrayStride 4
- %int = OpTypeInt 32 1
- %uint = OpTypeInt 32 0
- %uint_3 = OpConstant %uint 3
-%_arr_int_uint_3 = OpTypeArray %int %uint_3
-%_ptr_Private__arr_int_uint_3 = OpTypePointer Private %_arr_int_uint_3
- %7 = OpConstantNull %_arr_int_uint_3
- %v = OpVariable %_ptr_Private__arr_int_uint_3 Private %7
- %void = OpTypeVoid
- %8 = OpTypeFunction %void
- %main = OpFunction %void None %8
- %11 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/var/initialization/private/array.wgsl.expected.wgsl b/test/tint/var/initialization/private/array.wgsl.expected.wgsl
deleted file mode 100644
index 478777e..0000000
--- a/test/tint/var/initialization/private/array.wgsl.expected.wgsl
+++ /dev/null
@@ -1,6 +0,0 @@
-var<private> v : array<i32, 3>;
-
-@compute @workgroup_size(1)
-fn main() {
- _ = v;
-}
diff --git a/test/tint/var/initialization/private/array/array_i32.wgsl b/test/tint/var/initialization/private/array/array_i32.wgsl
new file mode 100644
index 0000000..91547ae
--- /dev/null
+++ b/test/tint/var/initialization/private/array/array_i32.wgsl
@@ -0,0 +1,8 @@
+var<private> zero : array<array<i32, 3>, 2>;
+var<private> init : array<array<i32, 3>, 2> = array<array<i32, 3>, 2>(array<i32, 3>(1, 2, 3), array<i32, 3>(4, 5, 6));
+
+@compute @workgroup_size(1)
+fn main() {
+ var v0 = zero;
+ var v1 = init;
+}
diff --git a/test/tint/var/initialization/private/array/array_i32.wgsl.expected.glsl b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.glsl
new file mode 100644
index 0000000..9ca3db0
--- /dev/null
+++ b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.glsl
@@ -0,0 +1,14 @@
+#version 310 es
+
+int zero[2][3] = int[2][3](int[3](0, 0, 0), int[3](0, 0, 0));
+int init[2][3] = int[2][3](int[3](1, 2, 3), int[3](4, 5, 6));
+void tint_symbol() {
+ int v0[2][3] = zero;
+ int v1[2][3] = init;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+ tint_symbol();
+ return;
+}
diff --git a/test/tint/var/initialization/private/array/array_i32.wgsl.expected.hlsl b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..aa728ab
--- /dev/null
+++ b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.hlsl
@@ -0,0 +1,9 @@
+static int zero[2][3] = (int[2][3])0;
+static int init[2][3] = {{1, 2, 3}, {4, 5, 6}};
+
+[numthreads(1, 1, 1)]
+void main() {
+ int v0[2][3] = zero;
+ int v1[2][3] = init;
+ return;
+}
diff --git a/test/tint/var/initialization/private/array/array_i32.wgsl.expected.msl b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.msl
new file mode 100644
index 0000000..33ba833
--- /dev/null
+++ b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.msl
@@ -0,0 +1,24 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+kernel void tint_symbol() {
+ thread tint_array<tint_array<int, 3>, 2> tint_symbol_1 = {};
+ thread tint_array<tint_array<int, 3>, 2> tint_symbol_2 = tint_array<tint_array<int, 3>, 2>{tint_array<int, 3>{1, 2, 3}, tint_array<int, 3>{4, 5, 6}};
+ tint_array<tint_array<int, 3>, 2> v0 = tint_symbol_1;
+ tint_array<tint_array<int, 3>, 2> v1 = tint_symbol_2;
+ return;
+}
+
diff --git a/test/tint/var/initialization/private/array/array_i32.wgsl.expected.spvasm b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..81e5d8b
--- /dev/null
+++ b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 29
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpName %zero "zero"
+ OpName %init "init"
+ OpName %main "main"
+ OpName %v0 "v0"
+ OpName %v1 "v1"
+ OpDecorate %_arr_int_uint_3 ArrayStride 4
+ OpDecorate %_arr__arr_int_uint_3_uint_2 ArrayStride 12
+ %int = OpTypeInt 32 1
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+ %uint_2 = OpConstant %uint 2
+%_arr__arr_int_uint_3_uint_2 = OpTypeArray %_arr_int_uint_3 %uint_2
+%_ptr_Private__arr__arr_int_uint_3_uint_2 = OpTypePointer Private %_arr__arr_int_uint_3_uint_2
+ %9 = OpConstantNull %_arr__arr_int_uint_3_uint_2
+ %zero = OpVariable %_ptr_Private__arr__arr_int_uint_3_uint_2 Private %9
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %13 = OpConstantComposite %_arr_int_uint_3 %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %17 = OpConstantComposite %_arr_int_uint_3 %int_4 %int_5 %int_6
+ %18 = OpConstantComposite %_arr__arr_int_uint_3_uint_2 %13 %17
+ %init = OpVariable %_ptr_Private__arr__arr_int_uint_3_uint_2 Private %18
+ %void = OpTypeVoid
+ %20 = OpTypeFunction %void
+%_ptr_Function__arr__arr_int_uint_3_uint_2 = OpTypePointer Function %_arr__arr_int_uint_3_uint_2
+ %main = OpFunction %void None %20
+ %23 = OpLabel
+ %v0 = OpVariable %_ptr_Function__arr__arr_int_uint_3_uint_2 Function %9
+ %v1 = OpVariable %_ptr_Function__arr__arr_int_uint_3_uint_2 Function %9
+ %24 = OpLoad %_arr__arr_int_uint_3_uint_2 %zero
+ OpStore %v0 %24
+ %27 = OpLoad %_arr__arr_int_uint_3_uint_2 %init
+ OpStore %v1 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/var/initialization/private/array/array_i32.wgsl.expected.wgsl b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..4480574
--- /dev/null
+++ b/test/tint/var/initialization/private/array/array_i32.wgsl.expected.wgsl
@@ -0,0 +1,9 @@
+var<private> zero : array<array<i32, 3>, 2>;
+
+var<private> init : array<array<i32, 3>, 2> = array<array<i32, 3>, 2>(array<i32, 3>(1, 2, 3), array<i32, 3>(4, 5, 6));
+
+@compute @workgroup_size(1)
+fn main() {
+ var v0 = zero;
+ var v1 = init;
+}
diff --git a/test/tint/var/initialization/private/array/i32.wgsl b/test/tint/var/initialization/private/array/i32.wgsl
new file mode 100644
index 0000000..c17920a
--- /dev/null
+++ b/test/tint/var/initialization/private/array/i32.wgsl
@@ -0,0 +1,8 @@
+var<private> zero : array<i32, 3>;
+var<private> init : array<i32, 3> = array<i32, 3>(1, 2, 3);
+
+@compute @workgroup_size(1)
+fn main() {
+ var v0 = zero;
+ var v1 = init;
+}
diff --git a/test/tint/var/initialization/private/array/i32.wgsl.expected.glsl b/test/tint/var/initialization/private/array/i32.wgsl.expected.glsl
new file mode 100644
index 0000000..956d196
--- /dev/null
+++ b/test/tint/var/initialization/private/array/i32.wgsl.expected.glsl
@@ -0,0 +1,14 @@
+#version 310 es
+
+int zero[3] = int[3](0, 0, 0);
+int init[3] = int[3](1, 2, 3);
+void tint_symbol() {
+ int v0[3] = zero;
+ int v1[3] = init;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+ tint_symbol();
+ return;
+}
diff --git a/test/tint/var/initialization/private/array/i32.wgsl.expected.hlsl b/test/tint/var/initialization/private/array/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e4cc4bc
--- /dev/null
+++ b/test/tint/var/initialization/private/array/i32.wgsl.expected.hlsl
@@ -0,0 +1,9 @@
+static int zero[3] = (int[3])0;
+static int init[3] = {1, 2, 3};
+
+[numthreads(1, 1, 1)]
+void main() {
+ int v0[3] = zero;
+ int v1[3] = init;
+ return;
+}
diff --git a/test/tint/var/initialization/private/array/i32.wgsl.expected.msl b/test/tint/var/initialization/private/array/i32.wgsl.expected.msl
new file mode 100644
index 0000000..60dac04
--- /dev/null
+++ b/test/tint/var/initialization/private/array/i32.wgsl.expected.msl
@@ -0,0 +1,24 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+kernel void tint_symbol() {
+ thread tint_array<int, 3> tint_symbol_1 = {};
+ thread tint_array<int, 3> tint_symbol_2 = tint_array<int, 3>{1, 2, 3};
+ tint_array<int, 3> v0 = tint_symbol_1;
+ tint_array<int, 3> v1 = tint_symbol_2;
+ return;
+}
+
diff --git a/test/tint/var/initialization/private/array/i32.wgsl.expected.spvasm b/test/tint/var/initialization/private/array/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..0ca3cd6
--- /dev/null
+++ b/test/tint/var/initialization/private/array/i32.wgsl.expected.spvasm
@@ -0,0 +1,40 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 22
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpName %zero "zero"
+ OpName %init "init"
+ OpName %main "main"
+ OpName %v0 "v0"
+ OpName %v1 "v1"
+ OpDecorate %_arr_int_uint_3 ArrayStride 4
+ %int = OpTypeInt 32 1
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Private__arr_int_uint_3 = OpTypePointer Private %_arr_int_uint_3
+ %7 = OpConstantNull %_arr_int_uint_3
+ %zero = OpVariable %_ptr_Private__arr_int_uint_3 Private %7
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %11 = OpConstantComposite %_arr_int_uint_3 %int_1 %int_2 %int_3
+ %init = OpVariable %_ptr_Private__arr_int_uint_3 Private %11
+ %void = OpTypeVoid
+ %13 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+ %main = OpFunction %void None %13
+ %16 = OpLabel
+ %v0 = OpVariable %_ptr_Function__arr_int_uint_3 Function %7
+ %v1 = OpVariable %_ptr_Function__arr_int_uint_3 Function %7
+ %17 = OpLoad %_arr_int_uint_3 %zero
+ OpStore %v0 %17
+ %20 = OpLoad %_arr_int_uint_3 %init
+ OpStore %v1 %20
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/var/initialization/private/array/i32.wgsl.expected.wgsl b/test/tint/var/initialization/private/array/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..59f9448
--- /dev/null
+++ b/test/tint/var/initialization/private/array/i32.wgsl.expected.wgsl
@@ -0,0 +1,9 @@
+var<private> zero : array<i32, 3>;
+
+var<private> init : array<i32, 3> = array<i32, 3>(1, 2, 3);
+
+@compute @workgroup_size(1)
+fn main() {
+ var v0 = zero;
+ var v1 = init;
+}
diff --git a/test/tint/var/initialization/workgroup/array.wgsl b/test/tint/var/initialization/workgroup/array.wgsl
deleted file mode 100644
index f3b6972..0000000
--- a/test/tint/var/initialization/workgroup/array.wgsl
+++ /dev/null
@@ -1,6 +0,0 @@
-var<workgroup> v : array<i32, 3>;
-
-@compute @workgroup_size(1)
-fn main() {
- _ = v;
-}
diff --git a/test/tint/var/initialization/workgroup/array.wgsl.expected.msl b/test/tint/var/initialization/workgroup/array.wgsl.expected.msl
deleted file mode 100644
index 9157d88..0000000
--- a/test/tint/var/initialization/workgroup/array.wgsl.expected.msl
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-struct tint_array_wrapper {
- int arr[3];
-};
-
-void tint_symbol_inner(uint local_invocation_index, threadgroup tint_array_wrapper* const tint_symbol_1) {
- for(uint idx = local_invocation_index; (idx < 3u); idx = (idx + 1u)) {
- uint const i = idx;
- (*(tint_symbol_1)).arr[i] = 0;
- }
- threadgroup_barrier(mem_flags::mem_threadgroup);
-}
-
-kernel void tint_symbol(uint local_invocation_index [[thread_index_in_threadgroup]]) {
- threadgroup tint_array_wrapper tint_symbol_2;
- tint_symbol_inner(local_invocation_index, &(tint_symbol_2));
- return;
-}
-
diff --git a/test/tint/var/initialization/workgroup/array.wgsl.expected.wgsl b/test/tint/var/initialization/workgroup/array.wgsl.expected.wgsl
deleted file mode 100644
index d1e084b..0000000
--- a/test/tint/var/initialization/workgroup/array.wgsl.expected.wgsl
+++ /dev/null
@@ -1,6 +0,0 @@
-var<workgroup> v : array<i32, 3>;
-
-@compute @workgroup_size(1)
-fn main() {
- _ = v;
-}
diff --git a/test/tint/var/initialization/workgroup/array/array_i32.wgsl b/test/tint/var/initialization/workgroup/array/array_i32.wgsl
new file mode 100644
index 0000000..d7ba62c
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/array_i32.wgsl
@@ -0,0 +1,6 @@
+var<workgroup> zero : array<array<i32, 3>, 2>;
+
+@compute @workgroup_size(1)
+fn main() {
+ var v = zero;
+}
diff --git a/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.glsl b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.glsl
new file mode 100644
index 0000000..a3ba5e2
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.glsl
@@ -0,0 +1,20 @@
+#version 310 es
+
+shared int zero[2][3];
+void tint_symbol(uint local_invocation_index) {
+ {
+ for(uint idx = local_invocation_index; (idx < 6u); idx = (idx + 1u)) {
+ uint i = (idx / 3u);
+ uint i_1 = (idx % 3u);
+ zero[i][i_1] = 0;
+ }
+ }
+ barrier();
+ int v[2][3] = zero;
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+ tint_symbol(gl_LocalInvocationIndex);
+ return;
+}
diff --git a/test/tint/var/initialization/workgroup/array.wgsl.expected.hlsl b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.hlsl
similarity index 60%
copy from test/tint/var/initialization/workgroup/array.wgsl.expected.hlsl
copy to test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.hlsl
index 21c4cab..0bcec72 100644
--- a/test/tint/var/initialization/workgroup/array.wgsl.expected.hlsl
+++ b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.hlsl
@@ -1,4 +1,4 @@
-groupshared int v[3];
+groupshared int zero[2][3];
struct tint_symbol_1 {
uint local_invocation_index : SV_GroupIndex;
@@ -6,12 +6,14 @@
void main_inner(uint local_invocation_index) {
{
- [loop] for(uint idx = local_invocation_index; (idx < 3u); idx = (idx + 1u)) {
- const uint i = idx;
- v[i] = 0;
+ [loop] for(uint idx = local_invocation_index; (idx < 6u); idx = (idx + 1u)) {
+ const uint i = (idx / 3u);
+ const uint i_1 = (idx % 3u);
+ zero[i][i_1] = 0;
}
}
GroupMemoryBarrierWithGroupSync();
+ int v[2][3] = zero;
}
[numthreads(1, 1, 1)]
diff --git a/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.msl b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.msl
new file mode 100644
index 0000000..81c7619
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.msl
@@ -0,0 +1,32 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+void tint_symbol_inner(uint local_invocation_index, threadgroup tint_array<tint_array<int, 3>, 2>* const tint_symbol_1) {
+ for(uint idx = local_invocation_index; (idx < 6u); idx = (idx + 1u)) {
+ uint const i = (idx / 3u);
+ uint const i_1 = (idx % 3u);
+ (*(tint_symbol_1))[i][i_1] = 0;
+ }
+ threadgroup_barrier(mem_flags::mem_threadgroup);
+ tint_array<tint_array<int, 3>, 2> v = *(tint_symbol_1);
+}
+
+kernel void tint_symbol(uint local_invocation_index [[thread_index_in_threadgroup]]) {
+ threadgroup tint_array<tint_array<int, 3>, 2> tint_symbol_2;
+ tint_symbol_inner(local_invocation_index, &(tint_symbol_2));
+ return;
+}
+
diff --git a/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.spvasm b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..ff32eed
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.spvasm
@@ -0,0 +1,85 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main" %local_invocation_index_1
+ OpExecutionMode %main LocalSize 1 1 1
+ OpName %local_invocation_index_1 "local_invocation_index_1"
+ OpName %zero "zero"
+ OpName %main_inner "main_inner"
+ OpName %local_invocation_index "local_invocation_index"
+ OpName %idx "idx"
+ OpName %v "v"
+ OpName %main "main"
+ OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex
+ OpDecorate %_arr_int_uint_3 ArrayStride 4
+ OpDecorate %_arr__arr_int_uint_3_uint_2 ArrayStride 12
+ %uint = OpTypeInt 32 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input
+ %int = OpTypeInt 32 1
+ %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+ %uint_2 = OpConstant %uint 2
+%_arr__arr_int_uint_3_uint_2 = OpTypeArray %_arr_int_uint_3 %uint_2
+%_ptr_Workgroup__arr__arr_int_uint_3_uint_2 = OpTypePointer Workgroup %_arr__arr_int_uint_3_uint_2
+ %zero = OpVariable %_ptr_Workgroup__arr__arr_int_uint_3_uint_2 Workgroup
+ %void = OpTypeVoid
+ %11 = OpTypeFunction %void %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %18 = OpConstantNull %uint
+ %uint_6 = OpConstant %uint 6
+ %bool = OpTypeBool
+%_ptr_Workgroup_int = OpTypePointer Workgroup %int
+ %36 = OpConstantNull %int
+ %uint_1 = OpConstant %uint 1
+ %uint_264 = OpConstant %uint 264
+%_ptr_Function__arr__arr_int_uint_3_uint_2 = OpTypePointer Function %_arr__arr_int_uint_3_uint_2
+ %45 = OpConstantNull %_arr__arr_int_uint_3_uint_2
+ %46 = OpTypeFunction %void
+ %main_inner = OpFunction %void None %11
+%local_invocation_index = OpFunctionParameter %uint
+ %15 = OpLabel
+ %idx = OpVariable %_ptr_Function_uint Function %18
+ %v = OpVariable %_ptr_Function__arr__arr_int_uint_3_uint_2 Function %45
+ OpStore %idx %local_invocation_index
+ OpBranch %19
+ %19 = OpLabel
+ OpLoopMerge %20 %21 None
+ OpBranch %22
+ %22 = OpLabel
+ %24 = OpLoad %uint %idx
+ %26 = OpULessThan %bool %24 %uint_6
+ %23 = OpLogicalNot %bool %26
+ OpSelectionMerge %28 None
+ OpBranchConditional %23 %29 %28
+ %29 = OpLabel
+ OpBranch %20
+ %28 = OpLabel
+ %30 = OpLoad %uint %idx
+ %31 = OpUDiv %uint %30 %uint_3
+ %32 = OpLoad %uint %idx
+ %33 = OpUMod %uint %32 %uint_3
+ %35 = OpAccessChain %_ptr_Workgroup_int %zero %31 %33
+ OpStore %35 %36
+ OpBranch %21
+ %21 = OpLabel
+ %37 = OpLoad %uint %idx
+ %39 = OpIAdd %uint %37 %uint_1
+ OpStore %idx %39
+ OpBranch %19
+ %20 = OpLabel
+ OpControlBarrier %uint_2 %uint_2 %uint_264
+ %42 = OpLoad %_arr__arr_int_uint_3_uint_2 %zero
+ OpStore %v %42
+ OpReturn
+ OpFunctionEnd
+ %main = OpFunction %void None %46
+ %48 = OpLabel
+ %50 = OpLoad %uint %local_invocation_index_1
+ %49 = OpFunctionCall %void %main_inner %50
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.wgsl b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..f3d6c3c
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/array_i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+var<workgroup> zero : array<array<i32, 3>, 2>;
+
+@compute @workgroup_size(1)
+fn main() {
+ var v = zero;
+}
diff --git a/test/tint/var/initialization/workgroup/array/i32.wgsl b/test/tint/var/initialization/workgroup/array/i32.wgsl
new file mode 100644
index 0000000..2b910b3
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/i32.wgsl
@@ -0,0 +1,6 @@
+var<workgroup> zero : array<i32, 3>;
+
+@compute @workgroup_size(1)
+fn main() {
+ var v = zero;
+}
diff --git a/test/tint/var/initialization/workgroup/array.wgsl.expected.glsl b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.glsl
similarity index 84%
rename from test/tint/var/initialization/workgroup/array.wgsl.expected.glsl
rename to test/tint/var/initialization/workgroup/array/i32.wgsl.expected.glsl
index 0cb7390..b2191b1 100644
--- a/test/tint/var/initialization/workgroup/array.wgsl.expected.glsl
+++ b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.glsl
@@ -1,14 +1,15 @@
#version 310 es
-shared int v[3];
+shared int zero[3];
void tint_symbol(uint local_invocation_index) {
{
for(uint idx = local_invocation_index; (idx < 3u); idx = (idx + 1u)) {
uint i = idx;
- v[i] = 0;
+ zero[i] = 0;
}
}
barrier();
+ int v[3] = zero;
}
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/var/initialization/workgroup/array.wgsl.expected.hlsl b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.hlsl
similarity index 86%
rename from test/tint/var/initialization/workgroup/array.wgsl.expected.hlsl
rename to test/tint/var/initialization/workgroup/array/i32.wgsl.expected.hlsl
index 21c4cab..15e697a 100644
--- a/test/tint/var/initialization/workgroup/array.wgsl.expected.hlsl
+++ b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.hlsl
@@ -1,4 +1,4 @@
-groupshared int v[3];
+groupshared int zero[3];
struct tint_symbol_1 {
uint local_invocation_index : SV_GroupIndex;
@@ -8,10 +8,11 @@
{
[loop] for(uint idx = local_invocation_index; (idx < 3u); idx = (idx + 1u)) {
const uint i = idx;
- v[i] = 0;
+ zero[i] = 0;
}
}
GroupMemoryBarrierWithGroupSync();
+ int v[3] = zero;
}
[numthreads(1, 1, 1)]
diff --git a/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.msl b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.msl
new file mode 100644
index 0000000..5b98f4a
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+void tint_symbol_inner(uint local_invocation_index, threadgroup tint_array<int, 3>* const tint_symbol_1) {
+ for(uint idx = local_invocation_index; (idx < 3u); idx = (idx + 1u)) {
+ uint const i = idx;
+ (*(tint_symbol_1))[i] = 0;
+ }
+ threadgroup_barrier(mem_flags::mem_threadgroup);
+ tint_array<int, 3> v = *(tint_symbol_1);
+}
+
+kernel void tint_symbol(uint local_invocation_index [[thread_index_in_threadgroup]]) {
+ threadgroup tint_array<int, 3> tint_symbol_2;
+ tint_symbol_inner(local_invocation_index, &(tint_symbol_2));
+ return;
+}
+
diff --git a/test/tint/var/initialization/workgroup/array.wgsl.expected.spvasm b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.spvasm
similarity index 79%
rename from test/tint/var/initialization/workgroup/array.wgsl.expected.spvasm
rename to test/tint/var/initialization/workgroup/array/i32.wgsl.expected.spvasm
index 97682d3..59c3e27 100644
--- a/test/tint/var/initialization/workgroup/array.wgsl.expected.spvasm
+++ b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
-; Bound: 42
+; Bound: 46
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %local_invocation_index_1
OpExecutionMode %main LocalSize 1 1 1
OpName %local_invocation_index_1 "local_invocation_index_1"
- OpName %v "v"
+ OpName %zero "zero"
OpName %main_inner "main_inner"
OpName %local_invocation_index "local_invocation_index"
OpName %idx "idx"
+ OpName %v "v"
OpName %main "main"
OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex
OpDecorate %_arr_int_uint_3 ArrayStride 4
@@ -22,7 +23,7 @@
%uint_3 = OpConstant %uint 3
%_arr_int_uint_3 = OpTypeArray %int %uint_3
%_ptr_Workgroup__arr_int_uint_3 = OpTypePointer Workgroup %_arr_int_uint_3
- %v = OpVariable %_ptr_Workgroup__arr_int_uint_3 Workgroup
+ %zero = OpVariable %_ptr_Workgroup__arr_int_uint_3 Workgroup
%void = OpTypeVoid
%9 = OpTypeFunction %void %uint
%_ptr_Function_uint = OpTypePointer Function %uint
@@ -33,11 +34,14 @@
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_264 = OpConstant %uint 264
- %37 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+ %40 = OpConstantNull %_arr_int_uint_3
+ %41 = OpTypeFunction %void
%main_inner = OpFunction %void None %9
%local_invocation_index = OpFunctionParameter %uint
%13 = OpLabel
%idx = OpVariable %_ptr_Function_uint Function %16
+ %v = OpVariable %_ptr_Function__arr_int_uint_3 Function %40
OpStore %idx %local_invocation_index
OpBranch %17
%17 = OpLabel
@@ -53,7 +57,7 @@
OpBranch %18
%25 = OpLabel
%27 = OpLoad %uint %idx
- %29 = OpAccessChain %_ptr_Workgroup_int %v %27
+ %29 = OpAccessChain %_ptr_Workgroup_int %zero %27
OpStore %29 %30
OpBranch %19
%19 = OpLabel
@@ -63,11 +67,13 @@
OpBranch %17
%18 = OpLabel
OpControlBarrier %uint_2 %uint_2 %uint_264
+ %37 = OpLoad %_arr_int_uint_3 %zero
+ OpStore %v %37
OpReturn
OpFunctionEnd
- %main = OpFunction %void None %37
- %39 = OpLabel
- %41 = OpLoad %uint %local_invocation_index_1
- %40 = OpFunctionCall %void %main_inner %41
+ %main = OpFunction %void None %41
+ %43 = OpLabel
+ %45 = OpLoad %uint %local_invocation_index_1
+ %44 = OpFunctionCall %void %main_inner %45
OpReturn
OpFunctionEnd
diff --git a/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.wgsl b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..8f7cdf6
--- /dev/null
+++ b/test/tint/var/initialization/workgroup/array/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+var<workgroup> zero : array<i32, 3>;
+
+@compute @workgroup_size(1)
+fn main() {
+ var v = zero;
+}