#version 310 es #extension GL_EXT_shader_io_blocks : require struct Foo { vec3 a; vec3 b; vec3 c; }; // This will lock to input location 2. layout(location = 2) in vec4 Input2; // This will lock to input location 4. layout(location = 4) in vec4 Input4; // This will pick first available, which is 0. layout(location = 0) in vec4 Input0; // Locks output 0. layout(location = 0) out float vLocation0; // Locks output 1. layout(location = 1) out float vLocation1; // Picks first available two locations, so, 2 and 3. layout(location = 2) out float vLocation2[2]; // Picks first available location, 4. layout(location = 4) out Foo vLocation4; // Picks first available location 9. layout(location = 9) out float vLocation9; // Locks location 7 and 8. layout(location = 7) out VertexOut { vec3 color; vec3 foo; } vout; void main() { gl_Position = vec4(1.0) + Input2 + Input4 + Input0; vLocation0 = 0.0; vLocation1 = 1.0; vLocation2[0] = 2.0; vLocation2[1] = 2.0; Foo foo; foo.a = vec3(1.0); foo.b = vec3(1.0); foo.c = vec3(1.0); vLocation4 = foo; vLocation9 = 9.0; vout.color = vec3(2.0); vout.foo = vec3(4.0); }