#version 330 compatibility in vec4 inVar; layout(location=0, index=0) out vec4 outVar; varying vec4 varyingVar; void main() { gl_FragColor = varyingVar; // link ERROR: user output was used gl_FragData[1] = inVar; // link ERROR: user output was used int buffer = 4; } #extension GL_ARB_separate_shader_objects : enable in gl_PerFragment { vec4 gl_Color; }; void foo() { vec4 c = gl_Color; outVar = inVar; } in gl_block { // ERROR int gl_i; } gl_name; in myBlock { int gl_i; // ERROR } gl_name; // ERROR in gl_PerVertex { // ERROR vec4 gl_FragCoord; } gl_in[]; in gl_PerVertex { // ERROR vec4 gl_FragCoord; }; // ERROR const int start = 6; layout(location = -2) in vec4 v1; // ERROR layout(location = start + 2) in vec4 v2; // ERROR layout(location = 4.7e10) in vec4 v20; // ERROR layout(location = +60) in float v21; // ERROR layout(location = (2)) in float v22; // ERROR struct S { float f1; layout(location = 3) float f2; // ERROR }; layout(location = 1) in inblock { // ERROR float f1; layout(location = 3) float f2; // ERROR }; layout(location = 1) uniform ublock { // ERROR float f1; layout(location = 3) float f2; // ERROR } uinst; #extension GL_ARB_enhanced_layouts : enable layout(location = start) in vec4 v3; layout(location = -2) in vec4 v4; // ERROR layout(location = -start) in vec4 v5; // ERROR layout(location = start*start - 2 - 4) in vec4 v6; layout(location = +61) in float v23; layout(location = (62)) in float v24; struct S2 { float f1; layout(location = 3) float f2; // ERROR }; layout(location = 28) in inblock2 { bool b1; float f1; layout(location = 25) float f2; vec4 f3; layout(location = 21) S2 s2; vec4 f4; vec4 f5; } ininst2; layout(location = 13) uniform ublock2 { // ERROR float f1; layout(location = 3) float f2; // ERROR } uinst2; in inblock3 { // ERROR, mix of location internal with no location external float f1; layout(location = 40) float f2; } in3; in ublock4 { layout(location = 50) float f1; layout(location = 51) float f2; } in4; layout(location = 33) in struct SS { vec3 a; // gets location 33 mat2 b; // gets locations 34 and 35 vec4 c[2]; // gets locations 36 and 37 layout (location = 38) vec2 A; // ERROR, can't use on struct member } s; layout(location = 44) in block { vec4 d; // gets location 44 vec4 e; // gets location 45 layout(location = 47) vec4 f; // gets location 47 vec4 g; // gets location 48 layout (location = 41) vec4 h; // gets location 41 vec4 i; // gets location 42 vec4 j; // gets location 43 vec4 k; // ERROR, location 44 already used }; layout(index=0) out vec4 outVar2; // ERROR: missing explicit location layout(location=0, index=1) out vec4 outVar3; // no error even though location is overlapping layout(location=0, index=1) out vec4 outVar4; // ERROR overlapping layout(location=27, index=0) in vec4 indexIn; // ERROR, not on in layout(location=0, index=0) in; // ERROR, not just on in layout(location=0, index=0) out; // ERROR, need a variable layout(location=26, index=0) out indexBlock { int a; } indexBlockI; // ERROR, not on a block uniform sampler1D samp1D; uniform sampler2DShadow samp2Ds; void qlod() { vec2 lod; float pf; vec2 pf2; vec3 pf3; lod = textureQueryLod(samp1D, pf); // ERROR, not until 400 lod = textureQueryLod(samp2Ds, pf2); // ERROR, not until 400 } int precise; // okay, not a keyword yet struct SKeyMem { int precise; } KeyMem; // okay, not a keyword yet void fooKeyMem() { KeyMem.precise; } layout(location=28, index=2) out vec4 outIndex2; // ERROR index out of range