mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-12-28 02:31:04 +00:00
696 lines
20 KiB
C++
696 lines
20 KiB
C++
|
// 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
|