#version 310 es precision highp float; layout (local_size_x = 16, local_size_y = 32, local_size_z = 4) in; shared float s; shared int i; buffer outb { float f; float g; float h; vec3 uns[]; // this makes it look like the "second" set of 3 floats in a struct, which LLVM // takes advantage of when optimizing, giving confusing results, like thinking // &outbname.uns[18].x == &outbname[9].uns.x } outbname; buffer outbna { int k; vec4 na; } outbnamena; buffer outs { vec4 va[]; } outnames; void main() { barrier(); outbname.f = s; outbnamena.na = vec4(s); s = outbname.uns[18].x; // TODO: see note above //outbname.uns[17] = vec3(3.0); // TODO: see note above, this one bitcasts, which isn't handled outbname.uns[i] = vec3(s); outnames.va[gl_LocalInvocationID.x] = vec4(s); }