mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-08 21:17:45 +00:00
writer/msl: Hoist array and struct initializers
Pull the HLSL transformation out to a standalone transform that can be used by both HLSL and MSL. The new E2E tests do not yet pass for MSL because they produce array assignments, which will be addressed in the next patch. Fixed: tint:826 Change-Id: Idc27c81ad45e3d4ab96d82663927d2fc1384618e Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/52842 Auto-Submit: James Price <jrprice@google.com> Commit-Queue: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Tint LUCI CQ
parent
1934f59427
commit
42220ba1b2
59
test/struct/type_constructor.wgsl
Normal file
59
test/struct/type_constructor.wgsl
Normal file
@@ -0,0 +1,59 @@
|
||||
struct S1 {
|
||||
a : i32;
|
||||
b : i32;
|
||||
c : i32;
|
||||
d : i32;
|
||||
};
|
||||
|
||||
struct S2 {
|
||||
e : i32;
|
||||
f : S1;
|
||||
};
|
||||
|
||||
struct S3 {
|
||||
g : i32;
|
||||
h : S1;
|
||||
i : S2;
|
||||
};
|
||||
|
||||
struct T {
|
||||
a : array<i32, 2>;
|
||||
};
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
let x : i32 = 42;
|
||||
|
||||
// Test basic usage.
|
||||
let empty : S1 = S1();
|
||||
let nonempty : S1 = S1(1, 2, 3, 4);
|
||||
let nonempty_with_expr : S1 = S1(1, x, x + 1, nonempty.d);
|
||||
|
||||
// Test nested structs.
|
||||
let nested_empty : S3 = S3();
|
||||
let nested_nonempty : S3 = S3(1, S1(2, 3, 4, 5), S2(6, S1(7, 8, 9, 10)));
|
||||
let nested_nonempty_with_expr : S3 =
|
||||
S3(1, S1(2, x, x + 1, nested_nonempty.i.f.d), S2(6, nonempty));
|
||||
|
||||
// Test use of constructors as sub-expressions.
|
||||
let subexpr_empty : i32 = S1().a;
|
||||
let subexpr_nonempty : i32 = S1(1, 2, 3, 4).b;
|
||||
let subexpr_nonempty_with_expr : i32 = S1(1, x, x + 1, nonempty.d).c;
|
||||
let subexpr_nested_empty : S1 = S2().f;
|
||||
let subexpr_nested_nonempty : S1 = S2(1, S1(2, 3, 4, 5)).f;
|
||||
let subexpr_nested_nonempty_with_expr : S1 =
|
||||
S2(1, S1(2, x, x + 1, nested_nonempty.i.f.d)).f;
|
||||
|
||||
// Test arrays of structs containing arrays.
|
||||
let aosoa_empty : array<T, 2> = array<T, 2>();
|
||||
let aosoa_nonempty : array<T, 2> =
|
||||
array<T, 2>(
|
||||
T(array<i32, 2>(1, 2)),
|
||||
T(array<i32, 2>(3, 4)),
|
||||
);
|
||||
let aosoa_nonempty_with_expr : array<T, 2> =
|
||||
array<T, 2>(
|
||||
T(array<i32, 2>(1, aosoa_nonempty[0].a[0] + 1)),
|
||||
aosoa_nonempty[1],
|
||||
);
|
||||
}
|
||||
59
test/struct/type_constructor.wgsl.expected.hlsl
Normal file
59
test/struct/type_constructor.wgsl.expected.hlsl
Normal file
@@ -0,0 +1,59 @@
|
||||
struct S1 {
|
||||
int a;
|
||||
int b;
|
||||
int c;
|
||||
int d;
|
||||
};
|
||||
struct S2 {
|
||||
int e;
|
||||
S1 f;
|
||||
};
|
||||
struct S3 {
|
||||
int g;
|
||||
S1 h;
|
||||
S2 i;
|
||||
};
|
||||
struct T {
|
||||
int a[2];
|
||||
};
|
||||
|
||||
[numthreads(1, 1, 1)]
|
||||
void main() {
|
||||
const int x = 42;
|
||||
const S1 empty = {0, 0, 0, 0};
|
||||
const S1 nonempty = {1, 2, 3, 4};
|
||||
const S1 nonempty_with_expr = {1, x, (x + 1), nonempty.d};
|
||||
const S3 nested_empty = {0, {0, 0, 0, 0}, {0, {0, 0, 0, 0}}};
|
||||
const S1 tint_symbol = {2, 3, 4, 5};
|
||||
const S1 tint_symbol_1 = {7, 8, 9, 10};
|
||||
const S2 tint_symbol_2 = {6, tint_symbol_1};
|
||||
const S3 nested_nonempty = {1, tint_symbol, tint_symbol_2};
|
||||
const S1 tint_symbol_3 = {2, x, (x + 1), nested_nonempty.i.f.d};
|
||||
const S2 tint_symbol_4 = {6, nonempty};
|
||||
const S3 nested_nonempty_with_expr = {1, tint_symbol_3, tint_symbol_4};
|
||||
const S1 tint_symbol_5 = {0, 0, 0, 0};
|
||||
const int subexpr_empty = tint_symbol_5.a;
|
||||
const S1 tint_symbol_6 = {1, 2, 3, 4};
|
||||
const int subexpr_nonempty = tint_symbol_6.b;
|
||||
const S1 tint_symbol_7 = {1, x, (x + 1), nonempty.d};
|
||||
const int subexpr_nonempty_with_expr = tint_symbol_7.c;
|
||||
const S2 tint_symbol_8 = {0, {0, 0, 0, 0}};
|
||||
const S1 subexpr_nested_empty = tint_symbol_8.f;
|
||||
const S1 tint_symbol_9 = {2, 3, 4, 5};
|
||||
const S2 tint_symbol_10 = {1, tint_symbol_9};
|
||||
const S1 subexpr_nested_nonempty = tint_symbol_10.f;
|
||||
const S1 tint_symbol_11 = {2, x, (x + 1), nested_nonempty.i.f.d};
|
||||
const S2 tint_symbol_12 = {1, tint_symbol_11};
|
||||
const S1 subexpr_nested_nonempty_with_expr = tint_symbol_12.f;
|
||||
const T aosoa_empty[2] = {{{0, 0}}, {{0, 0}}};
|
||||
const int tint_symbol_13[2] = {1, 2};
|
||||
const T tint_symbol_14 = {tint_symbol_13};
|
||||
const int tint_symbol_15[2] = {3, 4};
|
||||
const T tint_symbol_16 = {tint_symbol_15};
|
||||
const T aosoa_nonempty[2] = {tint_symbol_14, tint_symbol_16};
|
||||
const int tint_symbol_17[2] = {1, (aosoa_nonempty[0].a[0] + 1)};
|
||||
const T tint_symbol_18 = {tint_symbol_17};
|
||||
const T aosoa_nonempty_with_expr[2] = {tint_symbol_18, aosoa_nonempty[1]};
|
||||
return;
|
||||
}
|
||||
|
||||
1
test/struct/type_constructor.wgsl.expected.msl
Normal file
1
test/struct/type_constructor.wgsl.expected.msl
Normal file
@@ -0,0 +1 @@
|
||||
SKIP: crbug.com/tint/814
|
||||
111
test/struct/type_constructor.wgsl.expected.spvasm
Normal file
111
test/struct/type_constructor.wgsl.expected.spvasm
Normal file
@@ -0,0 +1,111 @@
|
||||
; SPIR-V
|
||||
; Version: 1.3
|
||||
; Generator: Google Tint Compiler; 0
|
||||
; Bound: 74
|
||||
; Schema: 0
|
||||
OpCapability Shader
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main"
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
OpName %main "main"
|
||||
OpName %S1 "S1"
|
||||
OpMemberName %S1 0 "a"
|
||||
OpMemberName %S1 1 "b"
|
||||
OpMemberName %S1 2 "c"
|
||||
OpMemberName %S1 3 "d"
|
||||
OpName %S3 "S3"
|
||||
OpMemberName %S3 0 "g"
|
||||
OpMemberName %S3 1 "h"
|
||||
OpMemberName %S3 2 "i"
|
||||
OpName %S2 "S2"
|
||||
OpMemberName %S2 0 "e"
|
||||
OpMemberName %S2 1 "f"
|
||||
OpName %T "T"
|
||||
OpMemberName %T 0 "a"
|
||||
OpMemberDecorate %S1 0 Offset 0
|
||||
OpMemberDecorate %S1 1 Offset 4
|
||||
OpMemberDecorate %S1 2 Offset 8
|
||||
OpMemberDecorate %S1 3 Offset 12
|
||||
OpMemberDecorate %S3 0 Offset 0
|
||||
OpMemberDecorate %S3 1 Offset 4
|
||||
OpMemberDecorate %S3 2 Offset 20
|
||||
OpMemberDecorate %S2 0 Offset 0
|
||||
OpMemberDecorate %S2 1 Offset 4
|
||||
OpMemberDecorate %T 0 Offset 0
|
||||
OpDecorate %_arr_int_uint_2 ArrayStride 4
|
||||
OpDecorate %_arr_T_uint_2 ArrayStride 8
|
||||
%void = OpTypeVoid
|
||||
%1 = OpTypeFunction %void
|
||||
%int = OpTypeInt 32 1
|
||||
%int_42 = OpConstant %int 42
|
||||
%S1 = OpTypeStruct %int %int %int %int
|
||||
%8 = OpConstantNull %S1
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_3 = OpConstant %int 3
|
||||
%int_4 = OpConstant %int 4
|
||||
%13 = OpConstantComposite %S1 %int_1 %int_2 %int_3 %int_4
|
||||
%S2 = OpTypeStruct %int %S1
|
||||
%S3 = OpTypeStruct %int %S1 %S2
|
||||
%19 = OpConstantNull %S3
|
||||
%int_5 = OpConstant %int 5
|
||||
%21 = OpConstantComposite %S1 %int_2 %int_3 %int_4 %int_5
|
||||
%int_6 = OpConstant %int 6
|
||||
%int_7 = OpConstant %int 7
|
||||
%int_8 = OpConstant %int 8
|
||||
%int_9 = OpConstant %int 9
|
||||
%int_10 = OpConstant %int 10
|
||||
%27 = OpConstantComposite %S1 %int_7 %int_8 %int_9 %int_10
|
||||
%28 = OpConstantComposite %S2 %int_6 %27
|
||||
%29 = OpConstantComposite %S3 %int_1 %21 %28
|
||||
%43 = OpConstantNull %S2
|
||||
%45 = OpConstantComposite %S2 %int_1 %21
|
||||
%uint = OpTypeInt 32 0
|
||||
%uint_2 = OpConstant %uint 2
|
||||
%_arr_int_uint_2 = OpTypeArray %int %uint_2
|
||||
%T = OpTypeStruct %_arr_int_uint_2
|
||||
%_arr_T_uint_2 = OpTypeArray %T %uint_2
|
||||
%59 = OpConstantNull %_arr_T_uint_2
|
||||
%60 = OpConstantComposite %_arr_int_uint_2 %int_1 %int_2
|
||||
%61 = OpConstantComposite %T %60
|
||||
%62 = OpConstantComposite %_arr_int_uint_2 %int_3 %int_4
|
||||
%63 = OpConstantComposite %T %62
|
||||
%64 = OpConstantComposite %_arr_T_uint_2 %61 %63
|
||||
%int_0 = OpConstant %int 0
|
||||
%main = OpFunction %void None %1
|
||||
%4 = OpLabel
|
||||
%14 = OpIAdd %int %int_42 %int_1
|
||||
%15 = OpCompositeExtract %int %13 3
|
||||
%16 = OpCompositeConstruct %S1 %int_1 %int_42 %14 %15
|
||||
%30 = OpIAdd %int %int_42 %int_1
|
||||
%31 = OpCompositeExtract %S2 %29 2
|
||||
%32 = OpCompositeExtract %S1 %31 1
|
||||
%33 = OpCompositeExtract %int %32 3
|
||||
%34 = OpCompositeConstruct %S1 %int_2 %int_42 %30 %33
|
||||
%35 = OpCompositeConstruct %S2 %int_6 %13
|
||||
%36 = OpCompositeConstruct %S3 %int_1 %34 %35
|
||||
%37 = OpCompositeExtract %int %8 0
|
||||
%38 = OpCompositeExtract %int %13 1
|
||||
%39 = OpIAdd %int %int_42 %int_1
|
||||
%40 = OpCompositeExtract %int %13 3
|
||||
%41 = OpCompositeConstruct %S1 %int_1 %int_42 %39 %40
|
||||
%42 = OpCompositeExtract %int %41 2
|
||||
%44 = OpCompositeExtract %S1 %43 1
|
||||
%46 = OpCompositeExtract %S1 %45 1
|
||||
%47 = OpIAdd %int %int_42 %int_1
|
||||
%48 = OpCompositeExtract %S2 %29 2
|
||||
%49 = OpCompositeExtract %S1 %48 1
|
||||
%50 = OpCompositeExtract %int %49 3
|
||||
%51 = OpCompositeConstruct %S1 %int_2 %int_42 %47 %50
|
||||
%52 = OpCompositeConstruct %S2 %int_1 %51
|
||||
%53 = OpCompositeExtract %S1 %52 1
|
||||
%66 = OpCompositeExtract %T %64 0
|
||||
%67 = OpCompositeExtract %_arr_int_uint_2 %66 0
|
||||
%68 = OpCompositeExtract %int %67 0
|
||||
%69 = OpIAdd %int %68 %int_1
|
||||
%70 = OpCompositeConstruct %_arr_int_uint_2 %int_1 %69
|
||||
%71 = OpCompositeConstruct %T %70
|
||||
%72 = OpCompositeExtract %T %64 1
|
||||
%73 = OpCompositeConstruct %_arr_T_uint_2 %71 %72
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
41
test/struct/type_constructor.wgsl.expected.wgsl
Normal file
41
test/struct/type_constructor.wgsl.expected.wgsl
Normal file
@@ -0,0 +1,41 @@
|
||||
struct S1 {
|
||||
a : i32;
|
||||
b : i32;
|
||||
c : i32;
|
||||
d : i32;
|
||||
};
|
||||
|
||||
struct S2 {
|
||||
e : i32;
|
||||
f : S1;
|
||||
};
|
||||
|
||||
struct S3 {
|
||||
g : i32;
|
||||
h : S1;
|
||||
i : S2;
|
||||
};
|
||||
|
||||
struct T {
|
||||
a : array<i32, 2>;
|
||||
};
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
let x : i32 = 42;
|
||||
let empty : S1 = S1();
|
||||
let nonempty : S1 = S1(1, 2, 3, 4);
|
||||
let nonempty_with_expr : S1 = S1(1, x, (x + 1), nonempty.d);
|
||||
let nested_empty : S3 = S3();
|
||||
let nested_nonempty : S3 = S3(1, S1(2, 3, 4, 5), S2(6, S1(7, 8, 9, 10)));
|
||||
let nested_nonempty_with_expr : S3 = S3(1, S1(2, x, (x + 1), nested_nonempty.i.f.d), S2(6, nonempty));
|
||||
let subexpr_empty : i32 = S1().a;
|
||||
let subexpr_nonempty : i32 = S1(1, 2, 3, 4).b;
|
||||
let subexpr_nonempty_with_expr : i32 = S1(1, x, (x + 1), nonempty.d).c;
|
||||
let subexpr_nested_empty : S1 = S2().f;
|
||||
let subexpr_nested_nonempty : S1 = S2(1, S1(2, 3, 4, 5)).f;
|
||||
let subexpr_nested_nonempty_with_expr : S1 = S2(1, S1(2, x, (x + 1), nested_nonempty.i.f.d)).f;
|
||||
let aosoa_empty : array<T, 2> = array<T, 2>();
|
||||
let aosoa_nonempty : array<T, 2> = array<T, 2>(T(array<i32, 2>(1, 2)), T(array<i32, 2>(3, 4)));
|
||||
let aosoa_nonempty_with_expr : array<T, 2> = array<T, 2>(T(array<i32, 2>(1, (aosoa_nonempty[0].a[0] + 1))), aosoa_nonempty[1]);
|
||||
}
|
||||
Reference in New Issue
Block a user