• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2016 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "test/opt/assembly_builder.h"
16 
17 #include "test/opt/pass_fixture.h"
18 #include "test/opt/pass_utils.h"
19 
20 namespace spvtools {
21 namespace opt {
22 namespace {
23 
24 using AssemblyBuilderTest = PassTest<::testing::Test>;
25 
TEST_F(AssemblyBuilderTest,MinimalShader)26 TEST_F(AssemblyBuilderTest, MinimalShader) {
27   AssemblyBuilder builder;
28   std::vector<const char*> expected = {
29       // clang-format off
30                     "OpCapability Shader",
31                     "OpCapability Float64",
32                "%1 = OpExtInstImport \"GLSL.std.450\"",
33                     "OpMemoryModel Logical GLSL450",
34                     "OpEntryPoint Vertex %main \"main\"",
35                     "OpName %void \"void\"",
36                     "OpName %main_func_type \"main_func_type\"",
37                     "OpName %main \"main\"",
38                     "OpName %main_func_entry_block \"main_func_entry_block\"",
39             "%void = OpTypeVoid",
40   "%main_func_type = OpTypeFunction %void",
41             "%main = OpFunction %void None %main_func_type",
42 "%main_func_entry_block = OpLabel",
43                     "OpReturn",
44                     "OpFunctionEnd",
45       // clang-format on
46   };
47 
48   SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
49                                   /* skip_nop = */ false);
50 }
51 
TEST_F(AssemblyBuilderTest,ShaderWithConstants)52 TEST_F(AssemblyBuilderTest, ShaderWithConstants) {
53   AssemblyBuilder builder;
54   builder
55       .AppendTypesConstantsGlobals({
56           // clang-format off
57           "%bool = OpTypeBool",
58       "%_PF_bool = OpTypePointer Function %bool",
59             "%bt = OpConstantTrue %bool",
60             "%bf = OpConstantFalse %bool",
61            "%int = OpTypeInt 32 1",
62        "%_PF_int = OpTypePointer Function %int",
63             "%si = OpConstant %int 1",
64           "%uint = OpTypeInt 32 0",
65       "%_PF_uint = OpTypePointer Function %uint",
66             "%ui = OpConstant %uint 2",
67          "%float = OpTypeFloat 32",
68      "%_PF_float = OpTypePointer Function %float",
69              "%f = OpConstant %float 3.1415",
70         "%double = OpTypeFloat 64",
71     "%_PF_double = OpTypePointer Function %double",
72              "%d = OpConstant %double 3.14159265358979",
73           // clang-format on
74       })
75       .AppendInMain({
76           // clang-format off
77           "%btv = OpVariable %_PF_bool Function",
78           "%bfv = OpVariable %_PF_bool Function",
79            "%iv = OpVariable %_PF_int Function",
80            "%uv = OpVariable %_PF_uint Function",
81            "%fv = OpVariable %_PF_float Function",
82            "%dv = OpVariable %_PF_double Function",
83                  "OpStore %btv %bt",
84                  "OpStore %bfv %bf",
85                  "OpStore %iv %si",
86                  "OpStore %uv %ui",
87                  "OpStore %fv %f",
88                  "OpStore %dv %d",
89           // clang-format on
90       });
91 
92   std::vector<const char*> expected = {
93       // clang-format off
94                 "OpCapability Shader",
95                 "OpCapability Float64",
96            "%1 = OpExtInstImport \"GLSL.std.450\"",
97                 "OpMemoryModel Logical GLSL450",
98                 "OpEntryPoint Vertex %main \"main\"",
99                 "OpName %void \"void\"",
100                 "OpName %main_func_type \"main_func_type\"",
101                 "OpName %main \"main\"",
102                 "OpName %main_func_entry_block \"main_func_entry_block\"",
103                 "OpName %bool \"bool\"",
104                 "OpName %_PF_bool \"_PF_bool\"",
105                 "OpName %bt \"bt\"",
106                 "OpName %bf \"bf\"",
107                 "OpName %int \"int\"",
108                 "OpName %_PF_int \"_PF_int\"",
109                 "OpName %si \"si\"",
110                 "OpName %uint \"uint\"",
111                 "OpName %_PF_uint \"_PF_uint\"",
112                 "OpName %ui \"ui\"",
113                 "OpName %float \"float\"",
114                 "OpName %_PF_float \"_PF_float\"",
115                 "OpName %f \"f\"",
116                 "OpName %double \"double\"",
117                 "OpName %_PF_double \"_PF_double\"",
118                 "OpName %d \"d\"",
119                 "OpName %btv \"btv\"",
120                 "OpName %bfv \"bfv\"",
121                 "OpName %iv \"iv\"",
122                 "OpName %uv \"uv\"",
123                 "OpName %fv \"fv\"",
124                 "OpName %dv \"dv\"",
125         "%void = OpTypeVoid",
126 "%main_func_type = OpTypeFunction %void",
127         "%bool = OpTypeBool",
128  "%_PF_bool = OpTypePointer Function %bool",
129           "%bt = OpConstantTrue %bool",
130           "%bf = OpConstantFalse %bool",
131          "%int = OpTypeInt 32 1",
132      "%_PF_int = OpTypePointer Function %int",
133           "%si = OpConstant %int 1",
134         "%uint = OpTypeInt 32 0",
135     "%_PF_uint = OpTypePointer Function %uint",
136           "%ui = OpConstant %uint 2",
137        "%float = OpTypeFloat 32",
138    "%_PF_float = OpTypePointer Function %float",
139            "%f = OpConstant %float 3.1415",
140       "%double = OpTypeFloat 64",
141   "%_PF_double = OpTypePointer Function %double",
142            "%d = OpConstant %double 3.14159265358979",
143         "%main = OpFunction %void None %main_func_type",
144 "%main_func_entry_block = OpLabel",
145          "%btv = OpVariable %_PF_bool Function",
146          "%bfv = OpVariable %_PF_bool Function",
147           "%iv = OpVariable %_PF_int Function",
148           "%uv = OpVariable %_PF_uint Function",
149           "%fv = OpVariable %_PF_float Function",
150           "%dv = OpVariable %_PF_double Function",
151                 "OpStore %btv %bt",
152                 "OpStore %bfv %bf",
153                 "OpStore %iv %si",
154                 "OpStore %uv %ui",
155                 "OpStore %fv %f",
156                 "OpStore %dv %d",
157                 "OpReturn",
158                 "OpFunctionEnd",
159       // clang-format on
160   };
161   SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
162                                   /* skip_nop = */ false);
163 }
164 
TEST_F(AssemblyBuilderTest,SpecConstants)165 TEST_F(AssemblyBuilderTest, SpecConstants) {
166   AssemblyBuilder builder;
167   builder.AppendTypesConstantsGlobals({
168       "%bool = OpTypeBool",
169       "%uint = OpTypeInt 32 0",
170       "%int = OpTypeInt 32 1",
171       "%float = OpTypeFloat 32",
172       "%double = OpTypeFloat 64",
173       "%v2int = OpTypeVector %int 2",
174 
175       "%spec_true = OpSpecConstantTrue %bool",
176       "%spec_false = OpSpecConstantFalse %bool",
177       "%spec_uint = OpSpecConstant %uint 1",
178       "%spec_int = OpSpecConstant %int 1",
179       "%spec_float = OpSpecConstant %float 1.25",
180       "%spec_double = OpSpecConstant %double 1.2345678",
181 
182       // Spec constants defined below should not have SpecID.
183       "%spec_add_op = OpSpecConstantOp %int IAdd %spec_int %spec_int",
184       "%spec_vec = OpSpecConstantComposite %v2int %spec_int %spec_int",
185       "%spec_vec_x = OpSpecConstantOp %int CompositeExtract %spec_vec 0",
186   });
187   std::vector<const char*> expected = {
188       // clang-format off
189                     "OpCapability Shader",
190                     "OpCapability Float64",
191                "%1 = OpExtInstImport \"GLSL.std.450\"",
192                     "OpMemoryModel Logical GLSL450",
193                     "OpEntryPoint Vertex %main \"main\"",
194                     "OpName %void \"void\"",
195                     "OpName %main_func_type \"main_func_type\"",
196                     "OpName %main \"main\"",
197                     "OpName %main_func_entry_block \"main_func_entry_block\"",
198                     "OpName %bool \"bool\"",
199                     "OpName %uint \"uint\"",
200                     "OpName %int \"int\"",
201                     "OpName %float \"float\"",
202                     "OpName %double \"double\"",
203                     "OpName %v2int \"v2int\"",
204                     "OpName %spec_true \"spec_true\"",
205                     "OpName %spec_false \"spec_false\"",
206                     "OpName %spec_uint \"spec_uint\"",
207                     "OpName %spec_int \"spec_int\"",
208                     "OpName %spec_float \"spec_float\"",
209                     "OpName %spec_double \"spec_double\"",
210                     "OpName %spec_add_op \"spec_add_op\"",
211                     "OpName %spec_vec \"spec_vec\"",
212                     "OpName %spec_vec_x \"spec_vec_x\"",
213                     "OpDecorate %spec_true SpecId 200",
214                     "OpDecorate %spec_false SpecId 201",
215                     "OpDecorate %spec_uint SpecId 202",
216                     "OpDecorate %spec_int SpecId 203",
217                     "OpDecorate %spec_float SpecId 204",
218                     "OpDecorate %spec_double SpecId 205",
219             "%void = OpTypeVoid",
220   "%main_func_type = OpTypeFunction %void",
221             "%bool = OpTypeBool",
222             "%uint = OpTypeInt 32 0",
223              "%int = OpTypeInt 32 1",
224            "%float = OpTypeFloat 32",
225           "%double = OpTypeFloat 64",
226            "%v2int = OpTypeVector %int 2",
227        "%spec_true = OpSpecConstantTrue %bool",
228       "%spec_false = OpSpecConstantFalse %bool",
229        "%spec_uint = OpSpecConstant %uint 1",
230         "%spec_int = OpSpecConstant %int 1",
231       "%spec_float = OpSpecConstant %float 1.25",
232      "%spec_double = OpSpecConstant %double 1.2345678",
233      "%spec_add_op = OpSpecConstantOp %int IAdd %spec_int %spec_int",
234         "%spec_vec = OpSpecConstantComposite %v2int %spec_int %spec_int",
235       "%spec_vec_x = OpSpecConstantOp %int CompositeExtract %spec_vec 0",
236             "%main = OpFunction %void None %main_func_type",
237 "%main_func_entry_block = OpLabel",
238                     "OpReturn",
239                     "OpFunctionEnd",
240 
241       // clang-format on
242   };
243 
244   SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
245                                   /* skip_nop = */ false);
246 }
247 
TEST_F(AssemblyBuilderTest,AppendNames)248 TEST_F(AssemblyBuilderTest, AppendNames) {
249   AssemblyBuilder builder;
250   builder.AppendNames({
251       "OpName %void \"another_name_for_void\"",
252       "I am an invalid OpName instruction and should not be added",
253       "OpName %main \"another name for main\"",
254   });
255   std::vector<const char*> expected = {
256       // clang-format off
257                     "OpCapability Shader",
258                     "OpCapability Float64",
259                "%1 = OpExtInstImport \"GLSL.std.450\"",
260                     "OpMemoryModel Logical GLSL450",
261                     "OpEntryPoint Vertex %main \"main\"",
262                     "OpName %void \"void\"",
263                     "OpName %main_func_type \"main_func_type\"",
264                     "OpName %main \"main\"",
265                     "OpName %main_func_entry_block \"main_func_entry_block\"",
266                     "OpName %void \"another_name_for_void\"",
267                     "OpName %main \"another name for main\"",
268             "%void = OpTypeVoid",
269   "%main_func_type = OpTypeFunction %void",
270             "%main = OpFunction %void None %main_func_type",
271 "%main_func_entry_block = OpLabel",
272                     "OpReturn",
273                     "OpFunctionEnd",
274       // clang-format on
275   };
276 
277   SinglePassRunAndCheck<NullPass>(builder.GetCode(), JoinAllInsts(expected),
278                                   /* skip_nop = */ false);
279 }
280 
281 }  // namespace
282 }  // namespace opt
283 }  // namespace spvtools
284