| // 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 <memory> |
| #include <string> |
| #include <vector> |
| |
| #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<ProcessLinesPass>(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<ProcessLinesPass>( |
| 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 |