1 /*
2  * Copyright 2016 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/sksl/SkSLContext.h"
9 #include "src/sksl/SkSLMemoryLayout.h"
10 
11 #include "tests/Test.h"
12 
DEF_TEST(SkSLMemoryLayout140Test,r)13 DEF_TEST(SkSLMemoryLayout140Test, r) {
14     SkSL::Context context;
15     SkSL::MemoryLayout layout(SkSL::MemoryLayout::k140_Standard);
16 
17     // basic types
18     REPORTER_ASSERT(r,  4 == layout.size(*context.fFloat_Type));
19     REPORTER_ASSERT(r,  8 == layout.size(*context.fFloat2_Type));
20     REPORTER_ASSERT(r, 12 == layout.size(*context.fFloat3_Type));
21     REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat4_Type));
22     REPORTER_ASSERT(r,  4 == layout.size(*context.fInt_Type));
23     REPORTER_ASSERT(r,  8 == layout.size(*context.fInt2_Type));
24     REPORTER_ASSERT(r, 12 == layout.size(*context.fInt3_Type));
25     REPORTER_ASSERT(r, 16 == layout.size(*context.fInt4_Type));
26     REPORTER_ASSERT(r,  1 == layout.size(*context.fBool_Type));
27     REPORTER_ASSERT(r,  2 == layout.size(*context.fBool2_Type));
28     REPORTER_ASSERT(r,  3 == layout.size(*context.fBool3_Type));
29     REPORTER_ASSERT(r,  4 == layout.size(*context.fBool4_Type));
30     REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat2x2_Type));
31     REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat2x4_Type));
32     REPORTER_ASSERT(r, 48 == layout.size(*context.fFloat3x3_Type));
33     REPORTER_ASSERT(r, 64 == layout.size(*context.fFloat4x2_Type));
34     REPORTER_ASSERT(r, 64 == layout.size(*context.fFloat4x4_Type));
35     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fFloat_Type));
36     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fFloat2_Type));
37     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3_Type));
38     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4_Type));
39     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fInt_Type));
40     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fInt2_Type));
41     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt3_Type));
42     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt4_Type));
43     REPORTER_ASSERT(r,  1 == layout.alignment(*context.fBool_Type));
44     REPORTER_ASSERT(r,  2 == layout.alignment(*context.fBool2_Type));
45     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fBool3_Type));
46     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fBool4_Type));
47     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat2x2_Type));
48     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat2x4_Type));
49     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3x3_Type));
50     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4x2_Type));
51     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4x4_Type));
52 
53     // struct 1
54     std::vector<SkSL::Type::Field> fields1;
55     fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fFloat3_Type.get());
56     SkSL::Type s1(-1, SkSL::String("s1"), fields1);
57     REPORTER_ASSERT(r, 16 == layout.size(s1));
58     REPORTER_ASSERT(r, 16 == layout.alignment(s1));
59 
60     fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat_Type.get());
61     SkSL::Type s2(-1, SkSL::String("s2"), fields1);
62     REPORTER_ASSERT(r, 16 == layout.size(s2));
63     REPORTER_ASSERT(r, 16 == layout.alignment(s2));
64 
65     fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("c"), context.fBool_Type.get());
66     SkSL::Type s3(-1, SkSL::String("s3"), fields1);
67     REPORTER_ASSERT(r, 32 == layout.size(s3));
68     REPORTER_ASSERT(r, 16 == layout.alignment(s3));
69 
70     // struct 2
71     std::vector<SkSL::Type::Field> fields2;
72     fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fInt_Type.get());
73     SkSL::Type s4(-1, SkSL::String("s4"), fields2);
74     REPORTER_ASSERT(r, 16 == layout.size(s4));
75     REPORTER_ASSERT(r, 16 == layout.alignment(s4));
76 
77     fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat3_Type.get());
78     SkSL::Type s5(-1, SkSL::String("s5"), fields2);
79     REPORTER_ASSERT(r, 32 == layout.size(s5));
80     REPORTER_ASSERT(r, 16 == layout.alignment(s5));
81 
82     // arrays
83     SkSL::Type array1(SkSL::String("float[4]"), SkSL::Type::TypeKind::kArray, *context.fFloat_Type,
84                       4);
85     REPORTER_ASSERT(r, 64 == layout.size(array1));
86     REPORTER_ASSERT(r, 16 == layout.alignment(array1));
87     REPORTER_ASSERT(r, 16 == layout.stride(array1));
88 
89     SkSL::Type array2(SkSL::String("float4[4]"), SkSL::Type::TypeKind::kArray,
90                       *context.fFloat4_Type, 4);
91     REPORTER_ASSERT(r, 64 == layout.size(array2));
92     REPORTER_ASSERT(r, 16 == layout.alignment(array2));
93     REPORTER_ASSERT(r, 16 == layout.stride(array2));
94 }
95 
DEF_TEST(SkSLMemoryLayout430Test,r)96 DEF_TEST(SkSLMemoryLayout430Test, r) {
97     SkSL::Context context;
98     SkSL::MemoryLayout layout(SkSL::MemoryLayout::k430_Standard);
99 
100     // basic types
101     REPORTER_ASSERT(r,  4 == layout.size(*context.fFloat_Type));
102     REPORTER_ASSERT(r,  8 == layout.size(*context.fFloat2_Type));
103     REPORTER_ASSERT(r, 12 == layout.size(*context.fFloat3_Type));
104     REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat4_Type));
105     REPORTER_ASSERT(r,  4 == layout.size(*context.fInt_Type));
106     REPORTER_ASSERT(r,  8 == layout.size(*context.fInt2_Type));
107     REPORTER_ASSERT(r, 12 == layout.size(*context.fInt3_Type));
108     REPORTER_ASSERT(r, 16 == layout.size(*context.fInt4_Type));
109     REPORTER_ASSERT(r,  1 == layout.size(*context.fBool_Type));
110     REPORTER_ASSERT(r,  2 == layout.size(*context.fBool2_Type));
111     REPORTER_ASSERT(r,  3 == layout.size(*context.fBool3_Type));
112     REPORTER_ASSERT(r,  4 == layout.size(*context.fBool4_Type));
113     REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat2x2_Type));
114     REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat2x4_Type));
115     REPORTER_ASSERT(r, 48 == layout.size(*context.fFloat3x3_Type));
116     REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat4x2_Type));
117     REPORTER_ASSERT(r, 64 == layout.size(*context.fFloat4x4_Type));
118     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fFloat_Type));
119     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fFloat2_Type));
120     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3_Type));
121     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4_Type));
122     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fInt_Type));
123     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fInt2_Type));
124     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt3_Type));
125     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt4_Type));
126     REPORTER_ASSERT(r,  1 == layout.alignment(*context.fBool_Type));
127     REPORTER_ASSERT(r,  2 == layout.alignment(*context.fBool2_Type));
128     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fBool3_Type));
129     REPORTER_ASSERT(r,  4 == layout.alignment(*context.fBool4_Type));
130     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fFloat2x2_Type));
131     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat2x4_Type));
132     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3x3_Type));
133     REPORTER_ASSERT(r,  8 == layout.alignment(*context.fFloat4x2_Type));
134     REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4x4_Type));
135 
136     // struct 1
137     std::vector<SkSL::Type::Field> fields1;
138     fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fFloat3_Type.get());
139     SkSL::Type s1(-1, SkSL::String("s1"), fields1);
140     REPORTER_ASSERT(r, 16 == layout.size(s1));
141     REPORTER_ASSERT(r, 16 == layout.alignment(s1));
142 
143     fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat_Type.get());
144     SkSL::Type s2(-1, SkSL::String("s2"), fields1);
145     REPORTER_ASSERT(r, 16 == layout.size(s2));
146     REPORTER_ASSERT(r, 16 == layout.alignment(s2));
147 
148     fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("c"), context.fBool_Type.get());
149     SkSL::Type s3(-1, SkSL::String("s3"), fields1);
150     REPORTER_ASSERT(r, 32 == layout.size(s3));
151     REPORTER_ASSERT(r, 16 == layout.alignment(s3));
152 
153     // struct 2
154     std::vector<SkSL::Type::Field> fields2;
155     fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fInt_Type.get());
156     SkSL::Type s4(-1, SkSL::String("s4"), fields2);
157     REPORTER_ASSERT(r, 4 == layout.size(s4));
158     REPORTER_ASSERT(r, 4 == layout.alignment(s4));
159 
160     fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat3_Type.get());
161     SkSL::Type s5(-1, SkSL::String("s5"), fields2);
162     REPORTER_ASSERT(r, 32 == layout.size(s5));
163     REPORTER_ASSERT(r, 16 == layout.alignment(s5));
164 
165     // arrays
166     SkSL::Type array1(SkSL::String("float[4]"), SkSL::Type::TypeKind::kArray, *context.fFloat_Type,
167                       4);
168     REPORTER_ASSERT(r, 16 == layout.size(array1));
169     REPORTER_ASSERT(r, 4 == layout.alignment(array1));
170     REPORTER_ASSERT(r, 4 == layout.stride(array1));
171 
172     SkSL::Type array2(SkSL::String("float4[4]"), SkSL::Type::TypeKind::kArray,
173                       *context.fFloat4_Type, 4);
174     REPORTER_ASSERT(r, 64 == layout.size(array2));
175     REPORTER_ASSERT(r, 16 == layout.alignment(array2));
176     REPORTER_ASSERT(r, 16 == layout.stride(array2));
177 }
178