xref: /aosp_15_r20/external/skia/tests/graphite/UniformOffsetCalculatorTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2022 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "src/core/SkSLTypeShared.h"
9 #include "src/gpu/graphite/Uniform.h"
10 #include "src/gpu/graphite/UniformManager.h"
11 #include "tests/Test.h"
12 
13 using namespace skgpu::graphite;
14 
15 namespace {
16 
17 // Used to test the exact alignment and size of an individual type. Returns the alignment and size
18 // as a pair.
19 struct AlignmentAndSize {
20     int alignment;
21     int size;
22 };
calculate_alignment_and_size(Layout layout,SkSLType type,int arrayCount=Uniform::kNonArray)23 static AlignmentAndSize calculate_alignment_and_size(Layout layout,
24                                                      SkSLType type,
25                                                      int arrayCount = Uniform::kNonArray) {
26     // Set the start offset at 1 to force alignment.
27     constexpr int kStart = 1;
28     auto calc = UniformOffsetCalculator::ForTopLevel(layout, kStart);
29     int alignment = calc.advanceOffset(type, arrayCount);
30     return {alignment, calc.size() - alignment};
31 }
32 
calculate_struct_alignment_and_size(Layout layout,std::initializer_list<SkSLType> fields,int arrayCount=Uniform::kNonArray)33 static AlignmentAndSize calculate_struct_alignment_and_size(
34         Layout layout,
35         std::initializer_list<SkSLType> fields,
36         int arrayCount = Uniform::kNonArray) {
37     // Set the start offset at 1 to force alignment.
38     constexpr int kStart = 1;
39     auto outer = UniformOffsetCalculator::ForTopLevel(layout, kStart);
40 
41     auto substruct = UniformOffsetCalculator::ForStruct(layout);
42     for (SkSLType f : fields) {
43         substruct.advanceOffset(f);
44     }
45 
46     int alignment = outer.advanceStruct(substruct, arrayCount);
47     SkASSERT(alignment == substruct.requiredAlignment());
48     return {alignment, outer.size() - alignment};
49 }
50 
51 #define EXPECT(type, expectedAlignment, expectedSize)                                \
52     do {                                                                             \
53         auto [alignment, size] = calculate_alignment_and_size(kLayout, type);        \
54         REPORTER_ASSERT(r,                                                           \
55                         alignment == expectedAlignment,                              \
56                         "incorrect alignment for type '%s': expected %d, found %d",  \
57                         SkSLTypeString(type),                                        \
58                         expectedAlignment,                                           \
59                         alignment);                                                  \
60         REPORTER_ASSERT(r,                                                           \
61                         size == expectedSize,                                        \
62                         "incorrect size for type '%s': expected %d, found %d",       \
63                         SkSLTypeString(type),                                        \
64                         expectedSize,                                                \
65                         size);                                                       \
66     } while (0)
67 
68 #define EXPECT_ARRAY(type, expectedAlignment, expectedStride, expectedSize)           \
69     do {                                                                              \
70         auto [alignment, size] = calculate_alignment_and_size(kLayout, type, kCount); \
71         int stride = size / kCount;                                                   \
72         REPORTER_ASSERT(r,                                                            \
73                         alignment == expectedAlignment,                               \
74                         "incorrect alignment for type '%s': expected %d, found %d",   \
75                         SkSLTypeString(type),                                         \
76                         expectedAlignment,                                            \
77                         alignment);                                                   \
78         REPORTER_ASSERT(r,                                                            \
79                         size == expectedSize,                                         \
80                         "incorrect size for type '%s': expected %d, found %d",        \
81                         SkSLTypeString(type),                                         \
82                         expectedSize,                                                 \
83                         size);                                                        \
84         REPORTER_ASSERT(r,                                                            \
85                         stride == expectedStride,                                     \
86                         "incorrect stride for type '%s': expected %d, found %d",      \
87                         SkSLTypeString(type),                                         \
88                         expectedStride,                                               \
89                         stride);                                                      \
90     } while (0)
91 
92 #define EXPECT_STRUCT(expectedAlignment, expectedSize, ...)                      \
93     do {                                                                         \
94         auto [alignment, size] = calculate_struct_alignment_and_size(            \
95                                          kLayout, {__VA_ARGS__});                \
96         REPORTER_ASSERT(r,                                                       \
97                         alignment == expectedAlignment,                          \
98                         "incorrect alignment for struct: expected %d, found %d", \
99                         expectedAlignment,                                       \
100                         alignment);                                              \
101         REPORTER_ASSERT(r,                                                       \
102                         size == expectedSize,                                    \
103                         "incorrect size for struct: expected %d, found %d",      \
104                         expectedSize,                                            \
105                         size);                                                   \
106         REPORTER_ASSERT(r,                                                       \
107                         size % alignment == 0,                                   \
108                         "struct size must be a multiple of alignment");          \
109     } while (0)
110 
111 #define EXPECT_STRUCT_ARRAY(expectedAlignment, expectedStride, ...)               \
112     do {                                                                          \
113         auto [alignment, size] = calculate_struct_alignment_and_size(             \
114                                         kLayout, {__VA_ARGS__}, kCount);          \
115         int stride = size / kCount;                                               \
116         REPORTER_ASSERT(r,                                                        \
117                         alignment == expectedAlignment,                           \
118                         "incorrect alignment for struct: expected %d, found %d",  \
119                         expectedAlignment,                                        \
120                         alignment);                                               \
121         REPORTER_ASSERT(r,                                                        \
122                         size == kCount * expectedStride,                          \
123                         "incorrect size for struct array: expected %d, found %d", \
124                         kCount * expectedStride,                                  \
125                         size);                                                    \
126         REPORTER_ASSERT(r,                                                        \
127                         stride == expectedStride,                                 \
128                         "incorrect stride for struct: expected %d, found %d",     \
129                         expectedStride,                                           \
130                         stride);                                                  \
131         REPORTER_ASSERT(r,                                                        \
132                         stride % alignment == 0,                                  \
133                         "struct stride must be a multiple of alignment");         \
134     } while (0)
135 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorMetalBasicTypesTest,r,CtsEnforcement::kApiLevel_V)136 DEF_GRAPHITE_TEST(UniformOffsetCalculatorMetalBasicTypesTest, r, CtsEnforcement::kApiLevel_V) {
137     constexpr Layout kLayout = Layout::kMetal;
138 
139     // scalars: int, float, half (unsigned types are disallowed)
140     EXPECT(SkSLType::kInt,    /*alignment=*/4, /*size=*/4);
141     EXPECT(SkSLType::kFloat,  /*alignment=*/4, /*size=*/4);
142     EXPECT(SkSLType::kHalf,   /*alignment=*/2, /*size=*/2);
143 
144     // int2, float2, half2
145     EXPECT(SkSLType::kInt2,    /*alignment=*/8, /*size=*/8);
146     EXPECT(SkSLType::kFloat2,  /*alignment=*/8, /*size=*/8);
147     EXPECT(SkSLType::kHalf2,   /*alignment=*/4, /*size=*/4);
148 
149     // int3, float3, half3 (unlike std430, size is also rounded up)
150     EXPECT(SkSLType::kInt3,    /*alignment=*/16, /*size=*/16);
151     EXPECT(SkSLType::kFloat3,  /*alignment=*/16, /*size=*/16);
152     EXPECT(SkSLType::kHalf3,   /*alignment=*/8,  /*size=*/8);
153 
154     // int4, float4, half4
155     EXPECT(SkSLType::kInt4,    /*alignment=*/16, /*size=*/16);
156     EXPECT(SkSLType::kFloat4,  /*alignment=*/16, /*size=*/16);
157     EXPECT(SkSLType::kHalf4,   /*alignment=*/8,  /*size=*/8);
158 
159     // float2x2, half2x2
160     EXPECT(SkSLType::kFloat2x2, /*alignment=*/8, /*size=*/16);
161     EXPECT(SkSLType::kHalf2x2,  /*alignment=*/4, /*size=*/8);
162 
163     // float3x3, half3x3
164     EXPECT(SkSLType::kFloat3x3, /*alignment=*/16, /*size=*/48);
165     EXPECT(SkSLType::kHalf3x3,  /*alignment=*/8,  /*size=*/24);
166 
167     // float4x4, half4x4
168     EXPECT(SkSLType::kFloat4x4, /*alignment=*/16, /*size=*/64);
169     EXPECT(SkSLType::kHalf4x4,  /*alignment=*/8,  /*size=*/32);
170 }
171 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorMetalArrayTest,r,CtsEnforcement::kApiLevel_V)172 DEF_GRAPHITE_TEST(UniformOffsetCalculatorMetalArrayTest, r, CtsEnforcement::kApiLevel_V) {
173     constexpr Layout kLayout = Layout::kMetal;
174     constexpr int kCount = 3;
175 
176     // int[3], float[3], half[3]
177     EXPECT_ARRAY(SkSLType::kInt,   /*alignment=*/4, /*stride=*/4, /*size=*/12);
178     EXPECT_ARRAY(SkSLType::kFloat, /*alignment=*/4, /*stride=*/4, /*size=*/12);
179     EXPECT_ARRAY(SkSLType::kHalf,  /*alignment=*/2, /*stride=*/2, /*size=*/6);
180 
181     // int2[3], float2[3], half2[3]
182     EXPECT_ARRAY(SkSLType::kInt2,   /*alignment=*/8, /*stride=*/8, /*size=*/24);
183     EXPECT_ARRAY(SkSLType::kFloat2, /*alignment=*/8, /*stride=*/8, /*size=*/24);
184     EXPECT_ARRAY(SkSLType::kHalf2,  /*alignment=*/4, /*stride=*/4, /*size=*/12);
185 
186     // int3[3], float3[3], half3[3]
187     EXPECT_ARRAY(SkSLType::kInt3,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
188     EXPECT_ARRAY(SkSLType::kFloat3, /*alignment=*/16, /*stride=*/16, /*size=*/48);
189     EXPECT_ARRAY(SkSLType::kHalf3,  /*alignment=*/8,  /*stride=*/8,  /*size=*/24);
190 
191     // int4[3], float4[3], half4[3]
192     EXPECT_ARRAY(SkSLType::kInt4,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
193     EXPECT_ARRAY(SkSLType::kFloat4, /*alignment=*/16, /*stride=*/16, /*size=*/48);
194     EXPECT_ARRAY(SkSLType::kHalf4,  /*alignment=*/8,  /*stride=*/8,  /*size=*/24);
195 
196     // float2x2[3], half2x2[3]
197     EXPECT_ARRAY(SkSLType::kFloat2x2, /*alignment=*/8, /*stride=*/16, /*size=*/48);
198     EXPECT_ARRAY(SkSLType::kHalf2x2,  /*alignment=*/4, /*stride=*/8,  /*size=*/24);
199 
200     // float3x3[3], half3x3[3]
201     EXPECT_ARRAY(SkSLType::kFloat3x3, /*alignment=*/16, /*stride=*/48, /*size=*/144);
202     EXPECT_ARRAY(SkSLType::kHalf3x3,  /*alignment=*/8,  /*stride=*/24, /*size=*/72);
203 
204     // float4x4[3], half4x4[3]
205     EXPECT_ARRAY(SkSLType::kFloat4x4, /*alignment=*/16, /*stride=*/64, /*size=*/192);
206     EXPECT_ARRAY(SkSLType::kHalf4x4,  /*alignment=*/8,  /*stride=*/32, /*size=*/96);
207 }
208 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorMetalStructTest,r,CtsEnforcement::kNextRelease)209 DEF_GRAPHITE_TEST(UniformOffsetCalculatorMetalStructTest, r, CtsEnforcement::kNextRelease) {
210     constexpr Layout kLayout = Layout::kMetal;
211     constexpr int    kCount  = 3;
212 
213     EXPECT_STRUCT(/*alignment=*/16, /*size=*/32, /*fields=*/SkSLType::kFloat4,
214                                                             SkSLType::kFloat3);
215     EXPECT_STRUCT(/*alignment=*/16, /*size=*/32, /*fields=*/SkSLType::kFloat3,
216                                                             SkSLType::kFloat);
217     EXPECT_STRUCT(/*alignment=*/8,  /*size=*/16, /*fields=*/SkSLType::kFloat,
218                                                             SkSLType::kFloat2);
219     EXPECT_STRUCT(/*alignment=*/4,  /*size=*/4,  /*fields=*/SkSLType::kFloat);
220     EXPECT_STRUCT(/*alignment=*/4,  /*size=*/12, /*fields=*/SkSLType::kFloat,
221                                                             SkSLType::kFloat,
222                                                             SkSLType::kInt);
223     EXPECT_STRUCT(/*alignment=*/4,  /*size=*/8,  /*fields=*/SkSLType::kHalf2,
224                                                             SkSLType::kInt);
225 
226     EXPECT_STRUCT_ARRAY(/*alignment=*/16, /*stride=*/32, /*fields=*/SkSLType::kFloat4,
227                                                                     SkSLType::kFloat3);
228     EXPECT_STRUCT_ARRAY(/*alignment=*/8,  /*stride=*/16, /*fields=*/SkSLType::kFloat,
229                                                                     SkSLType::kFloat2);
230     EXPECT_STRUCT_ARRAY(/*alignment=*/4,  /*stride=*/4,  /*fields=*/SkSLType::kFloat);
231     EXPECT_STRUCT_ARRAY(/*alignment=*/4,  /*stride=*/12, /*fields=*/SkSLType::kFloat,
232                                                                     SkSLType::kFloat,
233                                                                     SkSLType::kInt);
234     EXPECT_STRUCT_ARRAY(/*alignment=*/4,  /*stride=*/8,  /*fields=*/SkSLType::kHalf2,
235                                                                     SkSLType::kInt);
236 }
237 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd430BasicTypesTest,r,CtsEnforcement::kApiLevel_V)238 DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd430BasicTypesTest, r, CtsEnforcement::kApiLevel_V) {
239     constexpr Layout kLayout = Layout::kStd430;
240 
241     // scalars: int, float, half (unsigned types are disallowed)
242     EXPECT(SkSLType::kInt,    /*alignment=*/4, /*size=*/4);
243     EXPECT(SkSLType::kFloat,  /*alignment=*/4, /*size=*/4);
244     EXPECT(SkSLType::kHalf,   /*alignment=*/4, /*size=*/4);
245 
246     // int2, float2, half2
247     EXPECT(SkSLType::kInt2,    /*alignment=*/8, /*size=*/8);
248     EXPECT(SkSLType::kFloat2,  /*alignment=*/8, /*size=*/8);
249     EXPECT(SkSLType::kHalf2,   /*alignment=*/8, /*size=*/8);
250 
251     // int3, float3, half3 (size is not rounded up for non-arrays of vec3s)
252     EXPECT(SkSLType::kInt3,    /*alignment=*/16, /*size=*/12);
253     EXPECT(SkSLType::kFloat3,  /*alignment=*/16, /*size=*/12);
254     EXPECT(SkSLType::kHalf3,   /*alignment=*/16, /*size=*/12);
255 
256     // int4, float4, half4
257     EXPECT(SkSLType::kInt4,    /*alignment=*/16, /*size=*/16);
258     EXPECT(SkSLType::kFloat4,  /*alignment=*/16, /*size=*/16);
259     EXPECT(SkSLType::kHalf4,   /*alignment=*/16, /*size=*/16);
260 
261     // float2x2, half2x2
262     EXPECT(SkSLType::kFloat2x2, /*alignment=*/8, /*size=*/16);
263     EXPECT(SkSLType::kHalf2x2,  /*alignment=*/8, /*size=*/16);
264 
265     // float3x3, half3x3
266     EXPECT(SkSLType::kFloat3x3, /*alignment=*/16, /*size=*/48);
267     EXPECT(SkSLType::kHalf3x3,  /*alignment=*/16, /*size=*/48);
268 
269     // float4x4, half4x4
270     EXPECT(SkSLType::kFloat4x4, /*alignment=*/16, /*size=*/64);
271     EXPECT(SkSLType::kHalf4x4,  /*alignment=*/16, /*size=*/64);
272 }
273 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd430ArrayTest,r,CtsEnforcement::kApiLevel_V)274 DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd430ArrayTest, r, CtsEnforcement::kApiLevel_V) {
275     constexpr Layout kLayout = Layout::kStd430;
276     constexpr int    kCount  = 3;
277 
278     // int[3], float[3], half[3]
279     EXPECT_ARRAY(SkSLType::kInt,   /*alignment=*/4, /*stride=*/4, /*size=*/12);
280     EXPECT_ARRAY(SkSLType::kFloat, /*alignment=*/4, /*stride=*/4, /*size=*/12);
281     EXPECT_ARRAY(SkSLType::kHalf,  /*alignment=*/4, /*stride=*/4, /*size=*/12);
282 
283     // int2[3], float2[3], half2[3]
284     EXPECT_ARRAY(SkSLType::kInt2,   /*alignment=*/8, /*stride=*/8, /*size=*/24);
285     EXPECT_ARRAY(SkSLType::kFloat2, /*alignment=*/8, /*stride=*/8, /*size=*/24);
286     EXPECT_ARRAY(SkSLType::kHalf2,  /*alignment=*/8, /*stride=*/8, /*size=*/24);
287 
288     // int3[3], float3[3], half3[3] (stride is rounded up in arrays)
289     EXPECT_ARRAY(SkSLType::kInt3,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
290     EXPECT_ARRAY(SkSLType::kFloat3, /*alignment=*/16, /*stride=*/16, /*size=*/48);
291     EXPECT_ARRAY(SkSLType::kHalf3,  /*alignment=*/16, /*stride=*/16, /*size=*/48);
292 
293     // int4[3], float4[3], half4[3]
294     EXPECT_ARRAY(SkSLType::kInt4,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
295     EXPECT_ARRAY(SkSLType::kFloat4, /*alignment=*/16, /*stride=*/16, /*size=*/48);
296     EXPECT_ARRAY(SkSLType::kHalf4,  /*alignment=*/16, /*stride=*/16, /*size=*/48);
297 
298     // float2x2[3], half2x2[3]
299     EXPECT_ARRAY(SkSLType::kFloat2x2, /*alignment=*/8, /*stride=*/16, /*size=*/48);
300     EXPECT_ARRAY(SkSLType::kHalf2x2,  /*alignment=*/8, /*stride=*/16, /*size=*/48);
301 
302     // float3x3[3], half3x3[3]
303     EXPECT_ARRAY(SkSLType::kFloat3x3, /*alignment=*/16, /*stride=*/48, /*size=*/144);
304     EXPECT_ARRAY(SkSLType::kHalf3x3,  /*alignment=*/16, /*stride=*/48, /*size=*/144);
305 
306     // float4x4[3], half4x4[3]
307     EXPECT_ARRAY(SkSLType::kFloat4x4, /*alignment=*/16, /*stride=*/64, /*size=*/192);
308     EXPECT_ARRAY(SkSLType::kHalf4x4,  /*alignment=*/16, /*stride=*/64, /*size=*/192);
309 }
310 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd430StructTest,r,CtsEnforcement::kNextRelease)311 DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd430StructTest, r, CtsEnforcement::kNextRelease) {
312     constexpr Layout kLayout = Layout::kStd430;
313     constexpr int    kCount  = 3;
314 
315     EXPECT_STRUCT(/*alignment=*/16, /*size=*/32, /*fields=*/SkSLType::kFloat4,
316                                                             SkSLType::kFloat3);
317     EXPECT_STRUCT(/*alignment=*/16, /*size=*/16, /*fields=*/SkSLType::kFloat3,
318                                                             SkSLType::kFloat);
319     EXPECT_STRUCT(/*alignment=*/8,  /*size=*/16, /*fields=*/SkSLType::kFloat,
320                                                             SkSLType::kFloat2);
321     EXPECT_STRUCT(/*alignment=*/4,  /*size=*/4,  /*fields=*/SkSLType::kFloat);
322     EXPECT_STRUCT(/*alignment=*/4,  /*size=*/12, /*fields=*/SkSLType::kFloat,
323                                                             SkSLType::kFloat,
324                                                             SkSLType::kInt);
325     EXPECT_STRUCT(/*alignment=*/8,  /*size=*/16, /*fields=*/SkSLType::kHalf2,
326                                                             SkSLType::kInt);
327 
328     EXPECT_STRUCT_ARRAY(/*alignment=*/16, /*stride=*/32, /*fields=*/SkSLType::kFloat4,
329                                                                     SkSLType::kFloat3);
330     EXPECT_STRUCT_ARRAY(/*alignment=*/8,  /*stride=*/16, /*fields=*/SkSLType::kFloat,
331                                                                     SkSLType::kFloat2);
332     EXPECT_STRUCT_ARRAY(/*alignment=*/4,  /*stride=*/4,  /*fields=*/SkSLType::kFloat);
333     EXPECT_STRUCT_ARRAY(/*alignment=*/4,  /*stride=*/12, /*fields=*/SkSLType::kFloat,
334                                                                     SkSLType::kFloat,
335                                                                     SkSLType::kInt);
336     EXPECT_STRUCT_ARRAY(/*alignment=*/8,  /*stride=*/16, /*fields=*/SkSLType::kHalf2,
337                                                                     SkSLType::kInt);
338 }
339 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd140BasicTypesTest,r,CtsEnforcement::kApiLevel_V)340 DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd140BasicTypesTest, r, CtsEnforcement::kApiLevel_V) {
341     constexpr Layout kLayout = Layout::kStd140;
342 
343     // scalars: int, float, half (unsigned types are disallowed)
344     EXPECT(SkSLType::kInt,    /*alignment=*/4, /*size=*/4);
345     EXPECT(SkSLType::kFloat,  /*alignment=*/4, /*size=*/4);
346     EXPECT(SkSLType::kHalf,   /*alignment=*/4, /*size=*/4);
347 
348     // int2, float2, half2
349     EXPECT(SkSLType::kInt2,    /*alignment=*/8, /*size=*/8);
350     EXPECT(SkSLType::kFloat2,  /*alignment=*/8, /*size=*/8);
351     EXPECT(SkSLType::kHalf2,   /*alignment=*/8, /*size=*/8);
352 
353     // int3, float3, half3 (size is not rounded up for non-arrays of vec3s)
354     EXPECT(SkSLType::kInt3,    /*alignment=*/16, /*size=*/12);
355     EXPECT(SkSLType::kFloat3,  /*alignment=*/16, /*size=*/12);
356     EXPECT(SkSLType::kHalf3,   /*alignment=*/16, /*size=*/12);
357 
358     // int4, float4, half4
359     EXPECT(SkSLType::kInt4,    /*alignment=*/16, /*size=*/16);
360     EXPECT(SkSLType::kFloat4,  /*alignment=*/16, /*size=*/16);
361     EXPECT(SkSLType::kHalf4,   /*alignment=*/16, /*size=*/16);
362 
363     // float2x2, half2x2
364     EXPECT(SkSLType::kFloat2x2, /*alignment=*/16, /*size=*/32);
365     EXPECT(SkSLType::kHalf2x2,  /*alignment=*/16, /*size=*/32);
366 
367     // float3x3, half3x3
368     EXPECT(SkSLType::kFloat3x3, /*alignment=*/16,  /*size=*/48);
369     EXPECT(SkSLType::kHalf3x3,  /*alignment=*/16,  /*size=*/48);
370 
371     // float4x4, half4x4
372     EXPECT(SkSLType::kFloat4x4, /*alignment=*/16, /*size=*/64);
373     EXPECT(SkSLType::kHalf4x4,  /*alignment=*/16, /*size=*/64);
374 }
375 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd140ArrayTest,r,CtsEnforcement::kApiLevel_V)376 DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd140ArrayTest, r, CtsEnforcement::kApiLevel_V) {
377     constexpr Layout kLayout = Layout::kStd140;
378     constexpr int    kCount  = 3;
379 
380     // int[3], float[3], half[3]
381     EXPECT_ARRAY(SkSLType::kInt,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
382     EXPECT_ARRAY(SkSLType::kFloat, /*alignment=*/16, /*stride=*/16, /*size=*/48);
383     EXPECT_ARRAY(SkSLType::kHalf,  /*alignment=*/16, /*stride=*/16, /*size=*/48);
384 
385     // int2[3], float2[3], half2[3]
386     EXPECT_ARRAY(SkSLType::kInt2,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
387     EXPECT_ARRAY(SkSLType::kFloat2, /*alignment=*/16, /*stride=*/16, /*size=*/48);
388     EXPECT_ARRAY(SkSLType::kHalf2,  /*alignment=*/16, /*stride=*/16, /*size=*/48);
389 
390     // int3[3], float3[3], half3[3]
391     EXPECT_ARRAY(SkSLType::kInt3,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
392     EXPECT_ARRAY(SkSLType::kFloat3, /*alignment=*/16, /*stride=*/16, /*size=*/48);
393     EXPECT_ARRAY(SkSLType::kHalf3,  /*alignment=*/16, /*stride=*/16, /*size=*/48);
394 
395     // int4[3], float4[3], half4[3]
396     EXPECT_ARRAY(SkSLType::kInt4,   /*alignment=*/16, /*stride=*/16, /*size=*/48);
397     EXPECT_ARRAY(SkSLType::kFloat4, /*alignment=*/16, /*stride=*/16, /*size=*/48);
398     EXPECT_ARRAY(SkSLType::kHalf4,  /*alignment=*/16, /*stride=*/16, /*size=*/48);
399 
400     // float2x2[3], half2x2[3]
401     EXPECT_ARRAY(SkSLType::kFloat2x2, /*alignment=*/16, /*stride=*/32, /*size=*/96);
402     EXPECT_ARRAY(SkSLType::kHalf2x2,  /*alignment=*/16, /*stride=*/32, /*size=*/96);
403 
404     // float3x3[3], half3x3[3]
405     EXPECT_ARRAY(SkSLType::kFloat3x3, /*alignment=*/16, /*stride=*/48, /*size=*/144);
406     EXPECT_ARRAY(SkSLType::kHalf3x3,  /*alignment=*/16, /*stride=*/48, /*size=*/144);
407 
408     // float4x4[3], half4x4[3]
409     EXPECT_ARRAY(SkSLType::kFloat4x4, /*alignment=*/16, /*stride=*/64, /*size=*/192);
410     EXPECT_ARRAY(SkSLType::kHalf4x4,  /*alignment=*/16, /*stride=*/64, /*size=*/192);
411 }
412 
DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd140StructTest,r,CtsEnforcement::kNextRelease)413 DEF_GRAPHITE_TEST(UniformOffsetCalculatorStd140StructTest, r, CtsEnforcement::kNextRelease) {
414     constexpr Layout kLayout = Layout::kStd140;
415     constexpr int    kCount  = 3;
416 
417     EXPECT_STRUCT(/*alignment=*/16, /*size=*/32, /*fields=*/SkSLType::kFloat4,
418                                                             SkSLType::kFloat3);
419     EXPECT_STRUCT(/*alignment=*/16, /*size=*/16, /*fields=*/SkSLType::kFloat3,
420                                                             SkSLType::kFloat);
421     EXPECT_STRUCT(/*alignment=*/16, /*size=*/16, /*fields=*/SkSLType::kFloat,
422                                                             SkSLType::kFloat2);
423     EXPECT_STRUCT(/*alignment=*/16, /*size=*/16, /*fields=*/SkSLType::kFloat);
424     EXPECT_STRUCT(/*alignment=*/16, /*size=*/16, /*fields=*/SkSLType::kFloat,
425                                                             SkSLType::kFloat,
426                                                             SkSLType::kInt);
427     EXPECT_STRUCT(/*alignment=*/16, /*size=*/16, /*fields=*/SkSLType::kHalf2,
428                                                             SkSLType::kInt);
429 
430     EXPECT_STRUCT_ARRAY(/*alignment=*/16, /*stride=*/32, /*fields=*/SkSLType::kFloat4,
431                                                                     SkSLType::kFloat3);
432     EXPECT_STRUCT_ARRAY(/*alignment=*/16, /*stride=*/16, /*fields=*/SkSLType::kFloat,
433                                                                     SkSLType::kFloat2);
434     EXPECT_STRUCT_ARRAY(/*alignment=*/16, /*stride=*/16, /*fields=*/SkSLType::kFloat);
435     EXPECT_STRUCT_ARRAY(/*alignment=*/16, /*stride=*/16, /*fields=*/SkSLType::kFloat,
436                                                                     SkSLType::kFloat,
437                                                                     SkSLType::kInt);
438     EXPECT_STRUCT_ARRAY(/*alignment=*/16, /*stride=*/16, /*fields=*/SkSLType::kHalf2,
439                                                                     SkSLType::kInt);
440 }
441 
442 }  // namespace
443