| #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); | |
| } |