• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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::kArray_Kind, *context.fFloat_Type, 4);
84      REPORTER_ASSERT(r, 64 == layout.size(array1));
85      REPORTER_ASSERT(r, 16 == layout.alignment(array1));
86      REPORTER_ASSERT(r, 16 == layout.stride(array1));
87  
88      SkSL::Type array2(SkSL::String("float4[4]"), SkSL::Type::kArray_Kind, *context.fFloat4_Type, 4);
89      REPORTER_ASSERT(r, 64 == layout.size(array2));
90      REPORTER_ASSERT(r, 16 == layout.alignment(array2));
91      REPORTER_ASSERT(r, 16 == layout.stride(array2));
92  }
93  
DEF_TEST(SkSLMemoryLayout430Test,r)94  DEF_TEST(SkSLMemoryLayout430Test, r) {
95      SkSL::Context context;
96      SkSL::MemoryLayout layout(SkSL::MemoryLayout::k430_Standard);
97  
98      // basic types
99      REPORTER_ASSERT(r,  4 == layout.size(*context.fFloat_Type));
100      REPORTER_ASSERT(r,  8 == layout.size(*context.fFloat2_Type));
101      REPORTER_ASSERT(r, 12 == layout.size(*context.fFloat3_Type));
102      REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat4_Type));
103      REPORTER_ASSERT(r,  4 == layout.size(*context.fInt_Type));
104      REPORTER_ASSERT(r,  8 == layout.size(*context.fInt2_Type));
105      REPORTER_ASSERT(r, 12 == layout.size(*context.fInt3_Type));
106      REPORTER_ASSERT(r, 16 == layout.size(*context.fInt4_Type));
107      REPORTER_ASSERT(r,  1 == layout.size(*context.fBool_Type));
108      REPORTER_ASSERT(r,  2 == layout.size(*context.fBool2_Type));
109      REPORTER_ASSERT(r,  3 == layout.size(*context.fBool3_Type));
110      REPORTER_ASSERT(r,  4 == layout.size(*context.fBool4_Type));
111      REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat2x2_Type));
112      REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat2x4_Type));
113      REPORTER_ASSERT(r, 48 == layout.size(*context.fFloat3x3_Type));
114      REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat4x2_Type));
115      REPORTER_ASSERT(r, 64 == layout.size(*context.fFloat4x4_Type));
116      REPORTER_ASSERT(r,  4 == layout.alignment(*context.fFloat_Type));
117      REPORTER_ASSERT(r,  8 == layout.alignment(*context.fFloat2_Type));
118      REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3_Type));
119      REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4_Type));
120      REPORTER_ASSERT(r,  4 == layout.alignment(*context.fInt_Type));
121      REPORTER_ASSERT(r,  8 == layout.alignment(*context.fInt2_Type));
122      REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt3_Type));
123      REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt4_Type));
124      REPORTER_ASSERT(r,  1 == layout.alignment(*context.fBool_Type));
125      REPORTER_ASSERT(r,  2 == layout.alignment(*context.fBool2_Type));
126      REPORTER_ASSERT(r,  4 == layout.alignment(*context.fBool3_Type));
127      REPORTER_ASSERT(r,  4 == layout.alignment(*context.fBool4_Type));
128      REPORTER_ASSERT(r,  8 == layout.alignment(*context.fFloat2x2_Type));
129      REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat2x4_Type));
130      REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3x3_Type));
131      REPORTER_ASSERT(r,  8 == layout.alignment(*context.fFloat4x2_Type));
132      REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4x4_Type));
133  
134      // struct 1
135      std::vector<SkSL::Type::Field> fields1;
136      fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fFloat3_Type.get());
137      SkSL::Type s1(-1, SkSL::String("s1"), fields1);
138      REPORTER_ASSERT(r, 16 == layout.size(s1));
139      REPORTER_ASSERT(r, 16 == layout.alignment(s1));
140  
141      fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat_Type.get());
142      SkSL::Type s2(-1, SkSL::String("s2"), fields1);
143      REPORTER_ASSERT(r, 16 == layout.size(s2));
144      REPORTER_ASSERT(r, 16 == layout.alignment(s2));
145  
146      fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("c"), context.fBool_Type.get());
147      SkSL::Type s3(-1, SkSL::String("s3"), fields1);
148      REPORTER_ASSERT(r, 32 == layout.size(s3));
149      REPORTER_ASSERT(r, 16 == layout.alignment(s3));
150  
151      // struct 2
152      std::vector<SkSL::Type::Field> fields2;
153      fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fInt_Type.get());
154      SkSL::Type s4(-1, SkSL::String("s4"), fields2);
155      REPORTER_ASSERT(r, 4 == layout.size(s4));
156      REPORTER_ASSERT(r, 4 == layout.alignment(s4));
157  
158      fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat3_Type.get());
159      SkSL::Type s5(-1, SkSL::String("s5"), fields2);
160      REPORTER_ASSERT(r, 32 == layout.size(s5));
161      REPORTER_ASSERT(r, 16 == layout.alignment(s5));
162  
163      // arrays
164      SkSL::Type array1(SkSL::String("float[4]"), SkSL::Type::kArray_Kind, *context.fFloat_Type, 4);
165      REPORTER_ASSERT(r, 16 == layout.size(array1));
166      REPORTER_ASSERT(r, 4 == layout.alignment(array1));
167      REPORTER_ASSERT(r, 4 == layout.stride(array1));
168  
169      SkSL::Type array2(SkSL::String("float4[4]"), SkSL::Type::kArray_Kind, *context.fFloat4_Type, 4);
170      REPORTER_ASSERT(r, 64 == layout.size(array2));
171      REPORTER_ASSERT(r, 16 == layout.alignment(array2));
172      REPORTER_ASSERT(r, 16 == layout.stride(array2));
173  }
174