hlsl.layout.frag
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:16  Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
0:16    Function Parameters: 
0:16      'input' (in 4-component vector of float)
0:?     Sequence
0:17      Branch: Return with expression
0:17        add (temp 4-component vector of float)
0:17          add (temp 4-component vector of float)
0:17            add (temp 4-component vector of float)
0:17              'input' (in 4-component vector of float)
0:17              v1: direct index for structure (layout(row_major std430 offset=16 ) buffer 4-component vector of float)
0:17                'anon@0' (layout(set=3 binding=5 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1})
0:17                Constant:
0:17                  0 (const uint)
0:17            v5: direct index for structure (layout(row_major std430 offset=0 ) buffer 4-component vector of float)
0:17              'anon@1' (layout(row_major std430 push_constant ) buffer block{layout(row_major std430 offset=0 ) buffer 4-component vector of float v5})
0:17              Constant:
0:17                0 (const uint)
0:17          v1PostLayout: direct index for structure (layout(row_major std430 offset=16 ) buffer 4-component vector of float)
0:17            'anon@2' (layout(set=4 binding=7 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})
0:17            Constant:
0:17              0 (const uint)
0:?   Linker Objects
0:?     'anon@0' (layout(set=3 binding=5 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1})
0:?     'anon@1' (layout(row_major std430 push_constant ) buffer block{layout(row_major std430 offset=0 ) buffer 4-component vector of float v5})
0:?     'specConst' (specialization-constant const int)
0:?       10 (const int)
0:?     'anon@2' (layout(set=4 binding=7 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})


Linked fragment stage:

WARNING: Linking fragment stage: Entry point not found

Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:16  Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
0:16    Function Parameters: 
0:16      'input' (in 4-component vector of float)
0:?     Sequence
0:17      Branch: Return with expression
0:17        add (temp 4-component vector of float)
0:17          add (temp 4-component vector of float)
0:17            add (temp 4-component vector of float)
0:17              'input' (in 4-component vector of float)
0:17              v1: direct index for structure (layout(row_major std430 offset=16 ) buffer 4-component vector of float)
0:17                'anon@0' (layout(set=3 binding=5 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1})
0:17                Constant:
0:17                  0 (const uint)
0:17            v5: direct index for structure (layout(row_major std430 offset=0 ) buffer 4-component vector of float)
0:17              'anon@1' (layout(row_major std430 push_constant ) buffer block{layout(row_major std430 offset=0 ) buffer 4-component vector of float v5})
0:17              Constant:
0:17                0 (const uint)
0:17          v1PostLayout: direct index for structure (layout(row_major std430 offset=16 ) buffer 4-component vector of float)
0:17            'anon@2' (layout(set=4 binding=7 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})
0:17            Constant:
0:17              0 (const uint)
0:?   Linker Objects
0:?     'anon@0' (layout(set=3 binding=5 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1})
0:?     'anon@1' (layout(row_major std430 push_constant ) buffer block{layout(row_major std430 offset=0 ) buffer 4-component vector of float v5})
0:?     'specConst' (specialization-constant const int)
0:?       10 (const int)
0:?     'anon@2' (layout(set=4 binding=7 row_major std430 ) buffer block{layout(row_major std430 offset=16 ) buffer 4-component vector of float v1PostLayout})

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

                              Capability Shader
               1:             ExtInstImport  "GLSL.std.450"
                              MemoryModel Logical GLSL450
                              EntryPoint Fragment 4  "main"
                              ExecutionMode 4 OriginUpperLeft
                              Name 4  "main"
                              Name 11  "PixelShaderFunction(vf4;"
                              Name 10  "input"
                              Name 14  "tbufName"
                              MemberName 14(tbufName) 0  "v1"
                              Name 16  ""
                              Name 23  "tbufName2"
                              MemberName 23(tbufName2) 0  "v5"
                              Name 25  ""
                              Name 30  "tbufName2"
                              MemberName 30(tbufName2) 0  "v1PostLayout"
                              Name 32  ""
                              MemberDecorate 14(tbufName) 0 Offset 16
                              Decorate 14(tbufName) BufferBlock
                              Decorate 16 DescriptorSet 3
                              Decorate 16 Binding 5
                              MemberDecorate 23(tbufName2) 0 Offset 0
                              Decorate 23(tbufName2) BufferBlock
                              MemberDecorate 30(tbufName2) 0 Offset 16
                              Decorate 30(tbufName2) BufferBlock
                              Decorate 32 DescriptorSet 4
                              Decorate 32 Binding 7
                              Decorate 38 SpecId 17
               2:             TypeVoid
               3:             TypeFunction 2
               6:             TypeFloat 32
               7:             TypeVector 6(float) 4
               8:             TypePointer Function 7(fvec4)
               9:             TypeFunction 7(fvec4) 8(ptr)
    14(tbufName):             TypeStruct 7(fvec4)
              15:             TypePointer Uniform 14(tbufName)
              16:     15(ptr) Variable Uniform
              17:             TypeInt 32 1
              18:     17(int) Constant 0
              19:             TypePointer Uniform 7(fvec4)
   23(tbufName2):             TypeStruct 7(fvec4)
              24:             TypePointer PushConstant 23(tbufName2)
              25:     24(ptr) Variable PushConstant
              26:             TypePointer PushConstant 7(fvec4)
   30(tbufName2):             TypeStruct 7(fvec4)
              31:             TypePointer Uniform 30(tbufName2)
              32:     31(ptr) Variable Uniform
              38:     17(int) SpecConstant 10
         4(main):           2 Function None 3
               5:             Label
                              Return
                              FunctionEnd
11(PixelShaderFunction(vf4;):    7(fvec4) Function None 9
       10(input):      8(ptr) FunctionParameter
              12:             Label
              13:    7(fvec4) Load 10(input)
              20:     19(ptr) AccessChain 16 18
              21:    7(fvec4) Load 20
              22:    7(fvec4) FAdd 13 21
              27:     26(ptr) AccessChain 25 18
              28:    7(fvec4) Load 27
              29:    7(fvec4) FAdd 22 28
              33:     19(ptr) AccessChain 32 18
              34:    7(fvec4) Load 33
              35:    7(fvec4) FAdd 29 34
                              ReturnValue 35
                              FunctionEnd
