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