Add transform/WrapArraysInStructs

And replace the MSL writer's logic to do this with the transform.

We need to do the same thing in HLSL, and in the future GLSL too.

Partially reverts fbfde720

Change-Id: Ie280e011bc3ded8e15ccacc0aeb12da3c2407389
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/54242
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
Ben Clayton
2021-06-16 09:19:36 +00:00
committed by Ben Clayton
parent cfed1cb01e
commit 0597a2b51b
31 changed files with 771 additions and 255 deletions

View File

@@ -1,28 +1,28 @@
#include <metal_stdlib>
using namespace metal;
struct tint_array_wrapper_0 {
int array[4];
struct tint_array_wrapper {
int arr[4];
};
struct S {
tint_array_wrapper_0 arr;
tint_array_wrapper arr;
};
struct tint_array_wrapper_1 {
tint_array_wrapper_0 array[2];
tint_array_wrapper arr[2];
};
void foo() {
tint_array_wrapper_0 const src = {};
tint_array_wrapper_0 dst = {0};
tint_array_wrapper const src = {.arr={}};
tint_array_wrapper dst = {};
S dst_struct = {};
tint_array_wrapper_1 dst_array = {{0}};
thread tint_array_wrapper_0* const dst_ptr = &(dst);
tint_array_wrapper_1 dst_array = {};
thread tint_array_wrapper* const dst_ptr = &(dst);
thread S* const dst_struct_ptr = &(dst_struct);
thread tint_array_wrapper_1* const dst_array_ptr = &(dst_array);
dst_struct.arr = src;
dst_array.array[1] = src;
dst_array.arr[1] = src;
*(dst_ptr) = src;
(*(dst_struct_ptr)).arr = src;
(*(dst_array_ptr)).array[0] = src;
(*(dst_array_ptr)).arr[0] = src;
}

View File

@@ -1,32 +1,32 @@
#include <metal_stdlib>
using namespace metal;
struct tint_array_wrapper_0 {
float array[4];
struct tint_array_wrapper {
float arr[4];
};
struct tint_array_wrapper_1 {
tint_array_wrapper_0 array[3];
tint_array_wrapper arr[3];
};
struct tint_array_wrapper_2 {
tint_array_wrapper_1 array[2];
tint_array_wrapper_1 arr[2];
};
float f1(tint_array_wrapper_0 const a) {
return a.array[3];
float f1(tint_array_wrapper a) {
return a.arr[3];
}
float f2(tint_array_wrapper_1 const a) {
return a.array[2].array[3];
float f2(tint_array_wrapper_1 a) {
return a.arr[2].arr[3];
}
float f3(tint_array_wrapper_2 const a) {
return a.array[1].array[2].array[3];
float f3(tint_array_wrapper_2 a) {
return a.arr[1].arr[2].arr[3];
}
kernel void tint_symbol() {
tint_array_wrapper_0 const a1 = {};
tint_array_wrapper_1 const a2 = {};
tint_array_wrapper_2 const a3 = {};
tint_array_wrapper const a1 = {.arr={}};
tint_array_wrapper_1 const a2 = {.arr={}};
tint_array_wrapper_2 const a3 = {.arr={}};
float const v1 = f1(a1);
float const v2 = f2(a2);
float const v3 = f3(a3);

View File

@@ -1,33 +1,33 @@
#include <metal_stdlib>
using namespace metal;
struct tint_array_wrapper_0 {
float array[4];
struct tint_array_wrapper {
float arr[4];
};
struct tint_array_wrapper_1 {
tint_array_wrapper_0 array[3];
tint_array_wrapper arr[3];
};
struct tint_array_wrapper_2 {
tint_array_wrapper_1 array[2];
tint_array_wrapper_1 arr[2];
};
tint_array_wrapper_0 f1() {
tint_array_wrapper_0 const tint_symbol_1 = {};
tint_array_wrapper f1() {
tint_array_wrapper const tint_symbol_1 = {.arr={}};
return tint_symbol_1;
}
tint_array_wrapper_1 f2() {
tint_array_wrapper_1 const tint_symbol_2 = {f1(), f1(), f1()};
tint_array_wrapper_1 const tint_symbol_2 = {.arr={f1(), f1(), f1()}};
return tint_symbol_2;
}
tint_array_wrapper_2 f3() {
tint_array_wrapper_2 const tint_symbol_3 = {f2(), f2()};
tint_array_wrapper_2 const tint_symbol_3 = {.arr={f2(), f2()}};
return tint_symbol_3;
}
kernel void tint_symbol() {
tint_array_wrapper_0 const a1 = f1();
tint_array_wrapper const a1 = f1();
tint_array_wrapper_1 const a2 = f2();
tint_array_wrapper_2 const a3 = f3();
return;

View File

@@ -1,53 +1,53 @@
#include <metal_stdlib>
using namespace metal;
struct tint_array_wrapper_0 {
int array[4];
};
struct tint_array_wrapper_1 {
tint_array_wrapper_0 array[3];
struct tint_array_wrapper {
int arr[4];
};
struct tint_array_wrapper_2 {
tint_array_wrapper_1 array[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_0 array[2];
tint_array_wrapper arr[2];
};
kernel void tint_symbol() {
int const x = 42;
tint_array_wrapper_0 const empty = {};
tint_array_wrapper_0 const nonempty = {1, 2, 3, 4};
tint_array_wrapper_0 const nonempty_with_expr = {1, x, (x + 1), nonempty.array[3]};
tint_array_wrapper_2 const nested_empty = {};
tint_array_wrapper_0 const tint_symbol_1 = {1, 2, 3, 4};
tint_array_wrapper_0 const tint_symbol_2 = {5, 6, 7, 8};
tint_array_wrapper_0 const tint_symbol_3 = {9, 10, 11, 12};
tint_array_wrapper_1 const tint_symbol_4 = {tint_symbol_1, tint_symbol_2, tint_symbol_3};
tint_array_wrapper_0 const tint_symbol_5 = {13, 14, 15, 16};
tint_array_wrapper_0 const tint_symbol_6 = {17, 18, 19, 20};
tint_array_wrapper_0 const tint_symbol_7 = {21, 22, 23, 24};
tint_array_wrapper_1 const tint_symbol_8 = {tint_symbol_5, tint_symbol_6, tint_symbol_7};
tint_array_wrapper_2 const nested_nonempty = {tint_symbol_4, tint_symbol_8};
tint_array_wrapper_0 const tint_symbol_9 = {1, 2, x, (x + 1)};
tint_array_wrapper_0 const tint_symbol_10 = {5, 6, nonempty.array[2], (nonempty.array[3] + 1)};
tint_array_wrapper_1 const tint_symbol_11 = {tint_symbol_9, tint_symbol_10, nonempty};
tint_array_wrapper_2 const nested_nonempty_with_expr = {tint_symbol_11, nested_nonempty.array[1]};
tint_array_wrapper_0 const tint_symbol_12 = {};
int const subexpr_empty = tint_symbol_12.array[1];
tint_array_wrapper_0 const tint_symbol_13 = {1, 2, 3, 4};
int const subexpr_nonempty = tint_symbol_13.array[2];
tint_array_wrapper_0 const tint_symbol_14 = {1, x, (x + 1), nonempty.array[3]};
int const subexpr_nonempty_with_expr = tint_symbol_14.array[2];
tint_array_wrapper_3 const tint_symbol_15 = {};
tint_array_wrapper_0 const subexpr_nested_empty = tint_symbol_15.array[1];
tint_array_wrapper_0 const tint_symbol_16 = {1, 2, 3, 4};
tint_array_wrapper_0 const tint_symbol_17 = {5, 6, 7, 8};
tint_array_wrapper_3 const tint_symbol_18 = {tint_symbol_16, tint_symbol_17};
tint_array_wrapper_0 const subexpr_nested_nonempty = tint_symbol_18.array[1];
tint_array_wrapper_0 const tint_symbol_19 = {1, x, (x + 1), nonempty.array[3]};
tint_array_wrapper_3 const tint_symbol_20 = {tint_symbol_19, nested_nonempty.array[1].array[2]};
tint_array_wrapper_0 const subexpr_nested_nonempty_with_expr = tint_symbol_20.array[1];
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, x, (x + 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, x, (x + 1)}};
tint_array_wrapper const tint_symbol_10 = {.arr={5, 6, nonempty.arr[2], (nonempty.arr[3] + 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, x, (x + 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, x, (x + 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];
return;
}