Merge pull request #2913 from greg-lunarg/i2905
[platform/upstream/glslang.git] / Test / 300.frag
1 #version 300 es
2 void nodef1(float f); // ERROR, no default precision
3 uniform sampler2D s2D;
4 uniform lowp sampler3D s3D;
5 uniform samplerCube sCube;
6 uniform lowp samplerCubeShadow sCubeShadow;
7 uniform lowp sampler2DShadow s2DShadow;
8 uniform lowp sampler2DArray s2DArray;
9 uniform lowp sampler2DArrayShadow s2DArrayShadow;
10
11 uniform lowp isampler2D is2D;
12 uniform lowp isampler3D is3D;
13 uniform lowp isamplerCube isCube;
14 uniform lowp isampler2DArray is2DArray;
15
16 uniform lowp usampler2D us2D;
17 uniform lowp usampler3D us3D;
18 uniform lowp usamplerCube usCube;
19 uniform lowp usampler2DArray us2DArray;
20 precision lowp float;
21 in float c1D;
22 in vec2  c2D;
23 in vec3  c3D;
24 smooth vec4  c4D;
25
26 flat in int   ic1D;
27 flat in ivec2 ic2D;
28 flat in ivec3 ic3D;
29 flat in ivec4 ic4D;
30 noperspective in vec4 badv; // ERROR
31 in sampler2D bads;          // ERROR
32 precision lowp uint;        // ERROR
33
34 struct s {
35     int i;
36     sampler2D s;
37 };
38
39 in s badout;               // ERROR, can't contain a sampler
40                            // ERROR, can't have int in struct without flat
41 struct S2 {
42     vec3 c;
43     float f;
44 };
45
46 in S2 s2;
47
48 out vec3 sc;
49 out float sf;
50
51 uniform sampler2D arrayedSampler[5];
52
53 void main()
54 {
55     float f;
56     vec4 v;
57     v = texture(s2D, c2D);
58     v = textureProj(s3D, c4D);
59     v = textureLod(s2DArray, c3D, 1.2);
60     f = textureOffset(s2DShadow, c3D, ic2D, c1D);  // ERROR, offset argument not constant
61     v = texelFetch(s3D, ic3D, ic1D);
62     v = texelFetchOffset(arrayedSampler[2], ic2D, 4, ic2D);   // ERROR, offset argument not constant
63     f = textureLodOffset(s2DShadow, c3D, c1D, ic2D);
64     v = textureProjLodOffset(s2D, c3D, c1D, ic2D);
65     v = textureGrad(sCube, c3D, c3D, c3D);
66     f = textureGradOffset(s2DArrayShadow, c4D, c2D, c2D, ic2D);
67     v = textureProjGrad(s3D, c4D, c3D, c3D);
68     v = textureProjGradOffset(s2D, c3D, c2D, c2D, ic2D);
69     v = texture(arrayedSampler[ic1D], c2D);                 // ERROR
70
71     ivec4 iv;
72     iv = texture(is2D, c2D);
73     iv = textureProjOffset(is2D, c4D, ic2D);
74     iv = textureProjLod(is2D, c3D, c1D);
75     iv = textureProjGrad(is2D, c3D, c2D, c2D);
76     iv = texture(is3D, c3D, 4.2);
77     iv = textureLod(isCube, c3D, c1D);
78     iv = texelFetch(is2DArray, ic3D, ic1D);
79
80     iv.xy = textureSize(sCubeShadow, 2);
81
82     float precise;
83     double boo;       // ERROR
84     dvec2 boo2;       // ERROR
85     dvec3 boo3;       // ERROR
86     dvec4 boo4;       // ERROR
87
88     f += gl_FragCoord.y;
89     gl_FragDepth = f;
90
91     sc = s2.c;
92     sf = s2.f;
93
94     sinh(c1D) +
95     cosh(c1D) * tanh(c2D);
96     asinh(c4D) + acosh(c4D);
97     atanh(c3D);
98 }
99
100 uniform multi {
101     int[2] a[3];      // ERROR
102     int[2][3] b;      // ERROR
103     int c[2][3];      // ERROR
104 } multiInst[2][3];    // ERROR
105
106 out vec4 colors[4];
107
108 void foo()
109 {
110     colors[2] = c4D;
111     colors[ic1D] = c4D;  // ERROR
112 }
113
114 uniform s st1;
115 uniform s st2;
116
117 void foo13(s inSt2)
118 {
119     if (st1 == st2);  // ERROR
120     if (st1 != st2);  // ERROR
121     st1.s == st2.s;   // ERROR
122     inSt2 = st1;      // ERROR
123     inSt2 == st1;     // ERROR
124 }
125
126 void foo23()
127 {
128     textureOffset(s2DShadow, c3D, ivec2(-8, 7), c1D);
129     textureOffset(s2DShadow, c3D, ivec2(-9, 8), c1D);
130 }
131
132 void foo324(void)
133 {
134     float p = pow(3.2, 4.6);
135     p += sin(0.4);
136     p += distance(vec2(10.0, 11.0), vec2(13.0, 15.0)); // 5
137     p += dot(vec3(2,3,5), vec3(-2,-1,4));              // 13
138     vec3 c3 = cross(vec3(3,-3,1), vec3(4,9,2));        // (-15, -2, 39)
139     c3 += faceforward(vec3(1,2,3), vec3(2,3,5), vec3(-2,-1,4));     // (-1,-2,-3)
140     c3 += faceforward(vec3(1,2,3), vec3(-2,-3,-5), vec3(-2,-1,4));  // (1,2,3)
141     vec2 c2 = reflect(vec2(1,3), vec2(0,1));           // (1,-3)
142     c2 += refract(vec2(1,3), vec2(0,1), 1.0);          // (1,-3)
143     c2 += refract(vec2(1,3), vec2(0,1), 3.0);
144     c2 += refract(vec2(1,0.1), vec2(0,1), 5.0);        // (0,0)
145     mat3x2 m32 = outerProduct(vec2(2,3), vec3(5,7,11));// rows: (10, 14, 22), (15, 21, 33)
146 }
147
148 uniform mediump;       // ERROR
149
150 layout(early_fragment_tests) in;  // ERROR
151
152 // Test extension GL_EXT_shader_integer_mix
153 #extension GL_EXT_shader_integer_mix : enable
154 bool b1, b2, b;
155 int x,y;
156 uint z,w;
157
158 void testmix()
159 {
160     int ival  = mix(x, y, b);
161     ivec2 iv2 = mix(ivec2(x), ivec2(y), bvec2(b));
162     ivec3 iv3 = mix(ivec3(x), ivec3(y), bvec3(b));
163     ivec4 iv4 = mix(ivec4(x), ivec4(x), bvec4(b));
164     uint  uiv = mix(z, w, b);
165     uvec2 uv2 = mix(uvec2(z), uvec2(z), bvec2(b));
166     uvec3 uv3 = mix(uvec3(z), uvec3(z), bvec3(b));
167     uvec4 uv4 = mix(uvec4(z), uvec4(z), bvec4(b));
168     bool  bv  = mix(b1, b2, b);
169     bvec2 bv2 = mix(bvec2(b1), bvec2(b2), bvec2(b));
170     bvec3 bv3 = mix(bvec3(b1), bvec3(b2), bvec3(b));
171     bvec4 bv4 = mix(bvec4(b1), bvec4(b2), bvec4(b));
172 }
173
174 #extension GL_EXT_shader_integer_mix : disable
175 void testmixFail()
176 {
177     int ival  = mix(x, y, b); // Error since extenson GL_EXT_shader_integer_mix is disabled
178 }
179
180 // Test layout qualifier "index" with extension GL_EXT_blend_func_extended
181 layout(location = 0, index = 1) out vec4 outVarFail; // Error Index supported with extension GL_EXT_blend_func_extended enabled
182 #extension GL_EXT_blend_func_extended : enable
183 layout(location = 0, index = 2) out vec4 outVarPass;
184
185 #ifndef GL_FRAGMENT_PRECISION_HIGH
186 #error missing GL_FRAGMENT_PRECISION_HIGH
187 #endif
188
189 invariant in;                // ERROR
190 invariant in vec4;           // ERROR
191 invariant in vec4 fooinv;    // ERROR
192
193 float imageBuffer;    // ERROR, reserved
194 float uimage2DRect;   // ERROR, reserved