| #version 460 |
| layout(local_size_x = 512, local_size_y = 1) in; |
| layout(std430) buffer; |
| |
| struct MyStruct { |
| uint a; |
| uint b; |
| uint c; |
| }; |
| |
| layout(binding = 0) buffer MyStructs { |
| uint count; |
| MyStruct data[]; |
| } |
| my_structs; |
| |
| layout(binding = 1) buffer Output { |
| uint a; |
| uint b; |
| uint c; |
| } |
| o; |
| |
| shared MyStruct s[512]; |
| |
| void main() { |
| s[0] = MyStruct(1, 2, 3); |
| |
| uint id = gl_GlobalInvocationID.x; |
| MyStruct ms = |
| id > my_structs.count ? s[id - my_structs.count] : my_structs.data[id]; |
| |
| atomicAdd(o.a, ms.a); |
| atomicAdd(o.b, ms.b); |
| atomicAdd(o.c, ms.c); |
| } |
| |