163 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			GLSL
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			GLSL
		
	
	
	
#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];
 |