1 #version 330 compatibility 2 3 in vec4 inVar; 4 layout(location=0, index=0) out vec4 outVar; 5 6 varying vec4 varyingVar; 7 8 void main() 9 { 10 gl_FragColor = varyingVar; // link ERROR: user output was used 11 gl_FragData[1] = inVar; // link ERROR: user output was used 12 int buffer = 4; 13 } 14 15 #extension GL_ARB_separate_shader_objects : enable 16 17 in gl_PerFragment { 18 vec4 gl_Color; 19 }; 20 21 void foo() 22 { 23 vec4 c = gl_Color; 24 outVar = inVar; 25 } 26 27 in gl_block { // ERROR 28 int gl_i; 29 } gl_name; 30 31 in myBlock { 32 int gl_i; // ERROR 33 } gl_name; // ERROR 34 35 in gl_PerVertex { // ERROR 36 vec4 gl_FragCoord; 37 } gl_in[]; 38 39 in gl_PerVertex { // ERROR 40 vec4 gl_FragCoord; 41 }; // ERROR 42 43 const int start = 6; 44 layout(location = -2) in vec4 v1; // ERROR 45 layout(location = start + 2) in vec4 v2; // ERROR 46 layout(location = 4.7e10) in vec4 v20; // ERROR 47 layout(location = +60) in float v21; // ERROR 48 layout(location = (2)) in float v22; // ERROR 49 50 struct S { 51 float f1; 52 layout(location = 3) float f2; // ERROR 53 }; 54 55 layout(location = 1) in inblock { // ERROR 56 float f1; 57 layout(location = 3) float f2; // ERROR 58 }; 59 60 layout(location = 1) uniform ublock { // ERROR 61 float f1; 62 layout(location = 3) float f2; // ERROR 63 } uinst; 64 65 #extension GL_ARB_enhanced_layouts : enable 66 67 layout(location = start) in vec4 v3; 68 layout(location = -2) in vec4 v4; // ERROR 69 layout(location = -start) in vec4 v5; // ERROR 70 layout(location = start*start - 2 - 4) in vec4 v6; 71 layout(location = +61) in float v23; 72 layout(location = (62)) in float v24; 73 74 struct S2 { 75 float f1; 76 layout(location = 3) float f2; // ERROR 77 }; 78 79 layout(location = 28) in inblock2 { 80 bool b1; 81 float f1; 82 layout(location = 25) float f2; 83 vec4 f3; 84 layout(location = 21) S2 s2; 85 vec4 f4; 86 vec4 f5; 87 } ininst2; 88 89 layout(location = 13) uniform ublock2 { // ERROR 90 float f1; 91 layout(location = 3) float f2; // ERROR 92 } uinst2; 93 94 in inblock3 { // ERROR, mix of location internal with no location external 95 float f1; 96 layout(location = 40) float f2; 97 } in3; 98 99 in ublock4 { 100 layout(location = 50) float f1; 101 layout(location = 51) float f2; 102 } in4; 103 104 layout(location = 33) in struct SS { 105 vec3 a; // gets location 33 106 mat2 b; // gets locations 34 and 35 107 vec4 c[2]; // gets locations 36 and 37 108 layout (location = 38) vec2 A; // ERROR, can't use on struct member 109 } s; 110 111 layout(location = 44) in block { 112 vec4 d; // gets location 44 113 vec4 e; // gets location 45 114 layout(location = 47) vec4 f; // gets location 47 115 vec4 g; // gets location 48 116 layout (location = 41) vec4 h; // gets location 41 117 vec4 i; // gets location 42 118 vec4 j; // gets location 43 119 vec4 k; // ERROR, location 44 already used 120 }; 121 122 layout(index=0) out vec4 outVar2; // ERROR: missing explicit location 123 layout(location=0, index=1) out vec4 outVar3; // no error even though location is overlapping 124 layout(location=0, index=1) out vec4 outVar4; // ERROR overlapping 125 layout(location=27, index=0) in vec4 indexIn; // ERROR, not on in 126 layout(location=0, index=0) in; // ERROR, not just on in 127 layout(location=0, index=0) out; // ERROR, need a variable 128 layout(location=26, index=0) out indexBlock { int a; } indexBlockI; // ERROR, not on a block 129 130 uniform sampler1D samp1D; 131 uniform sampler2DShadow samp2Ds; 132 133 void qlod() 134 { 135 vec2 lod; 136 float pf; 137 vec2 pf2; 138 vec3 pf3; 139 140 lod = textureQueryLod(samp1D, pf); // ERROR, not until 400 141 lod = textureQueryLod(samp2Ds, pf2); // ERROR, not until 400 142 } 143 144 int precise; // okay, not a keyword yet 145 struct SKeyMem { int precise; } KeyMem; // okay, not a keyword yet 146 147 void fooKeyMem() 148 { 149 KeyMem.precise; 150 } 151 152 layout(location=28, index=2) out vec4 outIndex2; // ERROR index out of range