| #version 450 |
| |
| #extension GL_EXT_buffer_reference : enable |
| |
| layout(buffer_reference, std430) buffer BlockA { float a; }; |
| layout(buffer_reference, std430) buffer BlockB { uint b; }; |
| layout(buffer_reference) buffer Node; |
| layout(buffer_reference, std430) buffer Node { int v; Node next; }; |
| |
| layout(set = 0, binding = 0) uniform Handles { |
| BlockA pa; |
| BlockB pb; |
| Node pn; |
| } handles; |
| |
| struct WrapA { BlockA p; }; |
| struct WrapB { BlockB p; }; |
| |
| // Overloads that differ only in which buffer reference type they take. |
| float f(BlockA p) { return p.a; } |
| float f(BlockB p) { return float(p.b); } |
| |
| // The same, one level down, where the reference is a struct member. |
| float g(WrapA w) { return w.p.a; } |
| float g(WrapB w) { return float(w.p.b); } |
| |
| // A block that names itself still has to produce a finite mangled name. |
| float h(Node n) { return float(n.next.v); } |
| |
| layout(location = 0) out float o; |
| |
| void main() |
| { |
| o = f(handles.pa) + f(handles.pb) |
| + g(WrapA(handles.pa)) + g(WrapB(handles.pb)) |
| + h(handles.pn); |
| } |