1617a3babSopenharmony_ci#version 400
2617a3babSopenharmony_ci
3617a3babSopenharmony_ciuniform float u;
4617a3babSopenharmony_ci
5617a3babSopenharmony_ciint foo(int a, const int b, in int c, const in int d, out int e, inout int f)
6617a3babSopenharmony_ci{
7617a3babSopenharmony_ci    int sum = a + b + c + d + f; // no e, it is out only
8617a3babSopenharmony_ci	// sum should be 47 now
9617a3babSopenharmony_ci
10617a3babSopenharmony_ci	a *= 64;
11617a3babSopenharmony_ci	// no b, it is read only
12617a3babSopenharmony_ci	c *= 64;
13617a3babSopenharmony_ci	// no d, it is read only
14617a3babSopenharmony_ci	e = 64 * 16; // e starts undefined
15617a3babSopenharmony_ci	f *= 64;
16617a3babSopenharmony_ci
17617a3babSopenharmony_ci	sum += a + 64 * b + c + 64 * d + e + f; // everything has a value now, totaling of 64(1+2+4+8+16+32) = 64*63 = 4032
18617a3babSopenharmony_ci	// sum should be 4032 + 47  = 4079
19617a3babSopenharmony_ci	
20617a3babSopenharmony_ci	return sum;
21617a3babSopenharmony_ci}
22617a3babSopenharmony_ci
23617a3babSopenharmony_ciint foo2(float a, vec3 b, out int r)
24617a3babSopenharmony_ci{
25617a3babSopenharmony_ci    r = int(3.0 * a);
26617a3babSopenharmony_ci    return int(5.0 * b.y);
27617a3babSopenharmony_ci}
28617a3babSopenharmony_ci
29617a3babSopenharmony_ciint foo3()
30617a3babSopenharmony_ci{
31617a3babSopenharmony_ci    if (u > 3.2) {
32617a3babSopenharmony_ci        discard;
33617a3babSopenharmony_ci        return 1000000;
34617a3babSopenharmony_ci    }
35617a3babSopenharmony_ci
36617a3babSopenharmony_ci    return 2000000;
37617a3babSopenharmony_ci}
38617a3babSopenharmony_ci
39617a3babSopenharmony_civoid main()
40617a3babSopenharmony_ci{
41617a3babSopenharmony_ci    int e;
42617a3babSopenharmony_ci	int t = 2;
43617a3babSopenharmony_ci	struct s {
44617a3babSopenharmony_ci	    ivec4 t;
45617a3babSopenharmony_ci	} f;
46617a3babSopenharmony_ci	f.t.y = 32;
47617a3babSopenharmony_ci
48617a3babSopenharmony_ci    // test the different qualifers
49617a3babSopenharmony_ci    int color = foo(1, 2, t+t, 8, e, f.t.y);
50617a3babSopenharmony_ci
51617a3babSopenharmony_ci	color += 128 * (e + f.t.y); // right side should be 128(64(16 + 32)) = 393216
52617a3babSopenharmony_ci	// sum should be 4079 + 393216 = 397295
53617a3babSopenharmony_ci    
54617a3babSopenharmony_ci    // test conversions
55617a3babSopenharmony_ci    float arg;
56617a3babSopenharmony_ci    float ret;
57617a3babSopenharmony_ci    ret = foo2(4, ivec3(1,2,3), arg);  // ret = 10, param = 12.0
58617a3babSopenharmony_ci    color += int(ret + arg); // adds 22, for total of 397317
59617a3babSopenharmony_ci
60617a3babSopenharmony_ci    color += foo3();         // theoretically, add 2000000, for total of 2397317
61617a3babSopenharmony_ci
62617a3babSopenharmony_ci    gl_FragColor = vec4(color);
63617a3babSopenharmony_ci}
64617a3babSopenharmony_ci
65617a3babSopenharmony_civec3 m(vec2);
66617a3babSopenharmony_civoid aggCall()
67617a3babSopenharmony_ci{
68617a3babSopenharmony_ci    float F;
69617a3babSopenharmony_ci    m(ivec2(F));  // test input conversion of single argument that's an aggregate; other function tests in 120.vert
70617a3babSopenharmony_ci}
71617a3babSopenharmony_ci
72617a3babSopenharmony_civec4 badConv()
73617a3babSopenharmony_ci{
74617a3babSopenharmony_ci    return u;     // ERROR, can change scalar to vector
75617a3babSopenharmony_ci}