1fd4e5da5Sopenharmony_ci// Copyright (c) 2017 Valve Corporation
2fd4e5da5Sopenharmony_ci// Copyright (c) 2017 LunarG Inc.
3fd4e5da5Sopenharmony_ci//
4fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
5fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License.
6fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at
7fd4e5da5Sopenharmony_ci//
8fd4e5da5Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
9fd4e5da5Sopenharmony_ci//
10fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
11fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
12fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and
14fd4e5da5Sopenharmony_ci// limitations under the License.
15fd4e5da5Sopenharmony_ci
16fd4e5da5Sopenharmony_ci#include <string>
17fd4e5da5Sopenharmony_ci
18fd4e5da5Sopenharmony_ci#include "test/opt/pass_fixture.h"
19fd4e5da5Sopenharmony_ci#include "test/opt/pass_utils.h"
20fd4e5da5Sopenharmony_ci
21fd4e5da5Sopenharmony_cinamespace spvtools {
22fd4e5da5Sopenharmony_cinamespace opt {
23fd4e5da5Sopenharmony_cinamespace {
24fd4e5da5Sopenharmony_ci
25fd4e5da5Sopenharmony_ciusing InlineOpaqueTest = PassTest<::testing::Test>;
26fd4e5da5Sopenharmony_ci
27fd4e5da5Sopenharmony_ciTEST_F(InlineOpaqueTest, InlineCallWithStructArgContainingSampledImage) {
28fd4e5da5Sopenharmony_ci  // Function with opaque argument is inlined.
29fd4e5da5Sopenharmony_ci  // TODO(greg-lunarg): Add HLSL code
30fd4e5da5Sopenharmony_ci
31fd4e5da5Sopenharmony_ci  const std::string predefs_1 =
32fd4e5da5Sopenharmony_ci      R"(OpCapability Shader
33fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "GLSL.std.450"
34fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
35fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main" %outColor %texCoords
36fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft
37fd4e5da5Sopenharmony_ciOpSource GLSL 140
38fd4e5da5Sopenharmony_ciOpName %main "main"
39fd4e5da5Sopenharmony_ciOpName %S_t "S_t"
40fd4e5da5Sopenharmony_ciOpMemberName %S_t 0 "v0"
41fd4e5da5Sopenharmony_ciOpMemberName %S_t 1 "v1"
42fd4e5da5Sopenharmony_ciOpMemberName %S_t 2 "smp"
43fd4e5da5Sopenharmony_ciOpName %foo_struct_S_t_vf2_vf21_ "foo(struct-S_t-vf2-vf21;"
44fd4e5da5Sopenharmony_ciOpName %s "s"
45fd4e5da5Sopenharmony_ciOpName %outColor "outColor"
46fd4e5da5Sopenharmony_ciOpName %sampler15 "sampler15"
47fd4e5da5Sopenharmony_ciOpName %s0 "s0"
48fd4e5da5Sopenharmony_ciOpName %texCoords "texCoords"
49fd4e5da5Sopenharmony_ciOpName %param "param"
50fd4e5da5Sopenharmony_ci)";
51fd4e5da5Sopenharmony_ci
52fd4e5da5Sopenharmony_ci  const std::string name = R"(OpName %return_value "return_value"
53fd4e5da5Sopenharmony_ci)";
54fd4e5da5Sopenharmony_ci
55fd4e5da5Sopenharmony_ci  const std::string predefs_2 = R"(OpDecorate %sampler15 DescriptorSet 0
56fd4e5da5Sopenharmony_ci%void = OpTypeVoid
57fd4e5da5Sopenharmony_ci%13 = OpTypeFunction %void
58fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
59fd4e5da5Sopenharmony_ci%v2float = OpTypeVector %float 2
60fd4e5da5Sopenharmony_ci%v4float = OpTypeVector %float 4
61fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float
62fd4e5da5Sopenharmony_ci%outColor = OpVariable %_ptr_Output_v4float Output
63fd4e5da5Sopenharmony_ci%18 = OpTypeImage %float 2D 0 0 0 1 Unknown
64fd4e5da5Sopenharmony_ci%19 = OpTypeSampledImage %18
65fd4e5da5Sopenharmony_ci%S_t = OpTypeStruct %v2float %v2float %19
66fd4e5da5Sopenharmony_ci%_ptr_Function_S_t = OpTypePointer Function %S_t
67fd4e5da5Sopenharmony_ci%21 = OpTypeFunction %void %_ptr_Function_S_t
68fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_19 = OpTypePointer UniformConstant %19
69fd4e5da5Sopenharmony_ci%_ptr_Function_19 = OpTypePointer Function %19
70fd4e5da5Sopenharmony_ci%sampler15 = OpVariable %_ptr_UniformConstant_19 UniformConstant
71fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 1
72fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
73fd4e5da5Sopenharmony_ci%int_2 = OpConstant %int 2
74fd4e5da5Sopenharmony_ci%_ptr_Function_v2float = OpTypePointer Function %v2float
75fd4e5da5Sopenharmony_ci%_ptr_Input_v2float = OpTypePointer Input %v2float
76fd4e5da5Sopenharmony_ci%texCoords = OpVariable %_ptr_Input_v2float Input
77fd4e5da5Sopenharmony_ci)";
78fd4e5da5Sopenharmony_ci
79fd4e5da5Sopenharmony_ci  const std::string before =
80fd4e5da5Sopenharmony_ci      R"(%main = OpFunction %void None %13
81fd4e5da5Sopenharmony_ci%29 = OpLabel
82fd4e5da5Sopenharmony_ci%s0 = OpVariable %_ptr_Function_S_t Function
83fd4e5da5Sopenharmony_ci%param = OpVariable %_ptr_Function_S_t Function
84fd4e5da5Sopenharmony_ci%30 = OpLoad %v2float %texCoords
85fd4e5da5Sopenharmony_ci%31 = OpAccessChain %_ptr_Function_v2float %s0 %int_0
86fd4e5da5Sopenharmony_ciOpStore %31 %30
87fd4e5da5Sopenharmony_ci%32 = OpLoad %19 %sampler15
88fd4e5da5Sopenharmony_ci%33 = OpAccessChain %_ptr_Function_19 %s0 %int_2
89fd4e5da5Sopenharmony_ciOpStore %33 %32
90fd4e5da5Sopenharmony_ci%34 = OpLoad %S_t %s0
91fd4e5da5Sopenharmony_ciOpStore %param %34
92fd4e5da5Sopenharmony_ci%return_value = OpFunctionCall %void %foo_struct_S_t_vf2_vf21_ %param
93fd4e5da5Sopenharmony_ciOpReturn
94fd4e5da5Sopenharmony_ciOpFunctionEnd
95fd4e5da5Sopenharmony_ci)";
96fd4e5da5Sopenharmony_ci
97fd4e5da5Sopenharmony_ci  const std::string after =
98fd4e5da5Sopenharmony_ci      R"(%main = OpFunction %void None %13
99fd4e5da5Sopenharmony_ci%29 = OpLabel
100fd4e5da5Sopenharmony_ci%s0 = OpVariable %_ptr_Function_S_t Function
101fd4e5da5Sopenharmony_ci%param = OpVariable %_ptr_Function_S_t Function
102fd4e5da5Sopenharmony_ci%30 = OpLoad %v2float %texCoords
103fd4e5da5Sopenharmony_ci%31 = OpAccessChain %_ptr_Function_v2float %s0 %int_0
104fd4e5da5Sopenharmony_ciOpStore %31 %30
105fd4e5da5Sopenharmony_ci%32 = OpLoad %19 %sampler15
106fd4e5da5Sopenharmony_ci%33 = OpAccessChain %_ptr_Function_19 %s0 %int_2
107fd4e5da5Sopenharmony_ciOpStore %33 %32
108fd4e5da5Sopenharmony_ci%34 = OpLoad %S_t %s0
109fd4e5da5Sopenharmony_ciOpStore %param %34
110fd4e5da5Sopenharmony_ci%42 = OpAccessChain %_ptr_Function_19 %param %int_2
111fd4e5da5Sopenharmony_ci%43 = OpLoad %19 %42
112fd4e5da5Sopenharmony_ci%44 = OpAccessChain %_ptr_Function_v2float %param %int_0
113fd4e5da5Sopenharmony_ci%45 = OpLoad %v2float %44
114fd4e5da5Sopenharmony_ci%46 = OpImageSampleImplicitLod %v4float %43 %45
115fd4e5da5Sopenharmony_ciOpStore %outColor %46
116fd4e5da5Sopenharmony_ciOpReturn
117fd4e5da5Sopenharmony_ciOpFunctionEnd
118fd4e5da5Sopenharmony_ci)";
119fd4e5da5Sopenharmony_ci
120fd4e5da5Sopenharmony_ci  const std::string post_defs =
121fd4e5da5Sopenharmony_ci      R"(%foo_struct_S_t_vf2_vf21_ = OpFunction %void None %21
122fd4e5da5Sopenharmony_ci%s = OpFunctionParameter %_ptr_Function_S_t
123fd4e5da5Sopenharmony_ci%35 = OpLabel
124fd4e5da5Sopenharmony_ci%36 = OpAccessChain %_ptr_Function_19 %s %int_2
125fd4e5da5Sopenharmony_ci%37 = OpLoad %19 %36
126fd4e5da5Sopenharmony_ci%38 = OpAccessChain %_ptr_Function_v2float %s %int_0
127fd4e5da5Sopenharmony_ci%39 = OpLoad %v2float %38
128fd4e5da5Sopenharmony_ci%40 = OpImageSampleImplicitLod %v4float %37 %39
129fd4e5da5Sopenharmony_ciOpStore %outColor %40
130fd4e5da5Sopenharmony_ciOpReturn
131fd4e5da5Sopenharmony_ciOpFunctionEnd
132fd4e5da5Sopenharmony_ci)";
133fd4e5da5Sopenharmony_ci
134fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<InlineOpaquePass>(
135fd4e5da5Sopenharmony_ci      predefs_1 + name + predefs_2 + before + post_defs,
136fd4e5da5Sopenharmony_ci      predefs_1 + predefs_2 + after + post_defs, true, true);
137fd4e5da5Sopenharmony_ci}
138fd4e5da5Sopenharmony_ci
139fd4e5da5Sopenharmony_ciTEST_F(InlineOpaqueTest, InlineOpaqueReturn) {
140fd4e5da5Sopenharmony_ci  // Function with opaque return value is inlined.
141fd4e5da5Sopenharmony_ci  // TODO(greg-lunarg): Add HLSL code
142fd4e5da5Sopenharmony_ci
143fd4e5da5Sopenharmony_ci  const std::string predefs =
144fd4e5da5Sopenharmony_ci      R"(OpCapability Shader
145fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "GLSL.std.450"
146fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
147fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main" %texCoords %outColor
148fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft
149fd4e5da5Sopenharmony_ciOpSource GLSL 140
150fd4e5da5Sopenharmony_ciOpName %main "main"
151fd4e5da5Sopenharmony_ciOpName %foo_ "foo("
152fd4e5da5Sopenharmony_ciOpName %texCoords "texCoords"
153fd4e5da5Sopenharmony_ciOpName %outColor "outColor"
154fd4e5da5Sopenharmony_ciOpName %sampler15 "sampler15"
155fd4e5da5Sopenharmony_ciOpName %sampler16 "sampler16"
156fd4e5da5Sopenharmony_ciOpDecorate %sampler15 DescriptorSet 0
157fd4e5da5Sopenharmony_ciOpDecorate %sampler16 DescriptorSet 0
158fd4e5da5Sopenharmony_ci%void = OpTypeVoid
159fd4e5da5Sopenharmony_ci%9 = OpTypeFunction %void
160fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
161fd4e5da5Sopenharmony_ci%v2float = OpTypeVector %float 2
162fd4e5da5Sopenharmony_ci%bool = OpTypeBool
163fd4e5da5Sopenharmony_ci%false = OpConstantFalse %bool
164fd4e5da5Sopenharmony_ci%_ptr_Input_v2float = OpTypePointer Input %v2float
165fd4e5da5Sopenharmony_ci%texCoords = OpVariable %_ptr_Input_v2float Input
166fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
167fd4e5da5Sopenharmony_ci%16 = OpConstantComposite %v2float %float_0 %float_0
168fd4e5da5Sopenharmony_ci%v4float = OpTypeVector %float 4
169fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float
170fd4e5da5Sopenharmony_ci%outColor = OpVariable %_ptr_Output_v4float Output
171fd4e5da5Sopenharmony_ci%19 = OpTypeImage %float 2D 0 0 0 1 Unknown
172fd4e5da5Sopenharmony_ci%20 = OpTypeSampledImage %19
173fd4e5da5Sopenharmony_ci%21 = OpTypeFunction %20
174fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_20 = OpTypePointer UniformConstant %20
175fd4e5da5Sopenharmony_ci%_ptr_Function_20 = OpTypePointer Function %20
176fd4e5da5Sopenharmony_ci%sampler15 = OpVariable %_ptr_UniformConstant_20 UniformConstant
177fd4e5da5Sopenharmony_ci%sampler16 = OpVariable %_ptr_UniformConstant_20 UniformConstant
178fd4e5da5Sopenharmony_ci)";
179fd4e5da5Sopenharmony_ci
180fd4e5da5Sopenharmony_ci  const std::string before =
181fd4e5da5Sopenharmony_ci      R"(%main = OpFunction %void None %9
182fd4e5da5Sopenharmony_ci%24 = OpLabel
183fd4e5da5Sopenharmony_ci%25 = OpVariable %_ptr_Function_20 Function
184fd4e5da5Sopenharmony_ci%26 = OpFunctionCall %20 %foo_
185fd4e5da5Sopenharmony_ciOpStore %25 %26
186fd4e5da5Sopenharmony_ci%27 = OpLoad %20 %25
187fd4e5da5Sopenharmony_ci%28 = OpLoad %v2float %texCoords
188fd4e5da5Sopenharmony_ci%29 = OpImageSampleImplicitLod %v4float %27 %28
189fd4e5da5Sopenharmony_ciOpStore %outColor %29
190fd4e5da5Sopenharmony_ciOpReturn
191fd4e5da5Sopenharmony_ciOpFunctionEnd
192fd4e5da5Sopenharmony_ci)";
193fd4e5da5Sopenharmony_ci
194fd4e5da5Sopenharmony_ci  const std::string after =
195fd4e5da5Sopenharmony_ci      R"(%main = OpFunction %void None %9
196fd4e5da5Sopenharmony_ci%24 = OpLabel
197fd4e5da5Sopenharmony_ci%34 = OpVariable %_ptr_Function_20 Function
198fd4e5da5Sopenharmony_ci%35 = OpVariable %_ptr_Function_20 Function
199fd4e5da5Sopenharmony_ci%25 = OpVariable %_ptr_Function_20 Function
200fd4e5da5Sopenharmony_ci%37 = OpLoad %20 %sampler16
201fd4e5da5Sopenharmony_ciOpStore %34 %37
202fd4e5da5Sopenharmony_ci%38 = OpLoad %20 %34
203fd4e5da5Sopenharmony_ciOpStore %35 %38
204fd4e5da5Sopenharmony_ci%26 = OpLoad %20 %35
205fd4e5da5Sopenharmony_ciOpStore %25 %26
206fd4e5da5Sopenharmony_ci%27 = OpLoad %20 %25
207fd4e5da5Sopenharmony_ci%28 = OpLoad %v2float %texCoords
208fd4e5da5Sopenharmony_ci%29 = OpImageSampleImplicitLod %v4float %27 %28
209fd4e5da5Sopenharmony_ciOpStore %outColor %29
210fd4e5da5Sopenharmony_ciOpReturn
211fd4e5da5Sopenharmony_ciOpFunctionEnd
212fd4e5da5Sopenharmony_ci)";
213fd4e5da5Sopenharmony_ci
214fd4e5da5Sopenharmony_ci  const std::string post_defs =
215fd4e5da5Sopenharmony_ci      R"(%foo_ = OpFunction %20 None %21
216fd4e5da5Sopenharmony_ci%30 = OpLabel
217fd4e5da5Sopenharmony_ci%31 = OpVariable %_ptr_Function_20 Function
218fd4e5da5Sopenharmony_ci%32 = OpLoad %20 %sampler16
219fd4e5da5Sopenharmony_ciOpStore %31 %32
220fd4e5da5Sopenharmony_ci%33 = OpLoad %20 %31
221fd4e5da5Sopenharmony_ciOpReturnValue %33
222fd4e5da5Sopenharmony_ciOpFunctionEnd
223fd4e5da5Sopenharmony_ci)";
224fd4e5da5Sopenharmony_ci
225fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<InlineOpaquePass>(
226fd4e5da5Sopenharmony_ci      predefs + before + post_defs, predefs + after + post_defs, true, true);
227fd4e5da5Sopenharmony_ci}
228fd4e5da5Sopenharmony_ci
229fd4e5da5Sopenharmony_ciTEST_F(InlineOpaqueTest, InlineOpaqueForLinkage) {
230fd4e5da5Sopenharmony_ci  const std::string predefs_1 =
231fd4e5da5Sopenharmony_ci      R"(OpCapability Shader
232fd4e5da5Sopenharmony_ciOpCapability Linkage
233fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "GLSL.std.450"
234fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
235fd4e5da5Sopenharmony_ciOpSource HLSL 630
236fd4e5da5Sopenharmony_ciOpName %main "main"
237fd4e5da5Sopenharmony_ciOpName %S_t "S_t"
238fd4e5da5Sopenharmony_ciOpMemberName %S_t 0 "v0"
239fd4e5da5Sopenharmony_ciOpMemberName %S_t 1 "v1"
240fd4e5da5Sopenharmony_ciOpMemberName %S_t 2 "smp"
241fd4e5da5Sopenharmony_ciOpName %foo_struct_S_t_vf2_vf21_ "foo(struct-S_t-vf2-vf21;"
242fd4e5da5Sopenharmony_ciOpName %s "s"
243fd4e5da5Sopenharmony_ciOpName %outColor "outColor"
244fd4e5da5Sopenharmony_ciOpName %sampler15 "sampler15"
245fd4e5da5Sopenharmony_ciOpName %s0 "s0"
246fd4e5da5Sopenharmony_ciOpName %texCoords "texCoords"
247fd4e5da5Sopenharmony_ciOpName %param "param"
248fd4e5da5Sopenharmony_ciOpDecorate %main LinkageAttributes "main" Export
249fd4e5da5Sopenharmony_ci)";
250fd4e5da5Sopenharmony_ci
251fd4e5da5Sopenharmony_ci  const std::string name = R"(OpName %return_value "return_value"
252fd4e5da5Sopenharmony_ci)";
253fd4e5da5Sopenharmony_ci
254fd4e5da5Sopenharmony_ci  const std::string predefs_2 = R"(OpDecorate %sampler15 DescriptorSet 0
255fd4e5da5Sopenharmony_ci%void = OpTypeVoid
256fd4e5da5Sopenharmony_ci%13 = OpTypeFunction %void
257fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
258fd4e5da5Sopenharmony_ci%v2float = OpTypeVector %float 2
259fd4e5da5Sopenharmony_ci%v4float = OpTypeVector %float 4
260fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float
261fd4e5da5Sopenharmony_ci%outColor = OpVariable %_ptr_Output_v4float Output
262fd4e5da5Sopenharmony_ci%18 = OpTypeImage %float 2D 0 0 0 1 Unknown
263fd4e5da5Sopenharmony_ci%19 = OpTypeSampledImage %18
264fd4e5da5Sopenharmony_ci%S_t = OpTypeStruct %v2float %v2float %19
265fd4e5da5Sopenharmony_ci%_ptr_Function_S_t = OpTypePointer Function %S_t
266fd4e5da5Sopenharmony_ci%21 = OpTypeFunction %void %_ptr_Function_S_t
267fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_19 = OpTypePointer UniformConstant %19
268fd4e5da5Sopenharmony_ci%_ptr_Function_19 = OpTypePointer Function %19
269fd4e5da5Sopenharmony_ci%sampler15 = OpVariable %_ptr_UniformConstant_19 UniformConstant
270fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 1
271fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
272fd4e5da5Sopenharmony_ci%int_2 = OpConstant %int 2
273fd4e5da5Sopenharmony_ci%_ptr_Function_v2float = OpTypePointer Function %v2float
274fd4e5da5Sopenharmony_ci%_ptr_Input_v2float = OpTypePointer Input %v2float
275fd4e5da5Sopenharmony_ci%texCoords = OpVariable %_ptr_Input_v2float Input
276fd4e5da5Sopenharmony_ci)";
277fd4e5da5Sopenharmony_ci
278fd4e5da5Sopenharmony_ci  const std::string before =
279fd4e5da5Sopenharmony_ci      R"(%main = OpFunction %void None %13
280fd4e5da5Sopenharmony_ci%29 = OpLabel
281fd4e5da5Sopenharmony_ci%s0 = OpVariable %_ptr_Function_S_t Function
282fd4e5da5Sopenharmony_ci%param = OpVariable %_ptr_Function_S_t Function
283fd4e5da5Sopenharmony_ci%30 = OpLoad %v2float %texCoords
284fd4e5da5Sopenharmony_ci%31 = OpAccessChain %_ptr_Function_v2float %s0 %int_0
285fd4e5da5Sopenharmony_ciOpStore %31 %30
286fd4e5da5Sopenharmony_ci%32 = OpLoad %19 %sampler15
287fd4e5da5Sopenharmony_ci%33 = OpAccessChain %_ptr_Function_19 %s0 %int_2
288fd4e5da5Sopenharmony_ciOpStore %33 %32
289fd4e5da5Sopenharmony_ci%34 = OpLoad %S_t %s0
290fd4e5da5Sopenharmony_ciOpStore %param %34
291fd4e5da5Sopenharmony_ci%return_value = OpFunctionCall %void %foo_struct_S_t_vf2_vf21_ %param
292fd4e5da5Sopenharmony_ciOpReturn
293fd4e5da5Sopenharmony_ciOpFunctionEnd
294fd4e5da5Sopenharmony_ci)";
295fd4e5da5Sopenharmony_ci
296fd4e5da5Sopenharmony_ci  const std::string after =
297fd4e5da5Sopenharmony_ci      R"(%main = OpFunction %void None %13
298fd4e5da5Sopenharmony_ci%29 = OpLabel
299fd4e5da5Sopenharmony_ci%s0 = OpVariable %_ptr_Function_S_t Function
300fd4e5da5Sopenharmony_ci%param = OpVariable %_ptr_Function_S_t Function
301fd4e5da5Sopenharmony_ci%30 = OpLoad %v2float %texCoords
302fd4e5da5Sopenharmony_ci%31 = OpAccessChain %_ptr_Function_v2float %s0 %int_0
303fd4e5da5Sopenharmony_ciOpStore %31 %30
304fd4e5da5Sopenharmony_ci%32 = OpLoad %19 %sampler15
305fd4e5da5Sopenharmony_ci%33 = OpAccessChain %_ptr_Function_19 %s0 %int_2
306fd4e5da5Sopenharmony_ciOpStore %33 %32
307fd4e5da5Sopenharmony_ci%34 = OpLoad %S_t %s0
308fd4e5da5Sopenharmony_ciOpStore %param %34
309fd4e5da5Sopenharmony_ci%42 = OpAccessChain %_ptr_Function_19 %param %int_2
310fd4e5da5Sopenharmony_ci%43 = OpLoad %19 %42
311fd4e5da5Sopenharmony_ci%44 = OpAccessChain %_ptr_Function_v2float %param %int_0
312fd4e5da5Sopenharmony_ci%45 = OpLoad %v2float %44
313fd4e5da5Sopenharmony_ci%46 = OpImageSampleImplicitLod %v4float %43 %45
314fd4e5da5Sopenharmony_ciOpStore %outColor %46
315fd4e5da5Sopenharmony_ciOpReturn
316fd4e5da5Sopenharmony_ciOpFunctionEnd
317fd4e5da5Sopenharmony_ci)";
318fd4e5da5Sopenharmony_ci
319fd4e5da5Sopenharmony_ci  const std::string post_defs =
320fd4e5da5Sopenharmony_ci      R"(%foo_struct_S_t_vf2_vf21_ = OpFunction %void None %21
321fd4e5da5Sopenharmony_ci%s = OpFunctionParameter %_ptr_Function_S_t
322fd4e5da5Sopenharmony_ci%35 = OpLabel
323fd4e5da5Sopenharmony_ci%36 = OpAccessChain %_ptr_Function_19 %s %int_2
324fd4e5da5Sopenharmony_ci%37 = OpLoad %19 %36
325fd4e5da5Sopenharmony_ci%38 = OpAccessChain %_ptr_Function_v2float %s %int_0
326fd4e5da5Sopenharmony_ci%39 = OpLoad %v2float %38
327fd4e5da5Sopenharmony_ci%40 = OpImageSampleImplicitLod %v4float %37 %39
328fd4e5da5Sopenharmony_ciOpStore %outColor %40
329fd4e5da5Sopenharmony_ciOpReturn
330fd4e5da5Sopenharmony_ciOpFunctionEnd
331fd4e5da5Sopenharmony_ci)";
332fd4e5da5Sopenharmony_ci
333fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<InlineOpaquePass>(
334fd4e5da5Sopenharmony_ci      predefs_1 + name + predefs_2 + before + post_defs,
335fd4e5da5Sopenharmony_ci      predefs_1 + predefs_2 + after + post_defs, true, true);
336fd4e5da5Sopenharmony_ci}
337fd4e5da5Sopenharmony_ci
338fd4e5da5Sopenharmony_ciTEST_F(InlineOpaqueTest, InlineInNonEntryPointFunction) {
339fd4e5da5Sopenharmony_ci  // This demonstrates opaque inlining in a function that is not
340fd4e5da5Sopenharmony_ci  // an entry point function (main2) but is in the call tree of an
341fd4e5da5Sopenharmony_ci  // entry point function (main).
342fd4e5da5Sopenharmony_ci  // TODO(greg-lunarg): Add HLSL code
343fd4e5da5Sopenharmony_ci
344fd4e5da5Sopenharmony_ci  const std::string predefs =
345fd4e5da5Sopenharmony_ci      R"(OpCapability Shader
346fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "GLSL.std.450"
347fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
348fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main" %outColor %texCoords
349fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft
350fd4e5da5Sopenharmony_ciOpSource GLSL 140
351fd4e5da5Sopenharmony_ciOpName %main "main"
352fd4e5da5Sopenharmony_ciOpName %main2 "main2"
353fd4e5da5Sopenharmony_ciOpName %S_t "S_t"
354fd4e5da5Sopenharmony_ciOpMemberName %S_t 0 "v0"
355fd4e5da5Sopenharmony_ciOpMemberName %S_t 1 "v1"
356fd4e5da5Sopenharmony_ciOpMemberName %S_t 2 "smp"
357fd4e5da5Sopenharmony_ciOpName %foo_struct_S_t_vf2_vf21_ "foo(struct-S_t-vf2-vf21;"
358fd4e5da5Sopenharmony_ciOpName %s "s"
359fd4e5da5Sopenharmony_ciOpName %outColor "outColor"
360fd4e5da5Sopenharmony_ciOpName %sampler15 "sampler15"
361fd4e5da5Sopenharmony_ciOpName %s0 "s0"
362fd4e5da5Sopenharmony_ciOpName %texCoords "texCoords"
363fd4e5da5Sopenharmony_ciOpName %param "param"
364fd4e5da5Sopenharmony_ciOpDecorate %sampler15 DescriptorSet 0
365fd4e5da5Sopenharmony_ci%void = OpTypeVoid
366fd4e5da5Sopenharmony_ci%13 = OpTypeFunction %void
367fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
368fd4e5da5Sopenharmony_ci%v2float = OpTypeVector %float 2
369fd4e5da5Sopenharmony_ci%v4float = OpTypeVector %float 4
370fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float
371fd4e5da5Sopenharmony_ci%outColor = OpVariable %_ptr_Output_v4float Output
372fd4e5da5Sopenharmony_ci%18 = OpTypeImage %float 2D 0 0 0 1 Unknown
373fd4e5da5Sopenharmony_ci%19 = OpTypeSampledImage %18
374fd4e5da5Sopenharmony_ci%S_t = OpTypeStruct %v2float %v2float %19
375fd4e5da5Sopenharmony_ci%_ptr_Function_S_t = OpTypePointer Function %S_t
376fd4e5da5Sopenharmony_ci%21 = OpTypeFunction %void %_ptr_Function_S_t
377fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_19 = OpTypePointer UniformConstant %19
378fd4e5da5Sopenharmony_ci%_ptr_Function_19 = OpTypePointer Function %19
379fd4e5da5Sopenharmony_ci%sampler15 = OpVariable %_ptr_UniformConstant_19 UniformConstant
380fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 1
381fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
382fd4e5da5Sopenharmony_ci%int_2 = OpConstant %int 2
383fd4e5da5Sopenharmony_ci%_ptr_Function_v2float = OpTypePointer Function %v2float
384fd4e5da5Sopenharmony_ci%_ptr_Input_v2float = OpTypePointer Input %v2float
385fd4e5da5Sopenharmony_ci%texCoords = OpVariable %_ptr_Input_v2float Input
386fd4e5da5Sopenharmony_ci)";
387fd4e5da5Sopenharmony_ci
388fd4e5da5Sopenharmony_ci  const std::string before =
389fd4e5da5Sopenharmony_ci      R"(%main2 = OpFunction %void None %13
390fd4e5da5Sopenharmony_ci%29 = OpLabel
391fd4e5da5Sopenharmony_ci%s0 = OpVariable %_ptr_Function_S_t Function
392fd4e5da5Sopenharmony_ci%param = OpVariable %_ptr_Function_S_t Function
393fd4e5da5Sopenharmony_ci%30 = OpLoad %v2float %texCoords
394fd4e5da5Sopenharmony_ci%31 = OpAccessChain %_ptr_Function_v2float %s0 %int_0
395fd4e5da5Sopenharmony_ciOpStore %31 %30
396fd4e5da5Sopenharmony_ci%32 = OpLoad %19 %sampler15
397fd4e5da5Sopenharmony_ci%33 = OpAccessChain %_ptr_Function_19 %s0 %int_2
398fd4e5da5Sopenharmony_ciOpStore %33 %32
399fd4e5da5Sopenharmony_ci%34 = OpLoad %S_t %s0
400fd4e5da5Sopenharmony_ciOpStore %param %34
401fd4e5da5Sopenharmony_ci%35 = OpFunctionCall %void %foo_struct_S_t_vf2_vf21_ %param
402fd4e5da5Sopenharmony_ciOpReturn
403fd4e5da5Sopenharmony_ciOpFunctionEnd
404fd4e5da5Sopenharmony_ci)";
405fd4e5da5Sopenharmony_ci
406fd4e5da5Sopenharmony_ci  const std::string after =
407fd4e5da5Sopenharmony_ci      R"(%main2 = OpFunction %void None %13
408fd4e5da5Sopenharmony_ci%29 = OpLabel
409fd4e5da5Sopenharmony_ci%s0 = OpVariable %_ptr_Function_S_t Function
410fd4e5da5Sopenharmony_ci%param = OpVariable %_ptr_Function_S_t Function
411fd4e5da5Sopenharmony_ci%30 = OpLoad %v2float %texCoords
412fd4e5da5Sopenharmony_ci%31 = OpAccessChain %_ptr_Function_v2float %s0 %int_0
413fd4e5da5Sopenharmony_ciOpStore %31 %30
414fd4e5da5Sopenharmony_ci%32 = OpLoad %19 %sampler15
415fd4e5da5Sopenharmony_ci%33 = OpAccessChain %_ptr_Function_19 %s0 %int_2
416fd4e5da5Sopenharmony_ciOpStore %33 %32
417fd4e5da5Sopenharmony_ci%34 = OpLoad %S_t %s0
418fd4e5da5Sopenharmony_ciOpStore %param %34
419fd4e5da5Sopenharmony_ci%45 = OpAccessChain %_ptr_Function_19 %param %int_2
420fd4e5da5Sopenharmony_ci%46 = OpLoad %19 %45
421fd4e5da5Sopenharmony_ci%47 = OpAccessChain %_ptr_Function_v2float %param %int_0
422fd4e5da5Sopenharmony_ci%48 = OpLoad %v2float %47
423fd4e5da5Sopenharmony_ci%49 = OpImageSampleImplicitLod %v4float %46 %48
424fd4e5da5Sopenharmony_ciOpStore %outColor %49
425fd4e5da5Sopenharmony_ciOpReturn
426fd4e5da5Sopenharmony_ciOpFunctionEnd
427fd4e5da5Sopenharmony_ci)";
428fd4e5da5Sopenharmony_ci
429fd4e5da5Sopenharmony_ci  const std::string post_defs =
430fd4e5da5Sopenharmony_ci      R"(%main = OpFunction %void None %13
431fd4e5da5Sopenharmony_ci%36 = OpLabel
432fd4e5da5Sopenharmony_ci%37 = OpFunctionCall %void %main2
433fd4e5da5Sopenharmony_ciOpReturn
434fd4e5da5Sopenharmony_ciOpFunctionEnd
435fd4e5da5Sopenharmony_ci%foo_struct_S_t_vf2_vf21_ = OpFunction %void None %21
436fd4e5da5Sopenharmony_ci%s = OpFunctionParameter %_ptr_Function_S_t
437fd4e5da5Sopenharmony_ci%38 = OpLabel
438fd4e5da5Sopenharmony_ci%39 = OpAccessChain %_ptr_Function_19 %s %int_2
439fd4e5da5Sopenharmony_ci%40 = OpLoad %19 %39
440fd4e5da5Sopenharmony_ci%41 = OpAccessChain %_ptr_Function_v2float %s %int_0
441fd4e5da5Sopenharmony_ci%42 = OpLoad %v2float %41
442fd4e5da5Sopenharmony_ci%43 = OpImageSampleImplicitLod %v4float %40 %42
443fd4e5da5Sopenharmony_ciOpStore %outColor %43
444fd4e5da5Sopenharmony_ciOpReturn
445fd4e5da5Sopenharmony_ciOpFunctionEnd
446fd4e5da5Sopenharmony_ci)";
447fd4e5da5Sopenharmony_ci
448fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<InlineOpaquePass>(
449fd4e5da5Sopenharmony_ci      predefs + before + post_defs, predefs + after + post_defs, true, true);
450fd4e5da5Sopenharmony_ci}
451fd4e5da5Sopenharmony_ci
452fd4e5da5Sopenharmony_ciTEST_F(InlineOpaqueTest, NoInlineNoOpaque) {
453fd4e5da5Sopenharmony_ci  // Function without opaque interface is not inlined.
454fd4e5da5Sopenharmony_ci  // #version 140
455fd4e5da5Sopenharmony_ci  //
456fd4e5da5Sopenharmony_ci  // in vec4 BaseColor;
457fd4e5da5Sopenharmony_ci  //
458fd4e5da5Sopenharmony_ci  // float foo(vec4 bar)
459fd4e5da5Sopenharmony_ci  // {
460fd4e5da5Sopenharmony_ci  //     return bar.x + bar.y;
461fd4e5da5Sopenharmony_ci  // }
462fd4e5da5Sopenharmony_ci  //
463fd4e5da5Sopenharmony_ci  // void main()
464fd4e5da5Sopenharmony_ci  // {
465fd4e5da5Sopenharmony_ci  //     vec4 color = vec4(foo(BaseColor));
466fd4e5da5Sopenharmony_ci  //     gl_FragColor = color;
467fd4e5da5Sopenharmony_ci  // }
468fd4e5da5Sopenharmony_ci
469fd4e5da5Sopenharmony_ci  const std::string assembly =
470fd4e5da5Sopenharmony_ci      R"(OpCapability Shader
471fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "GLSL.std.450"
472fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
473fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main" %BaseColor %gl_FragColor
474fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft
475fd4e5da5Sopenharmony_ciOpSource GLSL 140
476fd4e5da5Sopenharmony_ciOpName %main "main"
477fd4e5da5Sopenharmony_ciOpName %foo_vf4_ "foo(vf4;"
478fd4e5da5Sopenharmony_ciOpName %bar "bar"
479fd4e5da5Sopenharmony_ciOpName %color "color"
480fd4e5da5Sopenharmony_ciOpName %BaseColor "BaseColor"
481fd4e5da5Sopenharmony_ciOpName %param "param"
482fd4e5da5Sopenharmony_ciOpName %gl_FragColor "gl_FragColor"
483fd4e5da5Sopenharmony_ci%void = OpTypeVoid
484fd4e5da5Sopenharmony_ci%10 = OpTypeFunction %void
485fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
486fd4e5da5Sopenharmony_ci%v4float = OpTypeVector %float 4
487fd4e5da5Sopenharmony_ci%_ptr_Function_v4float = OpTypePointer Function %v4float
488fd4e5da5Sopenharmony_ci%14 = OpTypeFunction %float %_ptr_Function_v4float
489fd4e5da5Sopenharmony_ci%uint = OpTypeInt 32 0
490fd4e5da5Sopenharmony_ci%uint_0 = OpConstant %uint 0
491fd4e5da5Sopenharmony_ci%_ptr_Function_float = OpTypePointer Function %float
492fd4e5da5Sopenharmony_ci%uint_1 = OpConstant %uint 1
493fd4e5da5Sopenharmony_ci%_ptr_Input_v4float = OpTypePointer Input %v4float
494fd4e5da5Sopenharmony_ci%BaseColor = OpVariable %_ptr_Input_v4float Input
495fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float
496fd4e5da5Sopenharmony_ci%gl_FragColor = OpVariable %_ptr_Output_v4float Output
497fd4e5da5Sopenharmony_ci%main = OpFunction %void None %10
498fd4e5da5Sopenharmony_ci%21 = OpLabel
499fd4e5da5Sopenharmony_ci%color = OpVariable %_ptr_Function_v4float Function
500fd4e5da5Sopenharmony_ci%param = OpVariable %_ptr_Function_v4float Function
501fd4e5da5Sopenharmony_ci%22 = OpLoad %v4float %BaseColor
502fd4e5da5Sopenharmony_ciOpStore %param %22
503fd4e5da5Sopenharmony_ci%23 = OpFunctionCall %float %foo_vf4_ %param
504fd4e5da5Sopenharmony_ci%24 = OpCompositeConstruct %v4float %23 %23 %23 %23
505fd4e5da5Sopenharmony_ciOpStore %color %24
506fd4e5da5Sopenharmony_ci%25 = OpLoad %v4float %color
507fd4e5da5Sopenharmony_ciOpStore %gl_FragColor %25
508fd4e5da5Sopenharmony_ciOpReturn
509fd4e5da5Sopenharmony_ciOpFunctionEnd
510fd4e5da5Sopenharmony_ci%foo_vf4_ = OpFunction %float None %14
511fd4e5da5Sopenharmony_ci%bar = OpFunctionParameter %_ptr_Function_v4float
512fd4e5da5Sopenharmony_ci%26 = OpLabel
513fd4e5da5Sopenharmony_ci%27 = OpAccessChain %_ptr_Function_float %bar %uint_0
514fd4e5da5Sopenharmony_ci%28 = OpLoad %float %27
515fd4e5da5Sopenharmony_ci%29 = OpAccessChain %_ptr_Function_float %bar %uint_1
516fd4e5da5Sopenharmony_ci%30 = OpLoad %float %29
517fd4e5da5Sopenharmony_ci%31 = OpFAdd %float %28 %30
518fd4e5da5Sopenharmony_ciOpReturnValue %31
519fd4e5da5Sopenharmony_ciOpFunctionEnd
520fd4e5da5Sopenharmony_ci)";
521fd4e5da5Sopenharmony_ci
522fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<InlineOpaquePass>(assembly, assembly, true, true);
523fd4e5da5Sopenharmony_ci}
524fd4e5da5Sopenharmony_ci
525fd4e5da5Sopenharmony_ci}  // namespace
526fd4e5da5Sopenharmony_ci}  // namespace opt
527fd4e5da5Sopenharmony_ci}  // namespace spvtools
528