// Copyright (c) 2017 Valve Corporation // Copyright (c) 2017 LunarG Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include "test/opt/pass_fixture.h" #include "test/opt/pass_utils.h" namespace spvtools { namespace opt { namespace { using ProcessLinesTest = PassTest<::testing::Test>; TEST_F(ProcessLinesTest, SimplePropagation) { // Texture2D g_tColor[128]; // // layout(push_constant) cbuffer PerViewConstantBuffer_t // { // uint g_nDataIdx; // uint g_nDataIdx2; // bool g_B; // }; // // SamplerState g_sAniso; // // struct PS_INPUT // { // float2 vTextureCoords : TEXCOORD2; // }; // // struct PS_OUTPUT // { // float4 vColor : SV_Target0; // }; // // PS_OUTPUT MainPs(PS_INPUT i) // { // PS_OUTPUT ps_output; // // uint u; // if (g_B) // u = g_nDataIdx; // else // u = g_nDataIdx2; // ps_output.vColor = g_tColor[u].Sample(g_sAniso, i.vTextureCoords.xy); // return ps_output; // } const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor OpExecutionMode %MainPs OriginUpperLeft %5 = OpString "foo.frag" OpSource HLSL 500 OpName %MainPs "MainPs" OpName %PS_INPUT "PS_INPUT" OpMemberName %PS_INPUT 0 "vTextureCoords" OpName %PS_OUTPUT "PS_OUTPUT" OpMemberName %PS_OUTPUT 0 "vColor" OpName %_MainPs_struct_PS_INPUT_vf21_ "@MainPs(struct-PS_INPUT-vf21;" OpName %i "i" OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" OpMemberName %PerViewConstantBuffer_t 1 "g_nDataIdx2" OpMemberName %PerViewConstantBuffer_t 2 "g_B" OpName %_ "" OpName %u "u" OpName %ps_output "ps_output" OpName %g_tColor "g_tColor" OpName %g_sAniso "g_sAniso" OpName %i_0 "i" OpName %i_vTextureCoords "i.vTextureCoords" OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" OpName %param "param" OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 OpMemberDecorate %PerViewConstantBuffer_t 1 Offset 4 OpMemberDecorate %PerViewConstantBuffer_t 2 Offset 8 OpDecorate %PerViewConstantBuffer_t Block OpDecorate %g_tColor DescriptorSet 0 OpDecorate %g_sAniso DescriptorSet 0 OpDecorate %i_vTextureCoords Location 0 OpDecorate %_entryPointOutput_vColor Location 0 )"; const std::string before = R"(%void = OpTypeVoid %19 = OpTypeFunction %void %float = OpTypeFloat 32 %v2float = OpTypeVector %float 2 %PS_INPUT = OpTypeStruct %v2float %_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT %v4float = OpTypeVector %float 4 %PS_OUTPUT = OpTypeStruct %v4float %24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT %uint = OpTypeInt 32 0 %PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint %_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t %_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant %int = OpTypeInt 32 1 %int_2 = OpConstant %int 2 %_ptr_PushConstant_uint = OpTypePointer PushConstant %uint %bool = OpTypeBool %uint_0 = OpConstant %uint 0 %_ptr_Function_uint = OpTypePointer Function %uint %int_0 = OpConstant %int 0 %int_1 = OpConstant %int 1 %_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT %36 = OpTypeImage %float 2D 0 0 0 1 Unknown %uint_128 = OpConstant %uint 128 %_arr_36_uint_128 = OpTypeArray %36 %uint_128 %_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 %g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant %_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 %41 = OpTypeSampler %_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 %g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant %43 = OpTypeSampledImage %36 %_ptr_Function_v2float = OpTypePointer Function %v2float %_ptr_Function_v4float = OpTypePointer Function %v4float %_ptr_Input_v2float = OpTypePointer Input %v2float %i_vTextureCoords = OpVariable %_ptr_Input_v2float Input %_ptr_Output_v4float = OpTypePointer Output %v4float %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output %MainPs = OpFunction %void None %19 %48 = OpLabel %i_0 = OpVariable %_ptr_Function_PS_INPUT Function %param = OpVariable %_ptr_Function_PS_INPUT Function OpLine %5 23 0 %49 = OpLoad %v2float %i_vTextureCoords %50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 OpStore %50 %49 %51 = OpLoad %PS_INPUT %i_0 OpStore %param %51 %52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param %53 = OpCompositeExtract %v4float %52 0 OpStore %_entryPointOutput_vColor %53 OpReturn OpFunctionEnd %_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 %i = OpFunctionParameter %_ptr_Function_PS_INPUT %54 = OpLabel %u = OpVariable %_ptr_Function_uint Function %ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function OpLine %5 27 0 %55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 %56 = OpLoad %uint %55 %57 = OpINotEqual %bool %56 %uint_0 OpSelectionMerge %58 None OpBranchConditional %57 %59 %60 %59 = OpLabel OpLine %5 28 0 %61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 %62 = OpLoad %uint %61 OpStore %u %62 OpBranch %58 %60 = OpLabel OpLine %5 30 0 %63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 %64 = OpLoad %uint %63 OpStore %u %64 OpBranch %58 %58 = OpLabel OpLine %5 31 0 %65 = OpLoad %uint %u %66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 %67 = OpLoad %36 %66 %68 = OpLoad %41 %g_sAniso %69 = OpSampledImage %43 %67 %68 %70 = OpAccessChain %_ptr_Function_v2float %i %int_0 %71 = OpLoad %v2float %70 %72 = OpImageSampleImplicitLod %v4float %69 %71 %73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 OpStore %73 %72 OpLine %5 32 0 %74 = OpLoad %PS_OUTPUT %ps_output OpReturnValue %74 OpFunctionEnd )"; const std::string after = R"(OpNoLine %void = OpTypeVoid OpNoLine %19 = OpTypeFunction %void OpNoLine %float = OpTypeFloat 32 OpNoLine %v2float = OpTypeVector %float 2 OpNoLine %PS_INPUT = OpTypeStruct %v2float OpNoLine %_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT OpNoLine %v4float = OpTypeVector %float 4 OpNoLine %PS_OUTPUT = OpTypeStruct %v4float OpNoLine %24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT OpNoLine %uint = OpTypeInt 32 0 OpNoLine %PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint OpNoLine %_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t OpNoLine %_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant OpNoLine %int = OpTypeInt 32 1 OpNoLine %int_2 = OpConstant %int 2 OpNoLine %_ptr_PushConstant_uint = OpTypePointer PushConstant %uint OpNoLine %bool = OpTypeBool OpNoLine %uint_0 = OpConstant %uint 0 OpNoLine %_ptr_Function_uint = OpTypePointer Function %uint OpNoLine %int_0 = OpConstant %int 0 OpNoLine %int_1 = OpConstant %int 1 OpNoLine %_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT OpNoLine %36 = OpTypeImage %float 2D 0 0 0 1 Unknown OpNoLine %uint_128 = OpConstant %uint 128 OpNoLine %_arr_36_uint_128 = OpTypeArray %36 %uint_128 OpNoLine %_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 OpNoLine %g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant OpNoLine %_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 OpNoLine %41 = OpTypeSampler OpNoLine %_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 OpNoLine %g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant OpNoLine %43 = OpTypeSampledImage %36 OpNoLine %_ptr_Function_v2float = OpTypePointer Function %v2float OpNoLine %_ptr_Function_v4float = OpTypePointer Function %v4float OpNoLine %_ptr_Input_v2float = OpTypePointer Input %v2float OpNoLine %i_vTextureCoords = OpVariable %_ptr_Input_v2float Input OpNoLine %_ptr_Output_v4float = OpTypePointer Output %v4float OpNoLine %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output OpNoLine %MainPs = OpFunction %void None %19 OpNoLine %48 = OpLabel OpNoLine %i_0 = OpVariable %_ptr_Function_PS_INPUT Function OpNoLine %param = OpVariable %_ptr_Function_PS_INPUT Function OpLine %5 23 0 %49 = OpLoad %v2float %i_vTextureCoords OpLine %5 23 0 %50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 OpLine %5 23 0 OpStore %50 %49 OpLine %5 23 0 %51 = OpLoad %PS_INPUT %i_0 OpLine %5 23 0 OpStore %param %51 OpLine %5 23 0 %52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param OpLine %5 23 0 %53 = OpCompositeExtract %v4float %52 0 OpLine %5 23 0 OpStore %_entryPointOutput_vColor %53 OpLine %5 23 0 OpReturn OpNoLine OpFunctionEnd OpNoLine %_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 OpNoLine %i = OpFunctionParameter %_ptr_Function_PS_INPUT OpNoLine %54 = OpLabel OpNoLine %u = OpVariable %_ptr_Function_uint Function OpNoLine %ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function OpLine %5 27 0 %55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 OpLine %5 27 0 %56 = OpLoad %uint %55 OpLine %5 27 0 %57 = OpINotEqual %bool %56 %uint_0 OpLine %5 27 0 OpSelectionMerge %58 None OpBranchConditional %57 %59 %60 OpNoLine %59 = OpLabel OpLine %5 28 0 %61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 OpLine %5 28 0 %62 = OpLoad %uint %61 OpLine %5 28 0 OpStore %u %62 OpLine %5 28 0 OpBranch %58 OpNoLine %60 = OpLabel OpLine %5 30 0 %63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 OpLine %5 30 0 %64 = OpLoad %uint %63 OpLine %5 30 0 OpStore %u %64 OpLine %5 30 0 OpBranch %58 OpNoLine %58 = OpLabel OpLine %5 31 0 %65 = OpLoad %uint %u OpLine %5 31 0 %66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 OpLine %5 31 0 %67 = OpLoad %36 %66 OpLine %5 31 0 %68 = OpLoad %41 %g_sAniso OpLine %5 31 0 %69 = OpSampledImage %43 %67 %68 OpLine %5 31 0 %70 = OpAccessChain %_ptr_Function_v2float %i %int_0 OpLine %5 31 0 %71 = OpLoad %v2float %70 OpLine %5 31 0 %72 = OpImageSampleImplicitLod %v4float %69 %71 OpLine %5 31 0 %73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 OpLine %5 31 0 OpStore %73 %72 OpLine %5 32 0 %74 = OpLoad %PS_OUTPUT %ps_output OpLine %5 32 0 OpReturnValue %74 OpNoLine OpFunctionEnd )"; SinglePassRunAndCheck(predefs + before, predefs + after, false, true, kLinesPropagateLines); } TEST_F(ProcessLinesTest, SimpleElimination) { // Previous test with before and after reversed const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor OpExecutionMode %MainPs OriginUpperLeft %5 = OpString "foo.frag" OpSource HLSL 500 OpName %MainPs "MainPs" OpName %PS_INPUT "PS_INPUT" OpMemberName %PS_INPUT 0 "vTextureCoords" OpName %PS_OUTPUT "PS_OUTPUT" OpMemberName %PS_OUTPUT 0 "vColor" OpName %_MainPs_struct_PS_INPUT_vf21_ "@MainPs(struct-PS_INPUT-vf21;" OpName %i "i" OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" OpMemberName %PerViewConstantBuffer_t 1 "g_nDataIdx2" OpMemberName %PerViewConstantBuffer_t 2 "g_B" OpName %_ "" OpName %u "u" OpName %ps_output "ps_output" OpName %g_tColor "g_tColor" OpName %g_sAniso "g_sAniso" OpName %i_0 "i" OpName %i_vTextureCoords "i.vTextureCoords" OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" OpName %param "param" OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 OpMemberDecorate %PerViewConstantBuffer_t 1 Offset 4 OpMemberDecorate %PerViewConstantBuffer_t 2 Offset 8 OpDecorate %PerViewConstantBuffer_t Block OpDecorate %g_tColor DescriptorSet 0 OpDecorate %g_sAniso DescriptorSet 0 OpDecorate %i_vTextureCoords Location 0 OpDecorate %_entryPointOutput_vColor Location 0 )"; const std::string before = R"(OpNoLine %void = OpTypeVoid OpNoLine %19 = OpTypeFunction %void OpNoLine %float = OpTypeFloat 32 OpNoLine %v2float = OpTypeVector %float 2 OpNoLine %PS_INPUT = OpTypeStruct %v2float OpNoLine %_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT OpNoLine %v4float = OpTypeVector %float 4 OpNoLine %PS_OUTPUT = OpTypeStruct %v4float OpNoLine %24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT OpNoLine %uint = OpTypeInt 32 0 OpNoLine %PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint OpNoLine %_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t OpNoLine %_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant OpNoLine %int = OpTypeInt 32 1 OpNoLine %int_2 = OpConstant %int 2 OpNoLine %_ptr_PushConstant_uint = OpTypePointer PushConstant %uint OpNoLine %bool = OpTypeBool OpNoLine %uint_0 = OpConstant %uint 0 OpNoLine %_ptr_Function_uint = OpTypePointer Function %uint OpNoLine %int_0 = OpConstant %int 0 OpNoLine %int_1 = OpConstant %int 1 OpNoLine %_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT OpNoLine %36 = OpTypeImage %float 2D 0 0 0 1 Unknown OpNoLine %uint_128 = OpConstant %uint 128 OpNoLine %_arr_36_uint_128 = OpTypeArray %36 %uint_128 OpNoLine %_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 OpNoLine %g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant OpNoLine %_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 OpNoLine %41 = OpTypeSampler OpNoLine %_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 OpNoLine %g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant OpNoLine %43 = OpTypeSampledImage %36 OpNoLine %_ptr_Function_v2float = OpTypePointer Function %v2float OpNoLine %_ptr_Function_v4float = OpTypePointer Function %v4float OpNoLine %_ptr_Input_v2float = OpTypePointer Input %v2float OpNoLine %i_vTextureCoords = OpVariable %_ptr_Input_v2float Input OpNoLine %_ptr_Output_v4float = OpTypePointer Output %v4float OpNoLine %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output OpNoLine %MainPs = OpFunction %void None %19 OpNoLine %48 = OpLabel OpNoLine %i_0 = OpVariable %_ptr_Function_PS_INPUT Function OpNoLine %param = OpVariable %_ptr_Function_PS_INPUT Function OpLine %5 23 0 %49 = OpLoad %v2float %i_vTextureCoords OpLine %5 23 0 %50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 OpLine %5 23 0 OpStore %50 %49 OpLine %5 23 0 %51 = OpLoad %PS_INPUT %i_0 OpLine %5 23 0 OpStore %param %51 OpLine %5 23 0 %52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param OpLine %5 23 0 %53 = OpCompositeExtract %v4float %52 0 OpLine %5 23 0 OpStore %_entryPointOutput_vColor %53 OpLine %5 23 0 OpReturn OpNoLine OpFunctionEnd OpNoLine %_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 OpNoLine %i = OpFunctionParameter %_ptr_Function_PS_INPUT OpNoLine %54 = OpLabel OpNoLine %u = OpVariable %_ptr_Function_uint Function OpNoLine %ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function OpLine %5 27 0 %55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 OpLine %5 27 0 %56 = OpLoad %uint %55 OpLine %5 27 0 %57 = OpINotEqual %bool %56 %uint_0 OpLine %5 27 0 OpSelectionMerge %58 None OpBranchConditional %57 %59 %60 OpNoLine %59 = OpLabel OpLine %5 28 0 %61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 OpLine %5 28 0 %62 = OpLoad %uint %61 OpLine %5 28 0 OpStore %u %62 OpLine %5 28 0 OpBranch %58 OpNoLine %60 = OpLabel OpLine %5 30 0 %63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 OpLine %5 30 0 %64 = OpLoad %uint %63 OpLine %5 30 0 OpStore %u %64 OpLine %5 30 0 OpBranch %58 OpNoLine %58 = OpLabel OpLine %5 31 0 %65 = OpLoad %uint %u OpLine %5 31 0 %66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 OpLine %5 31 0 %67 = OpLoad %36 %66 OpLine %5 31 0 %68 = OpLoad %41 %g_sAniso OpLine %5 31 0 %69 = OpSampledImage %43 %67 %68 OpLine %5 31 0 %70 = OpAccessChain %_ptr_Function_v2float %i %int_0 OpLine %5 31 0 %71 = OpLoad %v2float %70 OpLine %5 31 0 %72 = OpImageSampleImplicitLod %v4float %69 %71 OpLine %5 31 0 %73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 OpLine %5 31 0 OpStore %73 %72 OpLine %5 32 0 %74 = OpLoad %PS_OUTPUT %ps_output OpLine %5 32 0 OpReturnValue %74 OpNoLine OpFunctionEnd )"; const std::string after = R"(%void = OpTypeVoid %19 = OpTypeFunction %void %float = OpTypeFloat 32 %v2float = OpTypeVector %float 2 %PS_INPUT = OpTypeStruct %v2float %_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT %v4float = OpTypeVector %float 4 %PS_OUTPUT = OpTypeStruct %v4float %24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT %uint = OpTypeInt 32 0 %PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint %_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t %_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant %int = OpTypeInt 32 1 %int_2 = OpConstant %int 2 %_ptr_PushConstant_uint = OpTypePointer PushConstant %uint %bool = OpTypeBool %uint_0 = OpConstant %uint 0 %_ptr_Function_uint = OpTypePointer Function %uint %int_0 = OpConstant %int 0 %int_1 = OpConstant %int 1 %_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT %36 = OpTypeImage %float 2D 0 0 0 1 Unknown %uint_128 = OpConstant %uint 128 %_arr_36_uint_128 = OpTypeArray %36 %uint_128 %_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 %g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant %_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 %41 = OpTypeSampler %_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 %g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant %43 = OpTypeSampledImage %36 %_ptr_Function_v2float = OpTypePointer Function %v2float %_ptr_Function_v4float = OpTypePointer Function %v4float %_ptr_Input_v2float = OpTypePointer Input %v2float %i_vTextureCoords = OpVariable %_ptr_Input_v2float Input %_ptr_Output_v4float = OpTypePointer Output %v4float %_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output %MainPs = OpFunction %void None %19 %48 = OpLabel %i_0 = OpVariable %_ptr_Function_PS_INPUT Function %param = OpVariable %_ptr_Function_PS_INPUT Function OpLine %5 23 0 %49 = OpLoad %v2float %i_vTextureCoords %50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 OpStore %50 %49 %51 = OpLoad %PS_INPUT %i_0 OpStore %param %51 %52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param %53 = OpCompositeExtract %v4float %52 0 OpStore %_entryPointOutput_vColor %53 OpReturn OpFunctionEnd %_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 %i = OpFunctionParameter %_ptr_Function_PS_INPUT %54 = OpLabel %u = OpVariable %_ptr_Function_uint Function %ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function OpLine %5 27 0 %55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 %56 = OpLoad %uint %55 %57 = OpINotEqual %bool %56 %uint_0 OpSelectionMerge %58 None OpBranchConditional %57 %59 %60 %59 = OpLabel OpLine %5 28 0 %61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 %62 = OpLoad %uint %61 OpStore %u %62 OpBranch %58 %60 = OpLabel OpLine %5 30 0 %63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 %64 = OpLoad %uint %63 OpStore %u %64 OpBranch %58 %58 = OpLabel OpLine %5 31 0 %65 = OpLoad %uint %u %66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 %67 = OpLoad %36 %66 %68 = OpLoad %41 %g_sAniso %69 = OpSampledImage %43 %67 %68 %70 = OpAccessChain %_ptr_Function_v2float %i %int_0 %71 = OpLoad %v2float %70 %72 = OpImageSampleImplicitLod %v4float %69 %71 %73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 OpStore %73 %72 OpLine %5 32 0 %74 = OpLoad %PS_OUTPUT %ps_output OpReturnValue %74 OpFunctionEnd )"; SinglePassRunAndCheck( predefs + before, predefs + after, false, true, kLinesEliminateDeadLines); } // TODO(greg-lunarg): Add tests to verify handling of these cases: // // TODO(greg-lunarg): Think about other tests :) } // namespace } // namespace opt } // namespace spvtools