#version 310 es layout(local_size_x = 1) in; struct S0 { vec4 a; }; struct S1 { vec4 a; }; vec4 overload(S0 s0) { return s0.a; } vec4 overload(S1 s1) { return s1.a; } layout(std430, binding = 0) buffer SSBO0 { S0 s0s[]; }; layout(std430, binding = 1) buffer SSBO1 { S1 s1s[]; }; layout(std430, binding = 2) buffer SSBO2 { vec4 outputs[]; }; void main() { S0 s0 = s0s[gl_GlobalInvocationID.x]; S1 s1 = s1s[gl_GlobalInvocationID.x]; outputs[gl_GlobalInvocationID.x] = overload(s0) + overload(s1); }