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