hlsl.multiEntry.vert
Shader version: 500
0:? Sequence
0:4  Function Definition: FakeEntrypoint(u1; ( temp 4-component vector of float)
0:4    Function Parameters: 
0:4      'Index' ( in uint)
0:?     Sequence
0:5      Branch: Return with expression
0:5        textureFetch ( temp 4-component vector of float)
0:5          'Position' (layout( rgba32f) uniform textureBuffer)
0:5          Convert uint to int ( temp int)
0:5            'Index' ( in uint)
0:9  Function Definition: @RealEntrypoint(u1; ( temp 4-component vector of float)
0:9    Function Parameters: 
0:9      'Index' ( in uint)
0:?     Sequence
0:10      Branch: Return with expression
0:10        Function Call: FakeEntrypoint(u1; ( temp 4-component vector of float)
0:10          'Index' ( in uint)
0:9  Function Definition: RealEntrypoint( ( temp void)
0:9    Function Parameters: 
0:?     Sequence
0:9      move second child to first child ( temp uint)
0:?         'Index' ( temp uint)
0:?         'Index' ( in uint VertexIndex)
0:9      move second child to first child ( temp 4-component vector of float)
0:?         '@entryPointOutput' ( out 4-component vector of float Position)
0:9        Function Call: @RealEntrypoint(u1; ( temp 4-component vector of float)
0:?           'Index' ( temp uint)
0:?   Linker Objects
0:?     'Position' (layout( rgba32f) uniform textureBuffer)
0:?     '@entryPointOutput' ( out 4-component vector of float Position)
0:?     'Index' ( in uint VertexIndex)


Linked vertex stage:


Shader version: 500
0:? Sequence
0:4  Function Definition: FakeEntrypoint(u1; ( temp 4-component vector of float)
0:4    Function Parameters: 
0:4      'Index' ( in uint)
0:?     Sequence
0:5      Branch: Return with expression
0:5        textureFetch ( temp 4-component vector of float)
0:5          'Position' (layout( rgba32f) uniform textureBuffer)
0:5          Convert uint to int ( temp int)
0:5            'Index' ( in uint)
0:9  Function Definition: @RealEntrypoint(u1; ( temp 4-component vector of float)
0:9    Function Parameters: 
0:9      'Index' ( in uint)
0:?     Sequence
0:10      Branch: Return with expression
0:10        Function Call: FakeEntrypoint(u1; ( temp 4-component vector of float)
0:10          'Index' ( in uint)
0:9  Function Definition: RealEntrypoint( ( temp void)
0:9    Function Parameters: 
0:?     Sequence
0:9      move second child to first child ( temp uint)
0:?         'Index' ( temp uint)
0:?         'Index' ( in uint VertexIndex)
0:9      move second child to first child ( temp 4-component vector of float)
0:?         '@entryPointOutput' ( out 4-component vector of float Position)
0:9        Function Call: @RealEntrypoint(u1; ( temp 4-component vector of float)
0:?           'Index' ( temp uint)
0:?   Linker Objects
0:?     'Position' (layout( rgba32f) uniform textureBuffer)
0:?     '@entryPointOutput' ( out 4-component vector of float Position)
0:?     'Index' ( in uint VertexIndex)

// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 41

                              Capability Shader
                              Capability SampledBuffer
               1:             ExtInstImport  "GLSL.std.450"
                              MemoryModel Logical GLSL450
                              EntryPoint Vertex 4  "RealEntrypoint" 34 37
                              Source HLSL 500
                              Name 4  "RealEntrypoint"
                              Name 12  "FakeEntrypoint(u1;"
                              Name 11  "Index"
                              Name 15  "@RealEntrypoint(u1;"
                              Name 14  "Index"
                              Name 19  "Position"
                              Name 27  "param"
                              Name 32  "Index"
                              Name 34  "Index"
                              Name 37  "@entryPointOutput"
                              Name 38  "param"
                              Decorate 19(Position) DescriptorSet 0
                              Decorate 34(Index) BuiltIn VertexIndex
                              Decorate 37(@entryPointOutput) BuiltIn Position
               2:             TypeVoid
               3:             TypeFunction 2
               6:             TypeInt 32 0
               7:             TypePointer Function 6(int)
               8:             TypeFloat 32
               9:             TypeVector 8(float) 4
              10:             TypeFunction 9(fvec4) 7(ptr)
              17:             TypeImage 8(float) Buffer sampled format:Rgba32f
              18:             TypePointer UniformConstant 17
    19(Position):     18(ptr) Variable UniformConstant
              22:             TypeInt 32 1
              33:             TypePointer Input 6(int)
       34(Index):     33(ptr) Variable Input
              36:             TypePointer Output 9(fvec4)
37(@entryPointOutput):     36(ptr) Variable Output
4(RealEntrypoint):           2 Function None 3
               5:             Label
       32(Index):      7(ptr) Variable Function
       38(param):      7(ptr) Variable Function
              35:      6(int) Load 34(Index)
                              Store 32(Index) 35
              39:      6(int) Load 32(Index)
                              Store 38(param) 39
              40:    9(fvec4) FunctionCall 15(@RealEntrypoint(u1;) 38(param)
                              Store 37(@entryPointOutput) 40
                              Return
                              FunctionEnd
12(FakeEntrypoint(u1;):    9(fvec4) Function None 10
       11(Index):      7(ptr) FunctionParameter
              13:             Label
              20:          17 Load 19(Position)
              21:      6(int) Load 11(Index)
              23:     22(int) Bitcast 21
              24:    9(fvec4) ImageFetch 20 23
                              ReturnValue 24
                              FunctionEnd
15(@RealEntrypoint(u1;):    9(fvec4) Function None 10
       14(Index):      7(ptr) FunctionParameter
              16:             Label
       27(param):      7(ptr) Variable Function
              28:      6(int) Load 14(Index)
                              Store 27(param) 28
              29:    9(fvec4) FunctionCall 12(FakeEntrypoint(u1;) 27(param)
                              ReturnValue 29
                              FunctionEnd
