| #version 420 core | |
| #version 420 core | |
| varying vec2 v2; // ERROR, varying reserved | |
| in vec4 bad[10]; | |
| highp in vec4 badorder; | |
| out invariant vec4 badorder2; | |
| in centroid vec4 badorder4; // ERROR, no centroid input to vertex stage | |
| out flat vec4 badorder3; | |
| void bar(in const float a); | |
| void bar2(highp in float b); | |
| smooth flat out vec4 rep; // ERROR, replicating interpolation qualification | |
| centroid sample out vec4 rep2; // ERROR, replicating auxiliary qualification | |
| in uniform vec4 rep3; // ERROR, replicating storage qualification | |
| int anonconst; | |
| const int aconst = 5; | |
| const int a = aconst; | |
| const int b = anonconst; // ERROR at global scope | |
| const int foo() // ERROR, no const functions | |
| { | |
| const int a = aconst; | |
| const int b = anonconst; | |
| const int c = a; // still compile-time const | |
| const int d = b; // not a compile-time const | |
| float x[c]; // okay | |
| float y[d]; // ERROR | |
| return b; | |
| } | |
| void main() | |
| { | |
| int i; | |
| if (i == 3) | |
| int j = i; | |
| else | |
| int k = j; // ERROR, j is undeclared | |
| int m = k; // ERROR, k is undeclared | |
| int n = j; // ERROR, j is undeclared | |
| while (true) | |
| int jj; | |
| int kk = jj; // ERROR, jj is undeclared | |
| } | |
| const float cx = 4.20; | |
| const float dx = 4.20; | |
| void bar(in highp volatile vec4 v) | |
| { | |
| int s; | |
| s.x; // okay | |
| s.y; // ERROR | |
| if (bad[0].x == cx.x) | |
| ; | |
| if (cx.x == dx.x) | |
| badorder3 = bad[0]; | |
| float f; | |
| vec3 smeared = f.xxx; | |
| f.xxxxx; // ERROR | |
| f.xxy; // ERROR | |
| } | |
| layout(binding = 3) uniform; // ERROR | |
| layout(binding = 3) uniform boundblock { int aoeu; } boundInst; | |
| layout(binding = 7) uniform anonblock { int aoeu; } ; | |
| layout(location = 1) in; // ERROR | |
| layout(binding = 1) in inblock { int aoeua; }; // ERROR | |
| layout(binding = 100000) uniform anonblock2 { int aooeu; } ; | |
| layout(binding = 4) uniform sampler2D sampb1; | |
| layout(binding = 5) uniform sampler2D sampb2[10]; | |
| layout(binding = 80) uniform sampler2D sampb3; // ERROR, binding too big | |
| layout(binding = 31) uniform sampler2D sampb4; | |
| layout(binding = 79) uniform sampler2D sampb5[2]; // ERROR, binding too big | |
| int fgfg(float f, mediump int i); | |
| int fgfg(float f, highp int i); | |
| out gl_PerVertex { | |
| float gl_ClipDistance[4]; | |
| }; | |
| patch in vec4 patchIn; // ERROR | |
| patch out vec4 patchOut; // ERROR | |
| void bar23444() | |
| { | |
| mat4x3 m43; \ | |
| float a1 = m43[3].y; | |
| vec3 v3; | |
| int a2 = m43.length(); | |
| a2 += m43[1].length(); | |
| a2 += v3.length(); | |
| const float b = 2 * a1; | |
| int a = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset; | |
| } | |
| const int comma0 = (2, 3); // ERROR | |
| int comma1[(2, 3)]; // ERROR | |
| layout(r32i) uniform iimage2D iimg2D; | |
| layout(rgba32i) uniform iimage2D iimg2Drgba; | |
| layout(rgba32f) uniform image2D img2Drgba; | |
| layout(r32ui) uniform uimage2D uimg2D; | |
| uniform image2DMS img2DMS; // ERROR image variables not declared writeonly must have format layout qualifier | |
| uniform writeonly image2DMS img2DMSWO; | |
| void qux() | |
| { | |
| int i = aoeu; | |
| imageAtomicCompSwap(iimg2D, ivec2(i,i), i, i); | |
| imageAtomicAdd(uimg2D, ivec2(i,i), uint(i)); | |
| imageAtomicMin(iimg2Drgba, ivec2(i,i), i); // ERROR iimg2Drgba does not have r32i layout | |
| imageAtomicMax(img2Drgba, ivec2(i,i), i); // ERROR img2Drgba is not integer image | |
| ivec4 pos = imageLoad(iimg2D, ivec2(i,i)); | |
| vec4 col = imageLoad(img2DMS, ivec2(i,i), i); | |
| imageStore(img2DMSWO, ivec2(i,i), i, vec4(0)); | |
| imageLoad(img2DMSWO, ivec2(i,i), i); // ERROR, drops writeonly | |
| } | |
| volatile float vol; // ERROR, not an image | |
| readonly int vol2; // ERROR, not an image | |
| void passr(coherent readonly iimage2D image) | |
| { | |
| } | |
| layout(r32i) coherent readonly uniform iimage2D qualim1; | |
| layout(r32i) coherent volatile readonly uniform iimage2D qualim2; | |
| void passrc() | |
| { | |
| passr(qualim1); // ERROR, changing formats | |
| passr(qualim2); // ERROR, drops volatile, ERROR, changing formats | |
| passr(iimg2D); // ERROR, changing formats | |
| } | |
| layout(rg8i) uniform uimage2D i1bad; // ERROR, type mismatch | |
| layout(rgba32i) uniform image2D i2bad; // ERROR, type mismatch | |
| layout(rgba32f) uniform uimage2D i3bad; // ERROR, type mismatch | |
| layout(r8_snorm) uniform iimage2D i4bad; // ERROR, type mismatch | |
| layout(rgba32ui) uniform iimage2D i5bad; // ERROR, type mismatch | |
| layout(r8ui) uniform iimage2D i6bad; // ERROR, type mismatch | |
| uniform offcheck { | |
| layout(offset = 16) int foo; // ERROR | |
| } offcheckI; | |
| uniform sampler1D samp1D; | |
| uniform sampler1DShadow samp1Ds; | |
| void qlod() | |
| { | |
| int levels; | |
| levels = textureQueryLevels(samp1D); // ERROR, not until 430 | |
| levels = textureQueryLevels(samp1Ds); // ERROR, not until 430 | |
| } | |
| layout(binding=0) writeonly uniform image1D badArray[]; | |
| layout(binding = 74) uniform sampler2D u_sampler0[6]; |