Merge pull request #2891 from dneto0/hlsl-namespace
[platform/upstream/glslang.git] / Test / 310.frag
1 #version 310 es\r
2 highp float nodef3(float); // ERROR, no default precision\r
3 precision mediump float;\r
4 precision highp usampler2D;\r
5 precision highp sampler2D;\r
6 precision highp isampler2DArray;\r
7 \r
8 layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;  // ERROR, not supported\r
9 \r
10 layout(location = 2) in vec3 v3;\r
11 layout(location = 2) in mat4 yi;  // ERROR, locations conflict with xi\r
12 \r
13 uniform sampler2D arrayedSampler[5];\r
14 uniform usampler2D usamp2d;\r
15 uniform usampler2DRect samp2dr;      // ERROR, reserved\r
16 uniform isampler2DArray isamp2DA;\r
17 \r
18 in vec2 c2D;\r
19 uniform int i;\r
20 \r
21 void main()\r
22 {\r
23     vec4 v = texture(arrayedSampler[i], c2D);  // ERROR\r
24 \r
25     ivec2 offsets[4];\r
26     const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0));\r
27     uvec4 uv4 = textureGatherOffsets(samp2dr, c2D, offsets, 2);  // ERROR, not supported\r
28     vec4 v4 = textureGather(arrayedSampler[0], c2D);\r
29     ivec4 iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 3);\r
30     iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), i);  // ERROR, last argument not const\r
31     iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 4);  // ERROR, last argument out of range\r
32     iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 1+2);\r
33     iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(0.5));\r
34     iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(i));     // ERROR, offset not constant\r
35 }\r
36 \r
37 out vec4 outp;\r
38 void foo23()\r
39 {\r
40     const ivec2[3] offsets = ivec2[3](ivec2(1,2), ivec2(3,4), ivec2(15,16));\r
41 \r
42     textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), ivec2(c2D));     // ERROR, offset not constant\r
43     textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), offsets[1]);\r
44     textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), offsets[2]);     // ERROR, offset out of range\r
45     textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), ivec2(-10, 20)); // ERROR, offset out of range\r
46 \r
47     if (gl_HelperInvocation)\r
48         ++outp;\r
49 \r
50     int sum = gl_MaxVertexImageUniforms +\r
51               gl_MaxFragmentImageUniforms +\r
52               gl_MaxComputeImageUniforms +\r
53               gl_MaxCombinedImageUniforms +\r
54               gl_MaxCombinedShaderOutputResources;\r
55 \r
56     bool b1, b2, b3, b;\r
57 \r
58     b1 = mix(b2, b3, b);\r
59     uvec3 um3 = mix(uvec3(i), uvec3(i), bvec3(b));\r
60     ivec4 im4 = mix(ivec4(i), ivec4(i), bvec4(b));\r
61     1 << mix(1u, 1u, false);  // does not require folding
62 }\r
63 layout(binding=3) uniform sampler2D s1;\r
64 layout(binding=3) uniform sampler2D s2; // ERROR: overlapping bindings?  Don't see that in the 310 spec.\r
65 highp layout(binding=2) uniform writeonly image2D      i2D;\r
66       layout(binding=4) uniform readonly  image3D      i3D;    // ERROR, no default precision\r
67       layout(binding=5) uniform           imageCube    iCube;  // ERROR, no default precision\r
68       layout(binding=6) uniform           image2DArray i2DA;   // ERROR, no default precision\r
69       layout(binding=6) uniform coherent volatile restrict image2D i2Dqualified;    // ERROR, no default precision\r
70 \r
71 layout(binding = 1) uniform bb {\r
72     int foo;\r
73     layout(binding = 2) float f;     // ERROR\r
74 } bbi;\r
75 \r
76 in centroid vec4 centroidIn;\r
77 layout(location = 200000) uniform vec4 bigl;  // ERROR, location too big\r
78 \r
79 layout(early_fragment_tests) in;\r
80 \r
81 layout(location = 40) out vec4 bigout1;  // ERROR, too big\r
82 layout(location = 40) out vec4 bigout2;  // ERROR, overlap\r
83 layout(location = -2) out vec4 neg;      // ERROR, negative\r
84 \r
85 layout(std430) buffer b430 {\r
86     int i;\r
87 } b430i;\r
88 \r
89 layout(shared) uniform bshar {\r
90     int i;\r
91 } bshari;\r
92 \r
93 in smooth vec4 smoothIn;\r
94 in flat int flatIn;\r
95 \r
96 uniform sampler2DMS s2dms;  // ERROR, no default precision qualifier\r
97 \r
98 void foots()\r
99 {\r
100     highp ivec2 v2 = textureSize(s1, 2);\r
101     highp ivec3 v3 = textureSize(isamp2DA, 3);\r
102     v2 = textureSize(s2dms);\r
103     v2 = imageSize(i2D);\r
104     v3 = imageSize(i3D);\r
105     v2 = imageSize(iCube);\r
106     v3 = imageSize(i2DA);\r
107     v2 = imageSize(i2Dqualified);\r
108 }\r
109 \r
110 out bool bout;          // ERROR\r
111 highp out image2D imageOut;   // ERROR\r
112 out mat2x3 mout;        // ERROR\r
113 \r
114 in bool inb;         // ERROR\r
115 in sampler2D ino;    // ERROR\r
116 in float ina[4];\r
117 in float inaa[4][2]; // ERROR\r
118 struct S { float f; };\r
119 in S ins;\r
120 in S[4] inasa;       // ERROR\r
121 in S insa[4];        // ERROR\r
122 struct SA { float f[4]; };\r
123 in SA inSA;          // ERROR\r
124 struct SS { float f; S s; };\r
125 in SS inSS;          // ERROR\r
126 \r
127 #ifndef GL_EXT_shader_io_blocks\r
128 #error GL_EXT_shader_io_blocks not defined\r
129 #endif\r
130 \r
131 #extension GL_EXT_shader_io_blocks : enable\r
132 \r
133 out outbname { int a; } outbinst;   // ERROR, not out block in fragment shader\r
134 \r
135 in inbname {\r
136     int a;\r
137     vec4 v;\r
138     struct { int b; } s;     // ERROR, nested struct definition\r
139 } inbinst;\r
140 \r
141 in inbname2 {\r
142     layout(location = 12) int aAnon;\r
143     layout(location = 13) centroid in vec4 vAnon;\r
144 };\r
145 \r
146 in layout(location = 13) vec4 aliased; // ERROR, aliased\r
147 \r
148 in inbname2 {                // ERROR, reuse of block name\r
149     int aAnon;\r
150     centroid in vec4 vAnon;\r
151 };\r
152 \r
153 in badmember {               // ERROR, aAnon already in global scope\r
154     int aAnon;\r
155 };\r
156 \r
157 int inbname;                 // ERROR, redefinition of block name\r
158 \r
159 vec4 vAnon;                  // ERROR, anon in global scope; redefinition\r
160 \r
161 in arrayed {\r
162     float f;\r
163 } arrayedInst[4];\r
164 \r
165 void fooIO()\r
166 {\r
167     vec4 v = inbinst.v + vAnon;\r
168     v *= arrayedInst[2].f;\r
169     v *= arrayedInst[i].f;\r
170 }\r
171 \r
172 in vec4 gl_FragCoord;\r
173 layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;  // ERROR, non-ES\r
174 \r
175 layout(early_fragment_tests) in;\r
176 out float gl_FragDepth;\r
177 layout(depth_any) out float gl_FragDepth;  // ERROR, non-ES\r
178 \r
179 void foo_IO()\r
180 {\r
181     gl_FragDepth = 0.2;  // ERROR, early_fragment_tests declared\r
182     gl_Layer;            // ERROR, not present\r
183     gl_PrimitiveID;      // ERROR, not present\r
184     bool f = gl_FrontFacing;\r
185 }\r
186 \r
187 out float gl_FragDepth;\r
188 \r
189 #extension GL_OES_geometry_shader : enable\r
190 \r
191 void foo_GS()\r
192 {\r
193     highp int l = gl_Layer;\r
194     highp int p = gl_PrimitiveID;\r
195 }\r
196 \r
197 in vec2 inf, ing;\r
198 uniform ivec2 offsets[4];\r
199 uniform sampler2D sArray[4];\r
200 uniform int sIndex;\r
201 layout(binding = 0) uniform atomic_uint auArray[2];\r
202 uniform ubName { int i; } ubInst[4];\r
203 buffer bbName { int i; } bbInst[4];\r
204 highp uniform writeonly image2D iArray[5];\r
205 const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4));\r
206 \r
207 void pfooBad()\r
208 {\r
209     precise vec2 h;                                            // ERROR reserved\r
210     h = fma(inf, ing, h);                                      // ERROR, not available\r
211     textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf));     // ERROR, offset not constant\r
212     textureGatherOffsets(sArray[0], vec2(0.1), constOffsets);  // ERROR, not available\r
213 }\r
214 \r
215 #extension GL_OES_gpu_shader5 : enable\r
216 \r
217 void pfoo()\r
218 {\r
219     precise vec2 h;\r
220     h = fma(inf, ing, h);\r
221     textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf));\r
222     textureGatherOffsets(sArray[0], vec2(0.1), constOffsets);\r
223     textureGatherOffsets(sArray[0], vec2(0.1), offsets);       // ERROR, offset not constant\r
224 }\r
225 \r
226 #extension GL_EXT_texture_cube_map_array : enable\r
227 \r
228 precision highp imageCubeArray        ;\r
229 precision highp iimageCubeArray       ;\r
230 precision highp uimageCubeArray       ;\r
231 \r
232 precision highp samplerCubeArray      ;\r
233 precision highp samplerCubeArrayShadow;\r
234 precision highp isamplerCubeArray     ;\r
235 precision highp usamplerCubeArray     ;\r
236 \r
237 uniform writeonly imageCubeArray  CA1;\r
238 uniform writeonly iimageCubeArray CA2;\r
239 uniform writeonly uimageCubeArray CA3;\r
240 \r
241 #ifdef GL_EXT_texture_cube_map_array\r
242 uniform samplerCubeArray          CA4;\r
243 uniform samplerCubeArrayShadow    CA5;\r
244 uniform isamplerCubeArray         CA6;\r
245 uniform usamplerCubeArray         CA7;\r
246 #endif\r
247 \r
248 void CAT()\r
249 {\r
250     highp vec4 b4 = texture(CA4, vec4(0.5), 0.24);\r
251     highp ivec4 b6 = texture(CA6, vec4(0.5), 0.26);\r
252     highp uvec4 b7 = texture(CA7, vec4(0.5), 0.27);\r
253 }\r
254 \r
255 void badSample()\r
256 {\r
257     lowp     int  a1 = gl_SampleID;         // ERROR, need extension\r
258     mediump  vec2 a2 = gl_SamplePosition;   // ERROR, need extension\r
259     highp    int  a3 = gl_SampleMaskIn[0];  // ERROR, need extension\r
260     gl_SampleMask[0] = a3;                  // ERROR, need extension\r
261     mediump int n = gl_NumSamples;          // ERROR, need extension\r
262 }\r
263 \r
264 #ifdef GL_OES_sample_variables\r
265 #extension GL_OES_sample_variables : enable\r
266 #endif\r
267 \r
268 void goodSample()\r
269 {\r
270     lowp     int  a1 = gl_SampleID;       \r
271     mediump  vec2 a2 = gl_SamplePosition; \r
272     highp    int  a3 = gl_SampleMaskIn[0];\r
273     gl_SampleMask[0] = a3;\r
274     mediump int n1 = gl_MaxSamples;\r
275     mediump int n2 = gl_NumSamples;\r
276 }\r
277 \r
278 uniform layout(r32f)  highp  image2D im2Df;\r
279 uniform layout(r32ui) highp uimage2D im2Du;\r
280 uniform layout(r32i)  highp iimage2D im2Di;\r
281 uniform ivec2 P;\r
282 \r
283 void badImageAtom()\r
284 {\r
285     float datf;\r
286     int dati;\r
287     uint datu;\r
288 \r
289     imageAtomicAdd(     im2Di, P, dati);        // ERROR, need extension
290     imageAtomicAdd(     im2Du, P, datu);        // ERROR, need extension
291     imageAtomicMin(     im2Di, P, dati);        // ERROR, need extension
292     imageAtomicMin(     im2Du, P, datu);        // ERROR, need extension
293     imageAtomicMax(     im2Di, P, dati);        // ERROR, need extension
294     imageAtomicMax(     im2Du, P, datu);        // ERROR, need extension
295     imageAtomicAnd(     im2Di, P, dati);        // ERROR, need extension
296     imageAtomicAnd(     im2Du, P, datu);        // ERROR, need extension
297     imageAtomicOr(      im2Di, P, dati);        // ERROR, need extension
298     imageAtomicOr(      im2Du, P, datu);        // ERROR, need extension
299     imageAtomicXor(     im2Di, P, dati);        // ERROR, need extension
300     imageAtomicXor(     im2Du, P, datu);        // ERROR, need extension
301     imageAtomicExchange(im2Di, P, dati);        // ERROR, need extension
302     imageAtomicExchange(im2Du, P, datu);        // ERROR, need extension
303     imageAtomicExchange(im2Df, P, datf);        // ERROR, need extension
304     imageAtomicCompSwap(im2Di, P,  3, dati);    // ERROR, need extension\r
305     imageAtomicCompSwap(im2Du, P, 5u, datu);    // ERROR, need extension\r
306 }\r
307 \r
308 #ifdef GL_OES_shader_image_atomic \r
309 #extension GL_OES_shader_image_atomic : enable\r
310 #endif\r
311 \r
312 uniform layout(rgba32f)  highp  image2D badIm2Df;  // ERROR, needs readonly or writeonly\r
313 uniform layout(rgba8ui) highp uimage2D badIm2Du;   // ERROR, needs readonly or writeonly\r
314 uniform layout(rgba16i)  highp iimage2D badIm2Di;  // ERROR, needs readonly or writeonly\r
315 \r
316 void goodImageAtom()\r
317 {\r
318     float datf;\r
319     int dati;\r
320     uint datu;\r
321 \r
322     imageAtomicAdd(     im2Di, P, dati);
323     imageAtomicAdd(     im2Du, P, datu);
324     imageAtomicMin(     im2Di, P, dati);
325     imageAtomicMin(     im2Du, P, datu);
326     imageAtomicMax(     im2Di, P, dati);
327     imageAtomicMax(     im2Du, P, datu);
328     imageAtomicAnd(     im2Di, P, dati);
329     imageAtomicAnd(     im2Du, P, datu);
330     imageAtomicOr(      im2Di, P, dati);
331     imageAtomicOr(      im2Du, P, datu);
332     imageAtomicXor(     im2Di, P, dati);
333     imageAtomicXor(     im2Du, P, datu);
334     imageAtomicExchange(im2Di, P, dati);
335     imageAtomicExchange(im2Du, P, datu);
336     imageAtomicExchange(im2Df, P, datf);
337     imageAtomicCompSwap(im2Di, P,  3, dati);\r
338     imageAtomicCompSwap(im2Du, P, 5u, datu);\r
339 \r
340     imageAtomicMax(badIm2Di, P, dati);      // ERROR, not an allowed layout() on the image
341     imageAtomicMax(badIm2Du, P, datu);      // ERROR, not an allowed layout() on the image
342     imageAtomicExchange(badIm2Df, P, datf); // ERROR, not an allowed layout() on the image
343 }\r
344 \r
345 sample in vec4 colorSampInBad;       // ERROR, reserved\r
346 centroid out vec4 colorCentroidBad;  // ERROR\r
347 flat out vec4 colorBadFlat;          // ERROR\r
348 smooth out vec4 colorBadSmooth;      // ERROR\r
349 noperspective out vec4 colorBadNo;   // ERROR\r
350 flat centroid in vec2 colorfc;\r
351 in float scalarIn;\r
352 \r
353 void badInterp()\r
354 {\r
355     interpolateAtCentroid(colorfc);             // ERROR, need extension\r
356     interpolateAtSample(colorfc, 1);            // ERROR, need extension\r
357     interpolateAtOffset(colorfc, vec2(0.2));    // ERROR, need extension\r
358 }\r
359 \r
360 #if defined GL_OES_shader_multisample_interpolation\r
361 #extension GL_OES_shader_multisample_interpolation : enable\r
362 #endif\r
363 \r
364 sample in vec4 colorSampIn;\r
365 sample out vec4 colorSampleBad;     // ERROR\r
366 flat sample in vec4 colorfsi;\r
367 sample in vec3 sampInArray[4];\r
368 \r
369 void interp()\r
370 {\r
371     float res;\r
372     vec2 res2;\r
373     vec3 res3;\r
374     vec4 res4;\r
375 \r
376     res2 = interpolateAtCentroid(colorfc);\r
377     res4 = interpolateAtCentroid(colorSampIn);\r
378     res4 = interpolateAtCentroid(colorfsi);\r
379     res  = interpolateAtCentroid(scalarIn);\r
380     res3 = interpolateAtCentroid(sampInArray);         // ERROR\r
381     res3 = interpolateAtCentroid(sampInArray[2]);\r
382     res2 = interpolateAtCentroid(sampInArray[2].xy);   // ERROR\r
383 \r
384     res3 = interpolateAtSample(sampInArray, 1);        // ERROR\r
385     res3 = interpolateAtSample(sampInArray[i], 0);\r
386     res2 = interpolateAtSample(sampInArray[2].xy, 2);  // ERROR\r
387     res  = interpolateAtSample(scalarIn, 1);\r
388 \r
389     res3 = interpolateAtOffset(sampInArray, vec2(0.2));         // ERROR\r
390     res3 = interpolateAtOffset(sampInArray[2], vec2(0.2));\r
391     res2 = interpolateAtOffset(sampInArray[2].xy, vec2(0.2));   // ERROR, no swizzle\r
392     res  = interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference\r
393     res  = interpolateAtOffset(scalarIn, vec2(0.2));\r
394 \r
395     float f;\r
396     res  = interpolateAtCentroid(f);           // ERROR, not interpolant\r
397     res4 = interpolateAtSample(outp, 0);       // ERROR, not interpolant\r
398 }\r
399 \r
400 layout(blend_support_softlight) out;           // ERROR, need extension\r
401 \r
402 #ifdef GL_KHR_blend_equation_advanced\r
403 #extension GL_KHR_blend_equation_advanced : enable\r
404 #endif\r
405 \r
406 layout(blend_support_multiply) out;
407 layout(blend_support_screen) out;
408 layout(blend_support_overlay) out;
409 layout(blend_support_darken, blend_support_lighten) out;
410 layout(blend_support_colordodge) layout(blend_support_colorburn) out;
411 layout(blend_support_hardlight) out;
412 layout(blend_support_softlight) out;
413 layout(blend_support_difference) out;
414 layout(blend_support_exclusion) out;
415 layout(blend_support_hsl_hue) out;
416 layout(blend_support_hsl_saturation) out;
417 layout(blend_support_hsl_color) out;
418 layout(blend_support_hsl_luminosity) out;
419 layout(blend_support_all_equations) out;
420
421 layout(blend_support_hsl_luminosity) out;              // okay to repeat
422
423 layout(blend_support_hsl_luminosity) in;                       // ERROR, only on "out"
424 layout(blend_support_hsl_luminosity) out vec4;                 // ERROR, only on standalone
425 layout(blend_support_hsl_luminosity) out vec4 badout;          // ERROR, only on standalone
426 layout(blend_support_hsl_luminosity) struct badS {int i;};     // ERROR, only on standalone
427 layout(blend_support_hsl_luminosity) void blendFoo() { }       // ERROR, only on standalone
428 void blendFoo(layout(blend_support_hsl_luminosity) vec3 v) { } // ERROR, only on standalone
429 layout(blend_support_flizbit) out;                             // ERROR, no flizbit
430
431 out vec4 outAA[2][2];  // ERROR
432
433 void devi()
434 {
435     gl_DeviceIndex; // ERROR, no extension
436     gl_ViewIndex;   // ERROR, no extension
437 }
438
439 #ifdef GL_EXT_device_group
440 #extension GL_EXT_device_group : enable
441 #endif
442
443 #ifdef GL_EXT_multiview
444 #extension GL_EXT_multiview : enable
445 #endif
446
447 void devie()
448 {
449     gl_DeviceIndex;
450     gl_ViewIndex;
451 }\r
452 \r
453 #extension GL_EXT_shader_implicit_conversions : enable\r
454 \r
455 // Test function overloading\r
456 void func(uint a, uvec4 b)\r
457 {\r
458 \r
459 }\r
460 \r
461 int func(uint a, uvec4 b) // Error function overloading because of same signature and different return type\r
462 {\r
463     return 0;\r
464 }\r
465 \r
466 int b;\r
467 \r
468 void testimplicit() {\r
469 \r
470     uint a = b; // int->uint\r
471     mediump vec4 col = vec4(1, 2, 3, 4); // ivec4 -> vec4\r
472     int  b = a + 2; // ERROR: cannot convert from ' temp uint' to ' temp int'\r
473 \r
474     // Test binary ops\r
475     uint c = b * 3; \r
476     uint d = b * 3u;\r
477     uint e = b%3;\r
478     uint f = (b > 3)? b : c;     \r
479     func(b, ivec4(1,2,3,4)); \r
480 }\r
481 \r
482 #extension GL_EXT_shader_implicit_conversions : disable\r
483 \r
484 void testimplicitFail() {\r
485     uint a = b; // Error GL_EXT_shader_implicit_conversions is disabled\r
486 }\r
487 \r