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}