xref: /aosp_15_r20/external/skia/tests/SkSLMemoryLayoutTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLBuiltinTypes.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLContext.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLErrorReporter.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLMemoryLayout.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLPosition.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramSettings.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLUtil.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLLayout.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLModifierFlags.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLType.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
22*c8dee2aaSAndroid Build Coastguard Worker #include <string>
23*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
24*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
27*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_std140,r)28*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_std140, r) {
29*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
30*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
31*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
32*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::k140);
33*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
34*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker     // basic types
37*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fFloat));
38*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.size(*context.fTypes.fFloat2));
39*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fFloat3));
40*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat4));
41*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fInt));
42*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.size(*context.fTypes.fInt2));
43*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fInt3));
44*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fInt4));
45*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  1 == layout.size(*context.fTypes.fBool));
46*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  2 == layout.size(*context.fTypes.fBool2));
47*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  3 == layout.size(*context.fTypes.fBool3));
48*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fBool4));
49*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x2));
50*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x4));
51*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x3));
52*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x2));
53*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x4));
54*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fAtomicUInt));
55*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fFloat));
56*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fFloat2));
57*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3));
58*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4));
59*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fInt));
60*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fInt2));
61*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt3));
62*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt4));
63*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  1 == layout.alignment(*context.fTypes.fBool));
64*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  2 == layout.alignment(*context.fTypes.fBool2));
65*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fBool3));
66*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fBool4));
67*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x2));
68*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x4));
69*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x3));
70*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x2));
71*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x4));
72*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fAtomicUInt));
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     // struct 1
75*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields1;
76*c8dee2aaSAndroid Build Coastguard Worker     fields1.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
77*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("a"), context.fTypes.fFloat3.get());
78*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s1 =
79*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s1"), fields1);
80*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*s1));
81*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s1));
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker     fields1.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
84*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("b"), context.fTypes.fFloat.get());
85*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s2 =
86*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s2"), fields1);
87*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*s2));
88*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s2));
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker     fields1.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
91*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("c"), context.fTypes.fBool.get());
92*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s3 =
93*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s3"), fields1);
94*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*s3));
95*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s3));
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     // struct 2
98*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields2;
99*c8dee2aaSAndroid Build Coastguard Worker     fields2.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
100*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("a"), context.fTypes.fInt.get());
101*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s4 =
102*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s4"), fields2);
103*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*s4));
104*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s4));
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     fields2.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
107*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("b"), context.fTypes.fFloat3.get());
108*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s5 =
109*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s5"), fields2);
110*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*s5));
111*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s5));
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     // arrays
114*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> array1 =
115*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeArrayType(context, std::string("float[4]"), *context.fTypes.fFloat, 4);
116*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*array1));
117*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*array1));
118*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*array1));
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> array2 =
121*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeArrayType(context, std::string("float4[4]"), *context.fTypes.fFloat4, 4);
122*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*array2));
123*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*array2));
124*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*array2));
125*c8dee2aaSAndroid Build Coastguard Worker }
126*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_std430,r)127*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_std430, r) {
128*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
129*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
130*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
131*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::k430);
132*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
133*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker     // basic types
136*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fFloat));
137*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.size(*context.fTypes.fFloat2));
138*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fFloat3));
139*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat4));
140*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fInt));
141*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.size(*context.fTypes.fInt2));
142*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fInt3));
143*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fInt4));
144*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  1 == layout.size(*context.fTypes.fBool));
145*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  2 == layout.size(*context.fTypes.fBool2));
146*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  3 == layout.size(*context.fTypes.fBool3));
147*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fBool4));
148*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat2x2));
149*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x4));
150*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x3));
151*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat4x2));
152*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x4));
153*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.size(*context.fTypes.fAtomicUInt));
154*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fFloat));
155*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fFloat2));
156*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3));
157*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4));
158*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fInt));
159*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fInt2));
160*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt3));
161*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt4));
162*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  1 == layout.alignment(*context.fTypes.fBool));
163*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  2 == layout.alignment(*context.fTypes.fBool2));
164*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fBool3));
165*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fBool4));
166*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fFloat2x2));
167*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x4));
168*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x3));
169*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fFloat4x2));
170*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x4));
171*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fTypes.fAtomicUInt));
172*c8dee2aaSAndroid Build Coastguard Worker 
173*c8dee2aaSAndroid Build Coastguard Worker     // struct 1
174*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields1;
175*c8dee2aaSAndroid Build Coastguard Worker     fields1.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
176*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("a"), context.fTypes.fFloat3.get());
177*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s1 =
178*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s1"), fields1);
179*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*s1));
180*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s1));
181*c8dee2aaSAndroid Build Coastguard Worker 
182*c8dee2aaSAndroid Build Coastguard Worker     fields1.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
183*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("b"), context.fTypes.fFloat.get());
184*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s2 =
185*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s2"), fields1);
186*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*s2));
187*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s2));
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     fields1.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
190*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("c"), context.fTypes.fBool.get());
191*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s3 =
192*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s3"), fields1);
193*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*s3));
194*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s3));
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     // struct 2
197*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields2;
198*c8dee2aaSAndroid Build Coastguard Worker     fields2.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
199*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("a"), context.fTypes.fInt.get());
200*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s4 =
201*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s4"), fields2);
202*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*s4));
203*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*s4));
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker     fields2.emplace_back(SkSL::Position(), SkSL::Layout(), SkSL::ModifierFlag::kNone,
206*c8dee2aaSAndroid Build Coastguard Worker                          std::string_view("b"), context.fTypes.fFloat3.get());
207*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> s5 =
208*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeStructType(context, SkSL::Position(), std::string("s5"), fields2);
209*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*s5));
210*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*s5));
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker     // arrays
213*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> array1 =
214*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeArrayType(context, std::string("float[4]"), *context.fTypes.fFloat, 4);
215*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*array1));
216*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*array1));
217*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.stride(*array1));
218*c8dee2aaSAndroid Build Coastguard Worker 
219*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> array2 =
220*c8dee2aaSAndroid Build Coastguard Worker             SkSL::Type::MakeArrayType(context, std::string("float4[4]"), *context.fTypes.fFloat4, 4);
221*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*array2));
222*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*array2));
223*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*array2));
224*c8dee2aaSAndroid Build Coastguard Worker }
225*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_WGSLUniform_Base,r)226*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_WGSLUniform_Base, r) {
227*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
228*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
229*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
230*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::kWGSLUniform_Base);
231*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
232*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker     // The values here are taken from https://www.w3.org/TR/WGSL/#alignment-and-size, table titled
235*c8dee2aaSAndroid Build Coastguard Worker     // "Alignment and size for host-shareable types". WGSL does not have an i16 type, so short and
236*c8dee2aaSAndroid Build Coastguard Worker     // unsigned-short integer types are treated as full-size integers in WGSL.
237*c8dee2aaSAndroid Build Coastguard Worker 
238*c8dee2aaSAndroid Build Coastguard Worker     // scalars (i32, u32, f32, f16)
239*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fInt));
240*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUInt));
241*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fShort));
242*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUShort));
243*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fFloat));
244*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fHalf));
245*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fInt));
246*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUInt));
247*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fShort));
248*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUShort));
249*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fFloat));
250*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf));
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker     // vec2<T>, T: i32, u32, f32, f16
253*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fInt2));
254*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUInt2));
255*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fShort2));
256*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUShort2));
257*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fFloat2));
258*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fHalf2));
259*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fInt2));
260*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUInt2));
261*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fShort2));
262*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUShort2));
263*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2));
264*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2));
265*c8dee2aaSAndroid Build Coastguard Worker 
266*c8dee2aaSAndroid Build Coastguard Worker     // vec3<T>, T: i32, u32, f32, f16
267*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fInt3));
268*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUInt3));
269*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fShort3));
270*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUShort3));
271*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fFloat3));
272*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fHalf3));
273*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt3));
274*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt3));
275*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort3));
276*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort3));
277*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3));
278*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf3));
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker     // vec4<T>, T: i32, u32, f32, f16
281*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fInt4));
282*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUInt4));
283*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fShort4));
284*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUShort4));
285*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat4));
286*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf4));
287*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt4));
288*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt4));
289*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort4));
290*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort4));
291*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4));
292*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf4));
293*c8dee2aaSAndroid Build Coastguard Worker 
294*c8dee2aaSAndroid Build Coastguard Worker     // mat2x2<f32>, mat2x2<f16>
295*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat2x2));
296*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf2x2));
297*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2x2));
298*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2x2));
299*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat2x2));
300*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf2x2));
301*c8dee2aaSAndroid Build Coastguard Worker 
302*c8dee2aaSAndroid Build Coastguard Worker     // mat3x2<f32>, mat3x2<f16>
303*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fFloat3x2));
304*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fHalf3x2));
305*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat3x2));
306*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf3x2));
307*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat3x2));
308*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf3x2));
309*c8dee2aaSAndroid Build Coastguard Worker 
310*c8dee2aaSAndroid Build Coastguard Worker     // mat4x2<f32>, mat4x2<f16>
311*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat4x2));
312*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf4x2));
313*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat4x2));
314*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf4x2));
315*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat4x2));
316*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf4x2));
317*c8dee2aaSAndroid Build Coastguard Worker 
318*c8dee2aaSAndroid Build Coastguard Worker     // mat2x3<f32>, mat2x3<f16>
319*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x3));
320*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf2x3));
321*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x3));
322*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf2x3));
323*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x3));
324*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf2x3));
325*c8dee2aaSAndroid Build Coastguard Worker 
326*c8dee2aaSAndroid Build Coastguard Worker     // mat3x3<f32>, mat3x3<f16>
327*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x3));
328*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fHalf3x3));
329*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x3));
330*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf3x3));
331*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x3));
332*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf3x3));
333*c8dee2aaSAndroid Build Coastguard Worker 
334*c8dee2aaSAndroid Build Coastguard Worker     // mat4x3<f32>, mat4x3<f16>
335*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x3));
336*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fHalf4x3));
337*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x3));
338*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf4x3));
339*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x3));
340*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf4x3));
341*c8dee2aaSAndroid Build Coastguard Worker 
342*c8dee2aaSAndroid Build Coastguard Worker     // mat2x4<f32>, mat2x4<f16>
343*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x4));
344*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf2x4));
345*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x4));
346*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf2x4));
347*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x4));
348*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf2x4));
349*c8dee2aaSAndroid Build Coastguard Worker 
350*c8dee2aaSAndroid Build Coastguard Worker     // mat3x4<f32>, mat3x4<f16>
351*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x4));
352*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fHalf3x4));
353*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x4));
354*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf3x4));
355*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x4));
356*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf3x4));
357*c8dee2aaSAndroid Build Coastguard Worker 
358*c8dee2aaSAndroid Build Coastguard Worker     // mat4x4<f32>, mat4x4<f16>
359*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x4));
360*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fHalf4x4));
361*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x4));
362*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf4x4));
363*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x4));
364*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf4x4));
365*c8dee2aaSAndroid Build Coastguard Worker 
366*c8dee2aaSAndroid Build Coastguard Worker     // atomic<u32>
367*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fAtomicUInt));
368*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fAtomicUInt));
369*c8dee2aaSAndroid Build Coastguard Worker 
370*c8dee2aaSAndroid Build Coastguard Worker     // bool is not a host-shareable type and returns 0 for WGSL.
371*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool));
372*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool2));
373*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool3));
374*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool4));
375*c8dee2aaSAndroid Build Coastguard Worker 
376*c8dee2aaSAndroid Build Coastguard Worker     // Arrays
377*c8dee2aaSAndroid Build Coastguard Worker     // array<f32, 4>
378*c8dee2aaSAndroid Build Coastguard Worker     {
379*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float[4]", *context.fTypes.fFloat, 4);
380*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
381*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
382*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
383*c8dee2aaSAndroid Build Coastguard Worker     }
384*c8dee2aaSAndroid Build Coastguard Worker     // array<f16, 4>
385*c8dee2aaSAndroid Build Coastguard Worker     {
386*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "half[4]", *context.fTypes.fHalf, 4);
387*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
388*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
389*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
390*c8dee2aaSAndroid Build Coastguard Worker     }
391*c8dee2aaSAndroid Build Coastguard Worker     // array<vec2<f32>, 4>
392*c8dee2aaSAndroid Build Coastguard Worker     {
393*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float2[4]", *context.fTypes.fFloat2, 4);
394*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
395*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
396*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
397*c8dee2aaSAndroid Build Coastguard Worker     }
398*c8dee2aaSAndroid Build Coastguard Worker     // array<vec3<f32>, 4>
399*c8dee2aaSAndroid Build Coastguard Worker     {
400*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float3[4]", *context.fTypes.fFloat3, 4);
401*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
402*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
403*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
404*c8dee2aaSAndroid Build Coastguard Worker     }
405*c8dee2aaSAndroid Build Coastguard Worker     // array<vec4<f32>, 4>
406*c8dee2aaSAndroid Build Coastguard Worker     {
407*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float4[4]", *context.fTypes.fFloat4, 4);
408*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
409*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
410*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
411*c8dee2aaSAndroid Build Coastguard Worker     }
412*c8dee2aaSAndroid Build Coastguard Worker     // array<mat3x3<f32>, 4>
413*c8dee2aaSAndroid Build Coastguard Worker     {
414*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "mat3[4]", *context.fTypes.fFloat3x3, 4);
415*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 192 == layout.size(*array));
416*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
417*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 48 == layout.stride(*array));
418*c8dee2aaSAndroid Build Coastguard Worker     }
419*c8dee2aaSAndroid Build Coastguard Worker 
420*c8dee2aaSAndroid Build Coastguard Worker     // Structs A and B from example in https://www.w3.org/TR/WGSL/#structure-member-layout, with
421*c8dee2aaSAndroid Build Coastguard Worker     // offsets adjusted for uniform address space constraints.
422*c8dee2aaSAndroid Build Coastguard Worker     //
423*c8dee2aaSAndroid Build Coastguard Worker     // struct A {        //            align(roundUp(16, 8))  size(roundUp(16, 24))
424*c8dee2aaSAndroid Build Coastguard Worker     //     u: f32,       // offset(0)  align(4)               size(4)
425*c8dee2aaSAndroid Build Coastguard Worker     //     v: f32,       // offset(4)  align(4)               size(4)
426*c8dee2aaSAndroid Build Coastguard Worker     //     w: vec2<f32>, // offset(8)  align(8)               size(8)
427*c8dee2aaSAndroid Build Coastguard Worker     //     x: f32        // offset(16) align(4)               size(4)
428*c8dee2aaSAndroid Build Coastguard Worker     //     // padding    // offset(20)                        size(12)
429*c8dee2aaSAndroid Build Coastguard Worker     // }
430*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields;
431*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
432*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
433*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
434*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("u"),
435*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
436*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
437*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
438*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
439*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("v"),
440*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
441*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
442*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
443*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
444*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("w"),
445*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
446*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
447*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
448*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
449*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("x"),
450*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
451*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structA = SkSL::Type::MakeStructType(
452*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("A"), std::move(fields));
453*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*structA));
454*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*structA));
455*c8dee2aaSAndroid Build Coastguard Worker     fields = {};
456*c8dee2aaSAndroid Build Coastguard Worker 
457*c8dee2aaSAndroid Build Coastguard Worker     // struct B {          //             align(16) size(208)
458*c8dee2aaSAndroid Build Coastguard Worker     //     a: vec2<f32>,   // offset(0)   align(8)  size(8)
459*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(8)             size(8)
460*c8dee2aaSAndroid Build Coastguard Worker     //     b: vec3<f32>,   // offset(16)  align(16) size(12)
461*c8dee2aaSAndroid Build Coastguard Worker     //     c: f32,         // offset(28)  align(4)  size(4)
462*c8dee2aaSAndroid Build Coastguard Worker     //     d: f32,         // offset(32)  align(4)  size(4)
463*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(36)            size(12)
464*c8dee2aaSAndroid Build Coastguard Worker     //     e: A,           // offset(48)  align(16) size(32)
465*c8dee2aaSAndroid Build Coastguard Worker     //     f: vec3<f32>,   // offset(80)  align(16) size(12)
466*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(92)            size(4)
467*c8dee2aaSAndroid Build Coastguard Worker     //     g: array<A, 3>, // offset(96)  align(16) size(96)
468*c8dee2aaSAndroid Build Coastguard Worker     //     h: i32          // offset(192) align(4)  size(4)
469*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(196)           size(12)
470*c8dee2aaSAndroid Build Coastguard Worker     // }
471*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
472*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
473*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
474*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("a"),
475*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
476*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
477*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
478*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
479*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("b"),
480*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
481*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
482*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
483*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
484*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("c"),
485*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
486*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
487*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
488*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
489*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("d"),
490*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
491*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
492*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
493*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
494*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("e"),
495*c8dee2aaSAndroid Build Coastguard Worker                         structA.get());
496*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
497*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
498*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
499*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("f"),
500*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
501*c8dee2aaSAndroid Build Coastguard Worker     auto array = SkSL::Type::MakeArrayType(context, "A[3]", *structA, 3);
502*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
503*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
504*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
505*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("g"),
506*c8dee2aaSAndroid Build Coastguard Worker                         array.get());
507*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
508*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
509*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
510*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("h"),
511*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fInt.get());
512*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structB = SkSL::Type::MakeStructType(
513*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("B"), std::move(fields));
514*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 208 == layout.size(*structB));
515*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*structB));
516*c8dee2aaSAndroid Build Coastguard Worker }
517*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_WGSLUniform_EnableF16,r)518*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_WGSLUniform_EnableF16, r) {
519*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
520*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
521*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
522*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::kWGSLUniform_EnableF16);
523*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
524*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
525*c8dee2aaSAndroid Build Coastguard Worker 
526*c8dee2aaSAndroid Build Coastguard Worker     // The values here are taken from https://www.w3.org/TR/WGSL/#alignment-and-size, table titled
527*c8dee2aaSAndroid Build Coastguard Worker     // "Alignment and size for host-shareable types". WGSL does not have an i16 type, so short and
528*c8dee2aaSAndroid Build Coastguard Worker     // unsigned-short integer types are treated as full-size integers in WGSL.
529*c8dee2aaSAndroid Build Coastguard Worker 
530*c8dee2aaSAndroid Build Coastguard Worker     // scalars (i32, u32, f32, f16)
531*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fInt));
532*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUInt));
533*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fShort));
534*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUShort));
535*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fFloat));
536*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 2 == layout.size(*context.fTypes.fHalf));
537*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fInt));
538*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUInt));
539*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fShort));
540*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUShort));
541*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fFloat));
542*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 2 == layout.alignment(*context.fTypes.fHalf));
543*c8dee2aaSAndroid Build Coastguard Worker 
544*c8dee2aaSAndroid Build Coastguard Worker     // vec2<T>, T: i32, u32, f32, f16
545*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fInt2));
546*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUInt2));
547*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fShort2));
548*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUShort2));
549*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fFloat2));
550*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fHalf2));
551*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fInt2));
552*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUInt2));
553*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fShort2));
554*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUShort2));
555*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2));
556*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf2));
557*c8dee2aaSAndroid Build Coastguard Worker 
558*c8dee2aaSAndroid Build Coastguard Worker     // vec3<T>, T: i32, u32, f32, f16
559*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fInt3));
560*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUInt3));
561*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fShort3));
562*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUShort3));
563*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fFloat3));
564*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  6 == layout.size(*context.fTypes.fHalf3));
565*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt3));
566*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt3));
567*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort3));
568*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort3));
569*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3));
570*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fHalf3));
571*c8dee2aaSAndroid Build Coastguard Worker 
572*c8dee2aaSAndroid Build Coastguard Worker     // vec4<T>, T: i32, u32, f32, f16
573*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fInt4));
574*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUInt4));
575*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fShort4));
576*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUShort4));
577*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat4));
578*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.size(*context.fTypes.fHalf4));
579*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt4));
580*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt4));
581*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort4));
582*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort4));
583*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4));
584*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fHalf4));
585*c8dee2aaSAndroid Build Coastguard Worker 
586*c8dee2aaSAndroid Build Coastguard Worker     // mat2x2<f32>, mat2x2<f16>
587*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat2x2));
588*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fHalf2x2));
589*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2x2));
590*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf2x2));
591*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat2x2));
592*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.stride(*context.fTypes.fHalf2x2));
593*c8dee2aaSAndroid Build Coastguard Worker 
594*c8dee2aaSAndroid Build Coastguard Worker     // mat3x2<f32>, mat3x2<f16>
595*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fFloat3x2));
596*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fHalf3x2));
597*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat3x2));
598*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf3x2));
599*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat3x2));
600*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.stride(*context.fTypes.fHalf3x2));
601*c8dee2aaSAndroid Build Coastguard Worker 
602*c8dee2aaSAndroid Build Coastguard Worker     // mat4x2<f32>, mat4x2<f16>
603*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat4x2));
604*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf4x2));
605*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat4x2));
606*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf4x2));
607*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat4x2));
608*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.stride(*context.fTypes.fHalf4x2));
609*c8dee2aaSAndroid Build Coastguard Worker 
610*c8dee2aaSAndroid Build Coastguard Worker     // mat2x3<f32>, mat2x3<f16>
611*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x3));
612*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf2x3));
613*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x3));
614*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2x3));
615*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x3));
616*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf2x3));
617*c8dee2aaSAndroid Build Coastguard Worker 
618*c8dee2aaSAndroid Build Coastguard Worker     // mat3x3<f32>, mat3x3<f16>
619*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x3));
620*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fHalf3x3));
621*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x3));
622*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf3x3));
623*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x3));
624*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf3x3));
625*c8dee2aaSAndroid Build Coastguard Worker 
626*c8dee2aaSAndroid Build Coastguard Worker     // mat4x3<f32>, mat4x3<f16>
627*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x3));
628*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf4x3));
629*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x3));
630*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf4x3));
631*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x3));
632*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf4x3));
633*c8dee2aaSAndroid Build Coastguard Worker 
634*c8dee2aaSAndroid Build Coastguard Worker     // mat2x4<f32>, mat2x4<f16>
635*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x4));
636*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf2x4));
637*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x4));
638*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2x4));
639*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x4));
640*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf2x4));
641*c8dee2aaSAndroid Build Coastguard Worker 
642*c8dee2aaSAndroid Build Coastguard Worker     // mat3x4<f32>, mat3x4<f16>
643*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x4));
644*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fHalf3x4));
645*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x4));
646*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf3x4));
647*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x4));
648*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf3x4));
649*c8dee2aaSAndroid Build Coastguard Worker 
650*c8dee2aaSAndroid Build Coastguard Worker     // mat4x4<f32>, mat4x4<f16>
651*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x4));
652*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf4x4));
653*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x4));
654*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf4x4));
655*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x4));
656*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf4x4));
657*c8dee2aaSAndroid Build Coastguard Worker 
658*c8dee2aaSAndroid Build Coastguard Worker     // atomic<u32>
659*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fAtomicUInt));
660*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fAtomicUInt));
661*c8dee2aaSAndroid Build Coastguard Worker 
662*c8dee2aaSAndroid Build Coastguard Worker     // bool is not a host-shareable type and returns 0 for WGSL.
663*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool));
664*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool2));
665*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool3));
666*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool4));
667*c8dee2aaSAndroid Build Coastguard Worker 
668*c8dee2aaSAndroid Build Coastguard Worker     // Arrays
669*c8dee2aaSAndroid Build Coastguard Worker     // array<f32, 4>
670*c8dee2aaSAndroid Build Coastguard Worker     {
671*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float[4]", *context.fTypes.fFloat, 4);
672*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
673*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
674*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
675*c8dee2aaSAndroid Build Coastguard Worker     }
676*c8dee2aaSAndroid Build Coastguard Worker     // array<f16, 4>
677*c8dee2aaSAndroid Build Coastguard Worker     {
678*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "half[4]", *context.fTypes.fHalf, 4);
679*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
680*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
681*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
682*c8dee2aaSAndroid Build Coastguard Worker     }
683*c8dee2aaSAndroid Build Coastguard Worker     // array<vec2<f32>, 4>
684*c8dee2aaSAndroid Build Coastguard Worker     {
685*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float2[4]", *context.fTypes.fFloat2, 4);
686*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
687*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
688*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
689*c8dee2aaSAndroid Build Coastguard Worker     }
690*c8dee2aaSAndroid Build Coastguard Worker     // array<vec3<f32>, 4>
691*c8dee2aaSAndroid Build Coastguard Worker     {
692*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float3[4]", *context.fTypes.fFloat3, 4);
693*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
694*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
695*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
696*c8dee2aaSAndroid Build Coastguard Worker     }
697*c8dee2aaSAndroid Build Coastguard Worker     // array<vec4<f32>, 4>
698*c8dee2aaSAndroid Build Coastguard Worker     {
699*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float4[4]", *context.fTypes.fFloat4, 4);
700*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
701*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
702*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
703*c8dee2aaSAndroid Build Coastguard Worker     }
704*c8dee2aaSAndroid Build Coastguard Worker     // array<mat3x3<f32>, 4>
705*c8dee2aaSAndroid Build Coastguard Worker     {
706*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "mat3[4]", *context.fTypes.fFloat3x3, 4);
707*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 192 == layout.size(*array));
708*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
709*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 48 == layout.stride(*array));
710*c8dee2aaSAndroid Build Coastguard Worker     }
711*c8dee2aaSAndroid Build Coastguard Worker 
712*c8dee2aaSAndroid Build Coastguard Worker     // Structs A and B from example in https://www.w3.org/TR/WGSL/#structure-member-layout, with
713*c8dee2aaSAndroid Build Coastguard Worker     // offsets adjusted for uniform address space constraints.
714*c8dee2aaSAndroid Build Coastguard Worker     //
715*c8dee2aaSAndroid Build Coastguard Worker     // struct A {        //            align(roundUp(16, 8))  size(roundUp(16, 24))
716*c8dee2aaSAndroid Build Coastguard Worker     //     u: f32,       // offset(0)  align(4)               size(4)
717*c8dee2aaSAndroid Build Coastguard Worker     //     v: f32,       // offset(4)  align(4)               size(4)
718*c8dee2aaSAndroid Build Coastguard Worker     //     w: vec2<f32>, // offset(8)  align(8)               size(8)
719*c8dee2aaSAndroid Build Coastguard Worker     //     x: f32        // offset(16) align(4)               size(4)
720*c8dee2aaSAndroid Build Coastguard Worker     //     // padding    // offset(20)                        size(12)
721*c8dee2aaSAndroid Build Coastguard Worker     // }
722*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields;
723*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
724*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
725*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
726*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("u"),
727*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
728*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
729*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
730*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
731*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("v"),
732*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
733*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
734*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
735*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
736*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("w"),
737*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
738*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
739*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
740*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
741*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("x"),
742*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
743*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structA = SkSL::Type::MakeStructType(
744*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("A"), std::move(fields));
745*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*structA));
746*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*structA));
747*c8dee2aaSAndroid Build Coastguard Worker     fields = {};
748*c8dee2aaSAndroid Build Coastguard Worker 
749*c8dee2aaSAndroid Build Coastguard Worker     // struct B {          //             align(16) size(208)
750*c8dee2aaSAndroid Build Coastguard Worker     //     a: vec2<f32>,   // offset(0)   align(8)  size(8)
751*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(8)             size(8)
752*c8dee2aaSAndroid Build Coastguard Worker     //     b: vec3<f32>,   // offset(16)  align(16) size(12)
753*c8dee2aaSAndroid Build Coastguard Worker     //     c: f32,         // offset(28)  align(4)  size(4)
754*c8dee2aaSAndroid Build Coastguard Worker     //     d: f32,         // offset(32)  align(4)  size(4)
755*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(36)            size(12)
756*c8dee2aaSAndroid Build Coastguard Worker     //     e: A,           // offset(48)  align(16) size(32)
757*c8dee2aaSAndroid Build Coastguard Worker     //     f: vec3<f32>,   // offset(80)  align(16) size(12)
758*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(92)            size(4)
759*c8dee2aaSAndroid Build Coastguard Worker     //     g: array<A, 3>, // offset(96)  align(16) size(96)
760*c8dee2aaSAndroid Build Coastguard Worker     //     h: i32          // offset(192) align(4)  size(4)
761*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(196)           size(12)
762*c8dee2aaSAndroid Build Coastguard Worker     // }
763*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
764*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
765*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
766*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("a"),
767*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
768*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
769*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
770*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
771*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("b"),
772*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
773*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
774*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
775*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
776*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("c"),
777*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
778*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
779*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
780*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
781*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("d"),
782*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
783*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
784*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
785*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
786*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("e"),
787*c8dee2aaSAndroid Build Coastguard Worker                         structA.get());
788*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
789*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
790*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
791*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("f"),
792*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
793*c8dee2aaSAndroid Build Coastguard Worker     auto array = SkSL::Type::MakeArrayType(context, "A[3]", *structA, 3);
794*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
795*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
796*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
797*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("g"),
798*c8dee2aaSAndroid Build Coastguard Worker                         array.get());
799*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
800*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
801*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
802*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("h"),
803*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fInt.get());
804*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structB = SkSL::Type::MakeStructType(
805*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("B"), std::move(fields));
806*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 208 == layout.size(*structB));
807*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*structB));
808*c8dee2aaSAndroid Build Coastguard Worker }
809*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_WGSLStorage_Base,r)810*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_WGSLStorage_Base, r) {
811*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
812*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
813*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
814*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::kWGSLStorage_Base);
815*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
816*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
817*c8dee2aaSAndroid Build Coastguard Worker 
818*c8dee2aaSAndroid Build Coastguard Worker     // The values here are taken from https://www.w3.org/TR/WGSL/#alignment-and-size, table titled
819*c8dee2aaSAndroid Build Coastguard Worker     // "Alignment and size for host-shareable types".
820*c8dee2aaSAndroid Build Coastguard Worker 
821*c8dee2aaSAndroid Build Coastguard Worker     // scalars (i32, u32, f32, f16)
822*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fInt));
823*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUInt));
824*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fShort));
825*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUShort));
826*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fFloat));
827*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fHalf));
828*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fInt));
829*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUInt));
830*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fShort));
831*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUShort));
832*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fFloat));
833*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf));
834*c8dee2aaSAndroid Build Coastguard Worker 
835*c8dee2aaSAndroid Build Coastguard Worker     // vec2<T>, T: i32, u32, f32, f16
836*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fInt2));
837*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUInt2));
838*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fShort2));
839*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUShort2));
840*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fFloat2));
841*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fHalf2));
842*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fInt2));
843*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUInt2));
844*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fShort2));
845*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUShort2));
846*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2));
847*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2));
848*c8dee2aaSAndroid Build Coastguard Worker 
849*c8dee2aaSAndroid Build Coastguard Worker     // vec3<T>, T: i32, u32, f32, f16
850*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fInt3));
851*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUInt3));
852*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fShort3));
853*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUShort3));
854*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fFloat3));
855*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fHalf3));
856*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt3));
857*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt3));
858*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort3));
859*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort3));
860*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3));
861*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf3));
862*c8dee2aaSAndroid Build Coastguard Worker 
863*c8dee2aaSAndroid Build Coastguard Worker     // vec4<T>, T: i32, u32, f32, f16
864*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fInt4));
865*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUInt4));
866*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fShort4));
867*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUShort4));
868*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat4));
869*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf4));
870*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt4));
871*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt4));
872*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort4));
873*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort4));
874*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4));
875*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf4));
876*c8dee2aaSAndroid Build Coastguard Worker 
877*c8dee2aaSAndroid Build Coastguard Worker     // mat2x2<f32>, mat2x2<f16>
878*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat2x2));
879*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf2x2));
880*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2x2));
881*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2x2));
882*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat2x2));
883*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf2x2));
884*c8dee2aaSAndroid Build Coastguard Worker 
885*c8dee2aaSAndroid Build Coastguard Worker     // mat3x2<f32>, mat3x2<f16>
886*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fFloat3x2));
887*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fHalf3x2));
888*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat3x2));
889*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf3x2));
890*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat3x2));
891*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf3x2));
892*c8dee2aaSAndroid Build Coastguard Worker 
893*c8dee2aaSAndroid Build Coastguard Worker     // mat4x2<f32>, mat4x2<f16>
894*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat4x2));
895*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf4x2));
896*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat4x2));
897*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf4x2));
898*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat4x2));
899*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf4x2));
900*c8dee2aaSAndroid Build Coastguard Worker 
901*c8dee2aaSAndroid Build Coastguard Worker     // mat2x3<f32>, mat2x3<f16>
902*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x3));
903*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf2x3));
904*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x3));
905*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf2x3));
906*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x3));
907*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf2x3));
908*c8dee2aaSAndroid Build Coastguard Worker 
909*c8dee2aaSAndroid Build Coastguard Worker     // mat3x3<f32>, mat3x3<f16>
910*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x3));
911*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fHalf3x3));
912*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x3));
913*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf3x3));
914*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x3));
915*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf3x3));
916*c8dee2aaSAndroid Build Coastguard Worker 
917*c8dee2aaSAndroid Build Coastguard Worker     // mat4x3<f32>, mat4x3<f16>
918*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x3));
919*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fHalf4x3));
920*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x3));
921*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf4x3));
922*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x3));
923*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf4x3));
924*c8dee2aaSAndroid Build Coastguard Worker 
925*c8dee2aaSAndroid Build Coastguard Worker     // mat2x4<f32>, mat2x4<f16>
926*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x4));
927*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf2x4));
928*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x4));
929*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf2x4));
930*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x4));
931*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf2x4));
932*c8dee2aaSAndroid Build Coastguard Worker 
933*c8dee2aaSAndroid Build Coastguard Worker     // mat3x4<f32>, mat3x4<f16>
934*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x4));
935*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fHalf3x4));
936*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x4));
937*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf3x4));
938*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x4));
939*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf3x4));
940*c8dee2aaSAndroid Build Coastguard Worker 
941*c8dee2aaSAndroid Build Coastguard Worker     // mat4x4<f32>, mat4x4<f16>
942*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x4));
943*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fHalf4x4));
944*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x4));
945*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fHalf4x4));
946*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x4));
947*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fHalf4x4));
948*c8dee2aaSAndroid Build Coastguard Worker 
949*c8dee2aaSAndroid Build Coastguard Worker     // atomic<u32>
950*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fAtomicUInt));
951*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fAtomicUInt));
952*c8dee2aaSAndroid Build Coastguard Worker 
953*c8dee2aaSAndroid Build Coastguard Worker     // bool is not a host-shareable type and returns 0 for WGSL.
954*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool));
955*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool2));
956*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool3));
957*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool4));
958*c8dee2aaSAndroid Build Coastguard Worker 
959*c8dee2aaSAndroid Build Coastguard Worker     // Arrays
960*c8dee2aaSAndroid Build Coastguard Worker     // array<f32, 4>
961*c8dee2aaSAndroid Build Coastguard Worker     {
962*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float[4]", *context.fTypes.fFloat, 4);
963*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.size(*array));
964*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 4 == layout.alignment(*array));
965*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 4 == layout.stride(*array));
966*c8dee2aaSAndroid Build Coastguard Worker     }
967*c8dee2aaSAndroid Build Coastguard Worker     // array<f16, 4>
968*c8dee2aaSAndroid Build Coastguard Worker     {
969*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "half[4]", *context.fTypes.fHalf, 4);
970*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.size(*array));
971*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 4 == layout.alignment(*array));
972*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 4 == layout.stride(*array));
973*c8dee2aaSAndroid Build Coastguard Worker     }
974*c8dee2aaSAndroid Build Coastguard Worker     // array<vec2<f32>, 4>
975*c8dee2aaSAndroid Build Coastguard Worker     {
976*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float2[4]", *context.fTypes.fFloat2, 4);
977*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 32 == layout.size(*array));
978*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 8 == layout.alignment(*array));
979*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 8 == layout.stride(*array));
980*c8dee2aaSAndroid Build Coastguard Worker     }
981*c8dee2aaSAndroid Build Coastguard Worker     // array<vec3<f32>, 4>
982*c8dee2aaSAndroid Build Coastguard Worker     {
983*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float3[4]", *context.fTypes.fFloat3, 4);
984*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
985*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
986*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
987*c8dee2aaSAndroid Build Coastguard Worker     }
988*c8dee2aaSAndroid Build Coastguard Worker     // array<vec4<f32>, 4>
989*c8dee2aaSAndroid Build Coastguard Worker     {
990*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float4[4]", *context.fTypes.fFloat4, 4);
991*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
992*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
993*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
994*c8dee2aaSAndroid Build Coastguard Worker     }
995*c8dee2aaSAndroid Build Coastguard Worker     // array<mat3x3<f32>, 4>
996*c8dee2aaSAndroid Build Coastguard Worker     {
997*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "mat3[4]", *context.fTypes.fFloat3x3, 4);
998*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 192 == layout.size(*array));
999*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
1000*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 48 == layout.stride(*array));
1001*c8dee2aaSAndroid Build Coastguard Worker     }
1002*c8dee2aaSAndroid Build Coastguard Worker 
1003*c8dee2aaSAndroid Build Coastguard Worker     // Structs A and B from example in https://www.w3.org/TR/WGSL/#structure-member-layout
1004*c8dee2aaSAndroid Build Coastguard Worker     //
1005*c8dee2aaSAndroid Build Coastguard Worker     // struct A {        //            align(8)               size(24)
1006*c8dee2aaSAndroid Build Coastguard Worker     //     u: f32,       // offset(0)  align(4)               size(4)
1007*c8dee2aaSAndroid Build Coastguard Worker     //     v: f32,       // offset(4)  align(4)               size(4)
1008*c8dee2aaSAndroid Build Coastguard Worker     //     w: vec2<f32>, // offset(8)  align(8)               size(8)
1009*c8dee2aaSAndroid Build Coastguard Worker     //     x: f32        // offset(16) align(4)               size(4)
1010*c8dee2aaSAndroid Build Coastguard Worker     //     // padding    // offset(20)                        size(4)
1011*c8dee2aaSAndroid Build Coastguard Worker     // }
1012*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields;
1013*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1014*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1015*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1016*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("u"),
1017*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1018*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1019*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1020*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1021*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("v"),
1022*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1023*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1024*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1025*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1026*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("w"),
1027*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
1028*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1029*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1030*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1031*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("x"),
1032*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1033*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structA = SkSL::Type::MakeStructType(
1034*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("A"), std::move(fields));
1035*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*structA));
1036*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*structA));
1037*c8dee2aaSAndroid Build Coastguard Worker     fields = {};
1038*c8dee2aaSAndroid Build Coastguard Worker 
1039*c8dee2aaSAndroid Build Coastguard Worker     // struct B {          //             align(16) size(160)
1040*c8dee2aaSAndroid Build Coastguard Worker     //     a: vec2<f32>,   // offset(0)   align(8)  size(8)
1041*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(8)             size(8)
1042*c8dee2aaSAndroid Build Coastguard Worker     //     b: vec3<f32>,   // offset(16)  align(16) size(12)
1043*c8dee2aaSAndroid Build Coastguard Worker     //     c: f32,         // offset(28)  align(4)  size(4)
1044*c8dee2aaSAndroid Build Coastguard Worker     //     d: f32,         // offset(32)  align(4)  size(4)
1045*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(36)            size(4)
1046*c8dee2aaSAndroid Build Coastguard Worker     //     e: A,           // offset(40)  align(8)  size(24)
1047*c8dee2aaSAndroid Build Coastguard Worker     //     f: vec3<f32>,   // offset(64)  align(16) size(12)
1048*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(76)            size(4)
1049*c8dee2aaSAndroid Build Coastguard Worker     //     g: array<A, 3>, // offset(80)  align(16) size(72)
1050*c8dee2aaSAndroid Build Coastguard Worker     //     h: i32          // offset(152) align(4)  size(4)
1051*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(156)           size(4)
1052*c8dee2aaSAndroid Build Coastguard Worker     // }
1053*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1054*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1055*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1056*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("a"),
1057*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
1058*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1059*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1060*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1061*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("b"),
1062*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
1063*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1064*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1065*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1066*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("c"),
1067*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1068*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1069*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1070*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1071*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("d"),
1072*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1073*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1074*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1075*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1076*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("e"),
1077*c8dee2aaSAndroid Build Coastguard Worker                         structA.get());
1078*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1079*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1080*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1081*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("f"),
1082*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
1083*c8dee2aaSAndroid Build Coastguard Worker     auto array = SkSL::Type::MakeArrayType(context, "A[3]", *structA, 3);
1084*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1085*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1086*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1087*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("g"),
1088*c8dee2aaSAndroid Build Coastguard Worker                         array.get());
1089*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1090*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1091*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1092*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("h"),
1093*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fInt.get());
1094*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structB = SkSL::Type::MakeStructType(
1095*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("B"), std::move(fields));
1096*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 160 == layout.size(*structB));
1097*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*structB));
1098*c8dee2aaSAndroid Build Coastguard Worker }
1099*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_WGSLStorage_EnableF16,r)1100*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_WGSLStorage_EnableF16, r) {
1101*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
1102*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
1103*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
1104*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::kWGSLStorage_EnableF16);
1105*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
1106*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
1107*c8dee2aaSAndroid Build Coastguard Worker 
1108*c8dee2aaSAndroid Build Coastguard Worker     // The values here are taken from https://www.w3.org/TR/WGSL/#alignment-and-size, table titled
1109*c8dee2aaSAndroid Build Coastguard Worker     // "Alignment and size for host-shareable types".
1110*c8dee2aaSAndroid Build Coastguard Worker 
1111*c8dee2aaSAndroid Build Coastguard Worker     // scalars (i32, u32, f32, f16)
1112*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fInt));
1113*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUInt));
1114*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fShort));
1115*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fUShort));
1116*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fFloat));
1117*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 2 == layout.size(*context.fTypes.fHalf));
1118*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fInt));
1119*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUInt));
1120*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fShort));
1121*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fUShort));
1122*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fFloat));
1123*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 2 == layout.alignment(*context.fTypes.fHalf));
1124*c8dee2aaSAndroid Build Coastguard Worker 
1125*c8dee2aaSAndroid Build Coastguard Worker     // vec2<T>, T: i32, u32, f32, f16
1126*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fInt2));
1127*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUInt2));
1128*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fShort2));
1129*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fUShort2));
1130*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fFloat2));
1131*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fHalf2));
1132*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fInt2));
1133*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUInt2));
1134*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fShort2));
1135*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fUShort2));
1136*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2));
1137*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf2));
1138*c8dee2aaSAndroid Build Coastguard Worker 
1139*c8dee2aaSAndroid Build Coastguard Worker     // vec3<T>, T: i32, u32, f32, f16
1140*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fInt3));
1141*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUInt3));
1142*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fShort3));
1143*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fUShort3));
1144*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fFloat3));
1145*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  6 == layout.size(*context.fTypes.fHalf3));
1146*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt3));
1147*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt3));
1148*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort3));
1149*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort3));
1150*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3));
1151*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fHalf3));
1152*c8dee2aaSAndroid Build Coastguard Worker 
1153*c8dee2aaSAndroid Build Coastguard Worker     // vec4<T>, T: i32, u32, f32, f16
1154*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fInt4));
1155*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUInt4));
1156*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fShort4));
1157*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fUShort4));
1158*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat4));
1159*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.size(*context.fTypes.fHalf4));
1160*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fInt4));
1161*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUInt4));
1162*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fShort4));
1163*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fUShort4));
1164*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4));
1165*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fTypes.fHalf4));
1166*c8dee2aaSAndroid Build Coastguard Worker 
1167*c8dee2aaSAndroid Build Coastguard Worker     // mat2x2<f32>, mat2x2<f16>
1168*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fFloat2x2));
1169*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.size(*context.fTypes.fHalf2x2));
1170*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat2x2));
1171*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf2x2));
1172*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat2x2));
1173*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.stride(*context.fTypes.fHalf2x2));
1174*c8dee2aaSAndroid Build Coastguard Worker 
1175*c8dee2aaSAndroid Build Coastguard Worker     // mat3x2<f32>, mat3x2<f16>
1176*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fFloat3x2));
1177*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 12 == layout.size(*context.fTypes.fHalf3x2));
1178*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat3x2));
1179*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf3x2));
1180*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat3x2));
1181*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.stride(*context.fTypes.fHalf3x2));
1182*c8dee2aaSAndroid Build Coastguard Worker 
1183*c8dee2aaSAndroid Build Coastguard Worker     // mat4x2<f32>, mat4x2<f16>
1184*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat4x2));
1185*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf4x2));
1186*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fFloat4x2));
1187*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fHalf4x2));
1188*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fFloat4x2));
1189*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.stride(*context.fTypes.fHalf4x2));
1190*c8dee2aaSAndroid Build Coastguard Worker 
1191*c8dee2aaSAndroid Build Coastguard Worker     // mat2x3<f32>, mat2x3<f16>
1192*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x3));
1193*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf2x3));
1194*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x3));
1195*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2x3));
1196*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x3));
1197*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf2x3));
1198*c8dee2aaSAndroid Build Coastguard Worker 
1199*c8dee2aaSAndroid Build Coastguard Worker     // mat3x3<f32>, mat3x3<f16>
1200*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x3));
1201*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fHalf3x3));
1202*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x3));
1203*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf3x3));
1204*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x3));
1205*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf3x3));
1206*c8dee2aaSAndroid Build Coastguard Worker 
1207*c8dee2aaSAndroid Build Coastguard Worker     // mat4x3<f32>, mat4x3<f16>
1208*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x3));
1209*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf4x3));
1210*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x3));
1211*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf4x3));
1212*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x3));
1213*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf4x3));
1214*c8dee2aaSAndroid Build Coastguard Worker 
1215*c8dee2aaSAndroid Build Coastguard Worker     // mat2x4<f32>, mat2x4<f16>
1216*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fFloat2x4));
1217*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.size(*context.fTypes.fHalf2x4));
1218*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat2x4));
1219*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf2x4));
1220*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat2x4));
1221*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf2x4));
1222*c8dee2aaSAndroid Build Coastguard Worker 
1223*c8dee2aaSAndroid Build Coastguard Worker     // mat3x4<f32>, mat3x4<f16>
1224*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 48 == layout.size(*context.fTypes.fFloat3x4));
1225*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*context.fTypes.fHalf3x4));
1226*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat3x4));
1227*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf3x4));
1228*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat3x4));
1229*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf3x4));
1230*c8dee2aaSAndroid Build Coastguard Worker 
1231*c8dee2aaSAndroid Build Coastguard Worker     // mat4x4<f32>, mat4x4<f16>
1232*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 64 == layout.size(*context.fTypes.fFloat4x4));
1233*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 32 == layout.size(*context.fTypes.fHalf4x4));
1234*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fTypes.fFloat4x4));
1235*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*context.fTypes.fHalf4x4));
1236*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.stride(*context.fTypes.fFloat4x4));
1237*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.stride(*context.fTypes.fHalf4x4));
1238*c8dee2aaSAndroid Build Coastguard Worker 
1239*c8dee2aaSAndroid Build Coastguard Worker     // atomic<u32>
1240*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.size(*context.fTypes.fAtomicUInt));
1241*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 4 == layout.alignment(*context.fTypes.fAtomicUInt));
1242*c8dee2aaSAndroid Build Coastguard Worker 
1243*c8dee2aaSAndroid Build Coastguard Worker     // bool is not a host-shareable type and returns 0 for WGSL.
1244*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool));
1245*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool2));
1246*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool3));
1247*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 0 == layout.size(*context.fTypes.fBool4));
1248*c8dee2aaSAndroid Build Coastguard Worker 
1249*c8dee2aaSAndroid Build Coastguard Worker     // Arrays
1250*c8dee2aaSAndroid Build Coastguard Worker     // array<f32, 4>
1251*c8dee2aaSAndroid Build Coastguard Worker     {
1252*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float[4]", *context.fTypes.fFloat, 4);
1253*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.size(*array));
1254*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 4 == layout.alignment(*array));
1255*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 4 == layout.stride(*array));
1256*c8dee2aaSAndroid Build Coastguard Worker     }
1257*c8dee2aaSAndroid Build Coastguard Worker     // array<f16, 4>
1258*c8dee2aaSAndroid Build Coastguard Worker     {
1259*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "half[4]", *context.fTypes.fHalf, 4);
1260*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 8 == layout.size(*array));
1261*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 2 == layout.alignment(*array));
1262*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 2 == layout.stride(*array));
1263*c8dee2aaSAndroid Build Coastguard Worker     }
1264*c8dee2aaSAndroid Build Coastguard Worker     // array<vec2<f32>, 4>
1265*c8dee2aaSAndroid Build Coastguard Worker     {
1266*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float2[4]", *context.fTypes.fFloat2, 4);
1267*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 32 == layout.size(*array));
1268*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 8 == layout.alignment(*array));
1269*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 8 == layout.stride(*array));
1270*c8dee2aaSAndroid Build Coastguard Worker     }
1271*c8dee2aaSAndroid Build Coastguard Worker     // array<vec3<f32>, 4>
1272*c8dee2aaSAndroid Build Coastguard Worker     {
1273*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float3[4]", *context.fTypes.fFloat3, 4);
1274*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
1275*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
1276*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
1277*c8dee2aaSAndroid Build Coastguard Worker     }
1278*c8dee2aaSAndroid Build Coastguard Worker     // array<vec4<f32>, 4>
1279*c8dee2aaSAndroid Build Coastguard Worker     {
1280*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "float4[4]", *context.fTypes.fFloat4, 4);
1281*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 64 == layout.size(*array));
1282*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
1283*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.stride(*array));
1284*c8dee2aaSAndroid Build Coastguard Worker     }
1285*c8dee2aaSAndroid Build Coastguard Worker     // array<mat3x3<f32>, 4>
1286*c8dee2aaSAndroid Build Coastguard Worker     {
1287*c8dee2aaSAndroid Build Coastguard Worker         auto array = SkSL::Type::MakeArrayType(context, "mat3[4]", *context.fTypes.fFloat3x3, 4);
1288*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 192 == layout.size(*array));
1289*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 16 == layout.alignment(*array));
1290*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, 48 == layout.stride(*array));
1291*c8dee2aaSAndroid Build Coastguard Worker     }
1292*c8dee2aaSAndroid Build Coastguard Worker 
1293*c8dee2aaSAndroid Build Coastguard Worker     // Structs A and B from example in https://www.w3.org/TR/WGSL/#structure-member-layout
1294*c8dee2aaSAndroid Build Coastguard Worker     //
1295*c8dee2aaSAndroid Build Coastguard Worker     // struct A {        //            align(8)               size(24)
1296*c8dee2aaSAndroid Build Coastguard Worker     //     u: f32,       // offset(0)  align(4)               size(4)
1297*c8dee2aaSAndroid Build Coastguard Worker     //     v: f32,       // offset(4)  align(4)               size(4)
1298*c8dee2aaSAndroid Build Coastguard Worker     //     w: vec2<f32>, // offset(8)  align(8)               size(8)
1299*c8dee2aaSAndroid Build Coastguard Worker     //     x: f32        // offset(16) align(4)               size(4)
1300*c8dee2aaSAndroid Build Coastguard Worker     //     // padding    // offset(20)                        size(4)
1301*c8dee2aaSAndroid Build Coastguard Worker     // }
1302*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields;
1303*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1304*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1305*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1306*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("u"),
1307*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1308*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1309*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1310*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1311*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("v"),
1312*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1313*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1314*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1315*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1316*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("w"),
1317*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
1318*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1319*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1320*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1321*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("x"),
1322*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1323*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structA = SkSL::Type::MakeStructType(
1324*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("A"), std::move(fields));
1325*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 24 == layout.size(*structA));
1326*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 8 == layout.alignment(*structA));
1327*c8dee2aaSAndroid Build Coastguard Worker     fields = {};
1328*c8dee2aaSAndroid Build Coastguard Worker 
1329*c8dee2aaSAndroid Build Coastguard Worker     // struct B {          //             align(16) size(160)
1330*c8dee2aaSAndroid Build Coastguard Worker     //     a: vec2<f32>,   // offset(0)   align(8)  size(8)
1331*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(8)             size(8)
1332*c8dee2aaSAndroid Build Coastguard Worker     //     b: vec3<f32>,   // offset(16)  align(16) size(12)
1333*c8dee2aaSAndroid Build Coastguard Worker     //     c: f32,         // offset(28)  align(4)  size(4)
1334*c8dee2aaSAndroid Build Coastguard Worker     //     d: f32,         // offset(32)  align(4)  size(4)
1335*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(36)            size(4)
1336*c8dee2aaSAndroid Build Coastguard Worker     //     e: A,           // offset(40)  align(8)  size(24)
1337*c8dee2aaSAndroid Build Coastguard Worker     //     f: vec3<f32>,   // offset(64)  align(16) size(12)
1338*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(76)            size(4)
1339*c8dee2aaSAndroid Build Coastguard Worker     //     g: array<A, 3>, // offset(80)  align(16) size(72)
1340*c8dee2aaSAndroid Build Coastguard Worker     //     h: i32          // offset(152) align(4)  size(4)
1341*c8dee2aaSAndroid Build Coastguard Worker     //     // padding      // offset(156)           size(4)
1342*c8dee2aaSAndroid Build Coastguard Worker     // }
1343*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1344*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1345*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1346*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("a"),
1347*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat2.get());
1348*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1349*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1350*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1351*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("b"),
1352*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
1353*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1354*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1355*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1356*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("c"),
1357*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1358*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1359*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1360*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1361*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("d"),
1362*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat.get());
1363*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1364*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1365*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1366*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("e"),
1367*c8dee2aaSAndroid Build Coastguard Worker                         structA.get());
1368*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1369*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1370*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1371*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("f"),
1372*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fFloat3.get());
1373*c8dee2aaSAndroid Build Coastguard Worker     auto array = SkSL::Type::MakeArrayType(context, "A[3]", *structA, 3);
1374*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1375*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1376*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1377*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("g"),
1378*c8dee2aaSAndroid Build Coastguard Worker                         array.get());
1379*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1380*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1381*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1382*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("h"),
1383*c8dee2aaSAndroid Build Coastguard Worker                         context.fTypes.fInt.get());
1384*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkSL::Type> structB = SkSL::Type::MakeStructType(
1385*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("B"), std::move(fields));
1386*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 160 == layout.size(*structB));
1387*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, 16 == layout.alignment(*structB));
1388*c8dee2aaSAndroid Build Coastguard Worker }
1389*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_WGSLUnsupportedTypes,r)1390*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_WGSLUnsupportedTypes, r) {
1391*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
1392*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
1393*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
1394*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
1395*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
1396*c8dee2aaSAndroid Build Coastguard Worker 
1397*c8dee2aaSAndroid Build Coastguard Worker     auto testArray = SkSL::Type::MakeArrayType(context, "bool[3]", *context.fTypes.fBool, 3);
1398*c8dee2aaSAndroid Build Coastguard Worker 
1399*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields;
1400*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1401*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1402*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1403*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("foo"),
1404*c8dee2aaSAndroid Build Coastguard Worker                         testArray.get());
1405*c8dee2aaSAndroid Build Coastguard Worker     auto testStruct = SkSL::Type::MakeStructType(
1406*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("Test"), std::move(fields));
1407*c8dee2aaSAndroid Build Coastguard Worker 
1408*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::kWGSLUniform_EnableF16);
1409*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !layout.isSupported(*context.fTypes.fBool));
1410*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !layout.isSupported(*context.fTypes.fBool2));
1411*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !layout.isSupported(*context.fTypes.fBool3));
1412*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !layout.isSupported(*context.fTypes.fBool4));
1413*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !layout.isSupported(*testArray));
1414*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !layout.isSupported(*testStruct));
1415*c8dee2aaSAndroid Build Coastguard Worker }
1416*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkSLMemoryLayoutTest_WGSLSupportedTypes,r)1417*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLMemoryLayoutTest_WGSLSupportedTypes, r) {
1418*c8dee2aaSAndroid Build Coastguard Worker     SkSL::TestingOnly_AbortErrorReporter errors;
1419*c8dee2aaSAndroid Build Coastguard Worker     SkSL::BuiltinTypes types;
1420*c8dee2aaSAndroid Build Coastguard Worker     SkSL::Context context(types, errors);
1421*c8dee2aaSAndroid Build Coastguard Worker     SkSL::ProgramConfig config = {};
1422*c8dee2aaSAndroid Build Coastguard Worker     context.fConfig = &config;
1423*c8dee2aaSAndroid Build Coastguard Worker 
1424*c8dee2aaSAndroid Build Coastguard Worker     auto testArray = SkSL::Type::MakeArrayType(context, "float[3]", *context.fTypes.fFloat, 3);
1425*c8dee2aaSAndroid Build Coastguard Worker 
1426*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkSL::Field> fields;
1427*c8dee2aaSAndroid Build Coastguard Worker     fields.emplace_back(SkSL::Position(),
1428*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::Layout(),
1429*c8dee2aaSAndroid Build Coastguard Worker                         SkSL::ModifierFlag::kNone,
1430*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view("foo"),
1431*c8dee2aaSAndroid Build Coastguard Worker                         testArray.get());
1432*c8dee2aaSAndroid Build Coastguard Worker     auto testStruct = SkSL::Type::MakeStructType(
1433*c8dee2aaSAndroid Build Coastguard Worker             context, SkSL::Position(), std::string_view("Test"), std::move(fields));
1434*c8dee2aaSAndroid Build Coastguard Worker 
1435*c8dee2aaSAndroid Build Coastguard Worker     SkSL::MemoryLayout layout(SkSL::MemoryLayout::Standard::kWGSLUniform_EnableF16);
1436*c8dee2aaSAndroid Build Coastguard Worker 
1437*c8dee2aaSAndroid Build Coastguard Worker     // scalars (i32, u32, f32, f16)
1438*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fInt));
1439*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUInt));
1440*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fShort));
1441*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUShort));
1442*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat));
1443*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf));
1444*c8dee2aaSAndroid Build Coastguard Worker 
1445*c8dee2aaSAndroid Build Coastguard Worker     // vec2<T>, T: i32, u32, f32, f16
1446*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fInt2));
1447*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUInt2));
1448*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fShort2));
1449*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUShort2));
1450*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat2));
1451*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf2));
1452*c8dee2aaSAndroid Build Coastguard Worker 
1453*c8dee2aaSAndroid Build Coastguard Worker     // vec3<T>, T: i32, u32, f32, f16
1454*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fInt3));
1455*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUInt3));
1456*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fShort3));
1457*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUShort3));
1458*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat3));
1459*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf3));
1460*c8dee2aaSAndroid Build Coastguard Worker 
1461*c8dee2aaSAndroid Build Coastguard Worker     // vec4<T>, T: i32, u32, f32, f16
1462*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fInt4));
1463*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUInt4));
1464*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat4));
1465*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fShort4));
1466*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fUShort4));
1467*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf4));
1468*c8dee2aaSAndroid Build Coastguard Worker 
1469*c8dee2aaSAndroid Build Coastguard Worker     // mat2x2<f32>, mat2x2<f16>
1470*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat2x2));
1471*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf2x2));
1472*c8dee2aaSAndroid Build Coastguard Worker 
1473*c8dee2aaSAndroid Build Coastguard Worker     // mat3x2<f32>, mat3x2<f16>
1474*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat3x2));
1475*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf3x2));
1476*c8dee2aaSAndroid Build Coastguard Worker 
1477*c8dee2aaSAndroid Build Coastguard Worker     // mat4x2<f32>, mat4x2<f16>
1478*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat4x2));
1479*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf4x2));
1480*c8dee2aaSAndroid Build Coastguard Worker 
1481*c8dee2aaSAndroid Build Coastguard Worker     // mat2x3<f32>, mat2x3<f16>
1482*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat2x3));
1483*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf2x3));
1484*c8dee2aaSAndroid Build Coastguard Worker 
1485*c8dee2aaSAndroid Build Coastguard Worker     // mat3x3<f32>, mat3x3<f16>
1486*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat3x3));
1487*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf3x3));
1488*c8dee2aaSAndroid Build Coastguard Worker 
1489*c8dee2aaSAndroid Build Coastguard Worker     // mat4x3<f32>, mat4x3<f16>
1490*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat4x3));
1491*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf4x3));
1492*c8dee2aaSAndroid Build Coastguard Worker 
1493*c8dee2aaSAndroid Build Coastguard Worker     // mat2x4<f32>, mat2x4<f16>
1494*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat2x4));
1495*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf2x4));
1496*c8dee2aaSAndroid Build Coastguard Worker 
1497*c8dee2aaSAndroid Build Coastguard Worker     // mat3x4<f32>, mat3x4<f16>
1498*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat3x4));
1499*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf3x4));
1500*c8dee2aaSAndroid Build Coastguard Worker 
1501*c8dee2aaSAndroid Build Coastguard Worker     // mat4x4<f32>, mat4x4<f16>
1502*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fFloat4x4));
1503*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fHalf4x4));
1504*c8dee2aaSAndroid Build Coastguard Worker 
1505*c8dee2aaSAndroid Build Coastguard Worker     // atomic<u32>
1506*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*context.fTypes.fAtomicUInt));
1507*c8dee2aaSAndroid Build Coastguard Worker 
1508*c8dee2aaSAndroid Build Coastguard Worker     // arrays and structs
1509*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*testArray));
1510*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, layout.isSupported(*testStruct));
1511*c8dee2aaSAndroid Build Coastguard Worker }
1512