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