#version 310 es layout(local_size_x = 1) in; layout(std430, binding = 0) writeonly buffer SSBO { vec4 data[]; } outdata; layout(std430, binding = 1) readonly buffer SSBO2 { vec4 data[]; } indata; struct Foo { vec4 a; vec4 b; vec4 c; vec4 d; }; layout(std430, binding = 2) readonly buffer SSBO3 { Foo foos[]; } foobar; vec4 bar(Foo foo) { return foo.a + foo.b + foo.c + foo.d; } void baz(out Foo foo) { uint ident = gl_GlobalInvocationID.x; foo.a = indata.data[4u * ident + 0u]; foo.b = indata.data[4u * ident + 1u]; foo.c = indata.data[4u * ident + 2u]; foo.d = indata.data[4u * ident + 3u]; } void meow(inout Foo foo) { foo.a += 10.0; foo.b += 20.0; foo.c += 30.0; foo.d += 40.0; } void main() { Foo foo; baz(foo); meow(foo); outdata.data[gl_GlobalInvocationID.x] = bar(foo) + bar(foobar.foos[gl_GlobalInvocationID.x]); }