hlsl.pp.line3.frag
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 78

                              Capability Shader
               2:             ExtInstImport  "GLSL.std.450"
                              MemoryModel Logical GLSL450
                              EntryPoint Fragment 5  "MainPs" 69 73
                              ExecutionMode 5 OriginUpperLeft
               1:             String  "hlsl.pp.line3.frag"
              31:             String  "./i1.h"
                              Source HLSL 500 1  "// OpModuleProcessed entry-point MainPs
// OpModuleProcessed client vulkan100
// OpModuleProcessed target-env vulkan1.0
// OpModuleProcessed hlsl-offsets
#line 1
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)
#include "i1.h"
    else
        u = g_nDataIdx2;
    ps_output . vColor = g_tColor [ u ] . Sample ( g_sAniso , i . vTextureCoords . xy );
    return ps_output ;
}

"
                              Name 5  "MainPs"
                              Name 9  "PS_INPUT"
                              MemberName 9(PS_INPUT) 0  "vTextureCoords"
                              Name 12  "PS_OUTPUT"
                              MemberName 12(PS_OUTPUT) 0  "vColor"
                              Name 15  "@MainPs(struct-PS_INPUT-vf21;"
                              Name 14  "i"
                              Name 18  "PerViewConstantBuffer_t"
                              MemberName 18(PerViewConstantBuffer_t) 0  "g_nDataIdx"
                              MemberName 18(PerViewConstantBuffer_t) 1  "g_nDataIdx2"
                              MemberName 18(PerViewConstantBuffer_t) 2  "g_B"
                              Name 20  ""
                              Name 33  "u"
                              Name 42  "ps_output"
                              Name 47  "g_tColor"
                              Name 54  "g_sAniso"
                              Name 67  "i"
                              Name 69  "i.vTextureCoords"
                              Name 73  "@entryPointOutput.vColor"
                              Name 74  "param"
                              MemberDecorate 18(PerViewConstantBuffer_t) 0 Offset 0
                              MemberDecorate 18(PerViewConstantBuffer_t) 1 Offset 4
                              MemberDecorate 18(PerViewConstantBuffer_t) 2 Offset 8
                              Decorate 18(PerViewConstantBuffer_t) Block
                              Decorate 47(g_tColor) DescriptorSet 0
                              Decorate 47(g_tColor) Binding 0
                              Decorate 54(g_sAniso) DescriptorSet 0
                              Decorate 54(g_sAniso) Binding 0
                              Decorate 69(i.vTextureCoords) Location 0
                              Decorate 73(@entryPointOutput.vColor) Location 0
               3:             TypeVoid
               4:             TypeFunction 3
               7:             TypeFloat 32
               8:             TypeVector 7(float) 2
     9(PS_INPUT):             TypeStruct 8(fvec2)
              10:             TypePointer Function 9(PS_INPUT)
              11:             TypeVector 7(float) 4
   12(PS_OUTPUT):             TypeStruct 11(fvec4)
              13:             TypeFunction 12(PS_OUTPUT) 10(ptr)
              17:             TypeInt 32 0
18(PerViewConstantBuffer_t):             TypeStruct 17(int) 17(int) 17(int)
              19:             TypePointer PushConstant 18(PerViewConstantBuffer_t)
              20:     19(ptr) Variable PushConstant
              21:             TypeInt 32 1
              22:     21(int) Constant 2
              23:             TypePointer PushConstant 17(int)
              26:             TypeBool
              27:     17(int) Constant 0
              32:             TypePointer Function 17(int)
              34:     21(int) Constant 0
              38:     21(int) Constant 1
              41:             TypePointer Function 12(PS_OUTPUT)
              43:             TypeImage 7(float) 2D sampled format:Unknown
              44:     17(int) Constant 128
              45:             TypeArray 43 44
              46:             TypePointer UniformConstant 45
    47(g_tColor):     46(ptr) Variable UniformConstant
              49:             TypePointer UniformConstant 43
              52:             TypeSampler
              53:             TypePointer UniformConstant 52
    54(g_sAniso):     53(ptr) Variable UniformConstant
              56:             TypeSampledImage 43
              58:             TypePointer Function 8(fvec2)
              62:             TypePointer Function 11(fvec4)
              68:             TypePointer Input 8(fvec2)
69(i.vTextureCoords):     68(ptr) Variable Input
              72:             TypePointer Output 11(fvec4)
73(@entryPointOutput.vColor):     72(ptr) Variable Output
       5(MainPs):           3 Function None 4
               6:             Label
           67(i):     10(ptr) Variable Function
       74(param):     10(ptr) Variable Function
                              Line 1 23 0
              70:    8(fvec2) Load 69(i.vTextureCoords)
              71:     58(ptr) AccessChain 67(i) 34
                              Store 71 70
              75: 9(PS_INPUT) Load 67(i)
                              Store 74(param) 75
              76:12(PS_OUTPUT) FunctionCall 15(@MainPs(struct-PS_INPUT-vf21;) 74(param)
              77:   11(fvec4) CompositeExtract 76 0
                              Store 73(@entryPointOutput.vColor) 77
                              Return
                              FunctionEnd
15(@MainPs(struct-PS_INPUT-vf21;):12(PS_OUTPUT) Function None 13
           14(i):     10(ptr) FunctionParameter
              16:             Label
           33(u):     32(ptr) Variable Function
   42(ps_output):     41(ptr) Variable Function
                              Line 1 27 0
              24:     23(ptr) AccessChain 20 22
              25:     17(int) Load 24
              28:    26(bool) INotEqual 25 27
                              SelectionMerge 30 None
                              BranchConditional 28 29 37
              29:               Label
                                Line 31 1 0
              35:     23(ptr)   AccessChain 20 34
              36:     17(int)   Load 35
                                Store 33(u) 36
                                Branch 30
              37:               Label
                                Line 1 30 0
              39:     23(ptr)   AccessChain 20 38
              40:     17(int)   Load 39
                                Store 33(u) 40
                                Branch 30
              30:             Label
                              Line 1 31 0
              48:     17(int) Load 33(u)
              50:     49(ptr) AccessChain 47(g_tColor) 48
              51:          43 Load 50
              55:          52 Load 54(g_sAniso)
              57:          56 SampledImage 51 55
              59:     58(ptr) AccessChain 14(i) 34
              60:    8(fvec2) Load 59
              61:   11(fvec4) ImageSampleImplicitLod 57 60
              63:     62(ptr) AccessChain 42(ps_output) 34
                              Store 63 61
                              Line 1 32 0
              64:12(PS_OUTPUT) Load 42(ps_output)
                              ReturnValue 64
                              FunctionEnd
