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