Merge pull request #2976 from jeremy-lunarg/hayes-fix-2975
[platform/upstream/glslang.git] / Test / 400.geom
1 #version 400 core\r
2 \r
3 void main()\r
4 {\r
5     EmitStreamVertex(1);\r
6     EndStreamPrimitive(0);\r
7     EmitVertex();\r
8     EndPrimitive();\r
9     int id = gl_InvocationID;\r
10 }\r
11 \r
12 layout(invocations = 4) in outbn { int a; } bn[]; // ERROR, not on a block\r
13 layout(max_vertices = 127) out;\r
14 layout(invocations = 4) in;\r
15 \r
16 #extension GL_ARB_separate_shader_objects : enable\r
17 \r
18 in gl_PerVertex {      // testing input arrays with a block redeclaration, see 420.geom for without\r
19     vec4 gl_Position;\r
20     layout(std140, location = 3) patch float gl_PointSize; // ERRORs...\r
21 } gl_in[];\r
22 \r
23 void foo()\r
24 {\r
25     gl_in.length();  // ERROR\r
26     gl_in[1].gl_Position;\r
27 }\r
28 \r
29 in vec4 color[];\r
30 in vec4 color2[];\r
31 in vec4 colorS[3];\r
32 in vec4 colorBad[4];\r
33 \r
34 void foo2()\r
35 {\r
36     color.length(); // ERROR\r
37     colorS.length();\r
38 }\r
39 \r
40 layout(triangles) in;  // give ERROR just for colorBad\r
41 \r
42 in vec4 color[3];\r
43 in vec4 color2[3];\r
44 in vec4 colorbad2[2];  // ERROR\r
45 \r
46 void foo3()\r
47 {\r
48     gl_in.length();\r
49     color.length();\r
50     color2.length();\r
51     colorS.length();\r
52 }\r
53 \r
54 layout(location = 4) in vec4 cva[3];\r
55 layout(location = 5) in vec4 cvb[3];\r
56 layout(location = 2) in mat3 cmc[3];  // ERROR, collision\r
57 \r
58 patch in vec4 patchIn[];            // ERROR\r
59 patch out vec4 patchOut;            // ERROR\r
60 \r
61 in float scalar;  // ERROR, no array\r
62 \r
63 layout(max_vertices = 127, invocations = 4) out;      // ERROR\r
64 layout(invocations = 4, max_vertices = 127) in;       // ERROR\r
65 layout(max_vertices = 127, invocations = 4) uniform;  // 2 ERRORs\r
66 \r
67 in inblockscalar {\r
68     int a;\r
69 } inbls;  // ERROR, not an array\r
70 \r
71 in inblocka {\r
72     int a;\r
73 } inbla[17];  // ERROR, wrong array size\r
74 \r
75 void bits()\r
76 {\r
77     uvec2 u2;\r
78     u2 = uaddCarry(u2, u2, u2);\r
79     uint u1;\r
80     u1 = usubBorrow(u1, u1, u1);\r
81     uvec4 u4;\r
82     umulExtended(u4, u4, u4, u4);\r
83     ivec4 i4;\r
84     imulExtended(i4, i4, i4, i4);\r
85     int i1;\r
86     i1 = bitfieldExtract(i1, 4, 5);\r
87     uvec3 u3;\r
88     u3 = bitfieldExtract(u3, 4, 5);\r
89     ivec3 i3;\r
90     i3 = bitfieldInsert(i3, i3, 4, 5);\r
91     u1 = bitfieldInsert(u1, u1, 4, 5);\r
92     ivec2 i2;\r
93     i2 = bitfieldReverse(i2);\r
94     u4 = bitfieldReverse(u4);\r
95     i1 = bitCount(i1);\r
96     i3 = bitCount(u3);\r
97     i2 = findLSB(i2);\r
98     i4 = findLSB(u4);\r
99     i1 = findMSB(i1);\r
100     i2 = findMSB(u2);\r
101 }\r
102 \r
103 layout(location = 7, index = 1) out vec4 indexedOut;\r
104 \r
105 uniform sampler1D samp1D;\r
106 uniform sampler2DShadow samp2Ds;\r
107 \r
108 void qlod()\r
109 {\r
110     vec2 lod;\r
111     float pf;\r
112     vec2 pf2;\r
113     vec3 pf3;\r
114 \r
115     lod = textureQueryLod(samp1D, pf);      // ERROR, only in fragment\r
116     lod = textureQueryLod(samp2Ds, pf2);    // ERROR, only in fragment\r
117 }\r
118 \r
119 void doubles()\r
120 {\r
121     double doublev;\r
122     dvec2 dvec2v;\r
123     dvec3 dvec3v;\r
124     dvec4 dvec4v;\r
125 \r
126     bool boolv;\r
127     bvec2 bvec2v;\r
128     bvec3 bvec3v;\r
129     bvec4 bvec4v;\r
130 \r
131     doublev = sqrt(2.9);\r
132     dvec2v  = sqrt(dvec2(2.7));\r
133     dvec3v  = sqrt(dvec3(2.0));\r
134     dvec4v  = sqrt(dvec4(2.1));\r
135 \r
136     doublev += inversesqrt(doublev);\r
137     dvec2v  += inversesqrt(dvec2v);\r
138     dvec3v  += inversesqrt(dvec3v);\r
139     dvec4v  += inversesqrt(dvec4v);\r
140 \r
141     doublev += abs(doublev);\r
142     dvec2v  += abs(dvec2v);\r
143     dvec3v  += abs(dvec3v);\r
144     dvec4v  += abs(dvec4v);\r
145 \r
146     doublev += sign(doublev);\r
147     dvec2v  += sign(dvec2v);\r
148     dvec3v  += sign(dvec3v);\r
149     dvec4v  += sign(dvec4v);\r
150 \r
151     doublev += floor(doublev);\r
152     dvec2v  += floor(dvec2v);\r
153     dvec3v  += floor(dvec3v);\r
154     dvec4v  += floor(dvec4v);\r
155 \r
156     doublev += trunc(doublev);\r
157     dvec2v  += trunc(dvec2v);\r
158     dvec3v  += trunc(dvec3v);\r
159     dvec4v  += trunc(dvec4v);\r
160 \r
161     doublev += round(doublev);\r
162     dvec2v  += round(dvec2v);\r
163     dvec3v  += round(dvec3v);\r
164     dvec4v  += round(dvec4v);\r
165 \r
166     doublev += roundEven(doublev);\r
167     dvec2v  += roundEven(dvec2v);\r
168     dvec3v  += roundEven(dvec3v);\r
169     dvec4v  += roundEven(dvec4v);\r
170 \r
171     doublev += ceil(doublev);\r
172     dvec2v  += ceil(dvec2v);\r
173     dvec3v  += ceil(dvec3v);\r
174     dvec4v  += ceil(dvec4v);\r
175 \r
176     doublev += fract(doublev);\r
177     dvec2v  += fract(dvec2v);\r
178     dvec3v  += fract(dvec3v);\r
179     dvec4v  += fract(dvec4v);\r
180 \r
181     doublev += mod(doublev, doublev);\r
182     dvec2v  += mod(dvec2v, doublev);\r
183     dvec3v  += mod(dvec3v, doublev);\r
184     dvec4v  += mod(dvec4v, doublev);\r
185     dvec2v  += mod(dvec2v, dvec2v);\r
186     dvec3v  += mod(dvec3v, dvec3v);\r
187     dvec4v  += mod(dvec4v, dvec4v);\r
188 \r
189     doublev += modf(doublev, doublev);\r
190     dvec2v  += modf(dvec2v,  dvec2v);\r
191     dvec3v  += modf(dvec3v,  dvec3v);\r
192     dvec4v  += modf(dvec4v,  dvec4v);\r
193 \r
194     doublev += min(doublev, doublev);\r
195     dvec2v  += min(dvec2v, doublev);\r
196     dvec3v  += min(dvec3v, doublev);\r
197     dvec4v  += min(dvec4v, doublev);\r
198     dvec2v  += min(dvec2v, dvec2v);\r
199     dvec3v  += min(dvec3v, dvec3v);\r
200     dvec4v  += min(dvec4v, dvec4v);\r
201 \r
202     doublev += max(doublev, doublev);\r
203     dvec2v  += max(dvec2v, doublev);\r
204     dvec3v  += max(dvec3v, doublev);\r
205     dvec4v  += max(dvec4v, doublev);\r
206     dvec2v  += max(dvec2v, dvec2v);\r
207     dvec3v  += max(dvec3v, dvec3v);\r
208     dvec4v  += max(dvec4v, dvec4v);\r
209 \r
210     doublev += clamp(doublev, doublev, doublev);\r
211     dvec2v  += clamp(dvec2v, doublev, doublev);\r
212     dvec3v  += clamp(dvec3v, doublev, doublev);\r
213     dvec4v  += clamp(dvec4v, doublev, doublev);\r
214     dvec2v  += clamp(dvec2v, dvec2v, dvec2v);\r
215     dvec3v  += clamp(dvec3v, dvec3v, dvec3v);\r
216     dvec4v  += clamp(dvec4v, dvec4v, dvec4v);\r
217 \r
218     doublev += mix(doublev, doublev, doublev);\r
219     dvec2v  += mix(dvec2v, dvec2v, doublev);\r
220     dvec3v  += mix(dvec3v, dvec3v, doublev);\r
221     dvec4v  += mix(dvec4v, dvec4v, doublev);\r
222     dvec2v  += mix(dvec2v, dvec2v, dvec2v);\r
223     dvec3v  += mix(dvec3v, dvec3v, dvec3v);\r
224     dvec4v  += mix(dvec4v, dvec4v, dvec4v);\r
225     doublev += mix(doublev, doublev, boolv);\r
226     dvec2v  += mix(dvec2v, dvec2v, bvec2v);\r
227     dvec3v  += mix(dvec3v, dvec3v, bvec3v);\r
228     dvec4v  += mix(dvec4v, dvec4v, bvec4v);\r
229 \r
230     doublev += step(doublev, doublev);\r
231     dvec2v  += step(dvec2v, dvec2v);\r
232     dvec3v  += step(dvec3v, dvec3v);\r
233     dvec4v  += step(dvec4v, dvec4v);\r
234     dvec2v  += step(doublev, dvec2v);\r
235     dvec3v  += step(doublev, dvec3v);\r
236     dvec4v  += step(doublev, dvec4v);\r
237 \r
238     doublev += smoothstep(doublev, doublev, doublev);\r
239     dvec2v  += smoothstep(dvec2v, dvec2v, dvec2v);\r
240     dvec3v  += smoothstep(dvec3v, dvec3v, dvec3v);\r
241     dvec4v  += smoothstep(dvec4v, dvec4v, dvec4v);\r
242     dvec2v  += smoothstep(doublev, doublev, dvec2v);\r
243     dvec3v  += smoothstep(doublev, doublev, dvec3v);\r
244     dvec4v  += smoothstep(doublev, doublev, dvec4v);\r
245 \r
246     boolv  = isnan(doublev);\r
247     bvec2v = isnan(dvec2v);\r
248     bvec3v = isnan(dvec3v);\r
249     bvec4v = isnan(dvec4v);\r
250 \r
251     boolv  = boolv ? isinf(doublev) : false;\r
252     bvec2v = boolv ? isinf(dvec2v)  : bvec2(false);\r
253     bvec3v = boolv ? isinf(dvec3v)  : bvec3(false);\r
254     bvec4v = boolv ? isinf(dvec4v)  : bvec4(false);\r
255 \r
256     doublev += length(doublev);\r
257     doublev += length(dvec2v);\r
258     doublev += length(dvec3v);\r
259     doublev += length(dvec4v);\r
260 \r
261     doublev += distance(doublev, doublev);\r
262     doublev += distance(dvec2v, dvec2v);\r
263     doublev += distance(dvec3v, dvec3v);\r
264     doublev += distance(dvec4v, dvec4v);\r
265 \r
266     doublev += dot(doublev, doublev);\r
267     doublev += dot(dvec2v, dvec2v);\r
268     doublev += dot(dvec3v, dvec3v);\r
269     doublev += dot(dvec4v, dvec4v);\r
270 \r
271     dvec3v += cross(dvec3v, dvec3v);\r
272 \r
273     doublev += normalize(doublev);\r
274     dvec2v  += normalize(dvec2v);\r
275     dvec3v  += normalize(dvec3v);\r
276     dvec4v  += normalize(dvec4v);\r
277 \r
278     doublev += faceforward(doublev, doublev, doublev);\r
279     dvec2v  += faceforward(dvec2v, dvec2v, dvec2v);\r
280     dvec3v  += faceforward(dvec3v, dvec3v, dvec3v);\r
281     dvec4v  += faceforward(dvec4v, dvec4v, dvec4v);\r
282 \r
283     doublev += reflect(doublev, doublev);\r
284     dvec2v  += reflect(dvec2v, dvec2v);\r
285     dvec3v  += reflect(dvec3v, dvec3v);\r
286     dvec4v  += reflect(dvec4v, dvec4v);\r
287 \r
288     doublev += refract(doublev, doublev, doublev);\r
289     dvec2v  += refract(dvec2v, dvec2v, doublev);\r
290     dvec3v  += refract(dvec3v, dvec3v, doublev);\r
291     dvec4v  += refract(dvec4v, dvec4v, doublev);\r
292 \r
293     dmat2   dmat2v   = outerProduct(dvec2v, dvec2v);\r
294     dmat3   dmat3v   = outerProduct(dvec3v, dvec3v);\r
295     dmat4   dmat4v   = outerProduct(dvec4v, dvec4v);\r
296     dmat2x3 dmat2x3v = outerProduct(dvec3v, dvec2v);\r
297     dmat3x2 dmat3x2v = outerProduct(dvec2v, dvec3v);\r
298     dmat2x4 dmat2x4v = outerProduct(dvec4v, dvec2v);\r
299     dmat4x2 dmat4x2v = outerProduct(dvec2v, dvec4v);\r
300     dmat3x4 dmat3x4v = outerProduct(dvec4v, dvec3v);\r
301     dmat4x3 dmat4x3v = outerProduct(dvec3v, dvec4v);\r
302 \r
303     dmat2v *= matrixCompMult(dmat2v, dmat2v);\r
304     dmat3v *= matrixCompMult(dmat3v, dmat3v);\r
305     dmat4v *= matrixCompMult(dmat4v, dmat4v);\r
306     dmat2x3v = matrixCompMult(dmat2x3v, dmat2x3v);\r
307     dmat2x4v = matrixCompMult(dmat2x4v, dmat2x4v);\r
308     dmat3x2v = matrixCompMult(dmat3x2v, dmat3x2v);\r
309     dmat3x4v = matrixCompMult(dmat3x4v, dmat3x4v);\r
310     dmat4x2v = matrixCompMult(dmat4x2v, dmat4x2v);\r
311     dmat4x3v = matrixCompMult(dmat4x3v, dmat4x3v);\r
312 \r
313     dmat2v   *= transpose(dmat2v);\r
314     dmat3v   *= transpose(dmat3v);\r
315     dmat4v   *= transpose(dmat4v);\r
316     dmat2x3v  = transpose(dmat3x2v);\r
317     dmat3x2v  = transpose(dmat2x3v);\r
318     dmat2x4v  = transpose(dmat4x2v);\r
319     dmat4x2v  = transpose(dmat2x4v);\r
320     dmat3x4v  = transpose(dmat4x3v);\r
321     dmat4x3v  = transpose(dmat3x4v);\r
322 \r
323     doublev += determinant(dmat2v);\r
324     doublev += determinant(dmat3v);\r
325     doublev += determinant(dmat4v);\r
326 \r
327     dmat2v *= inverse(dmat2v);\r
328     dmat3v *= inverse(dmat3v);\r
329     dmat4v *= inverse(dmat4v);\r
330 }\r