 bc17b0a96a
			
		
	
	
		bc17b0a96a
		
	
	
	
	
		
			
			Basic (component) type conversion was done, but checking that the composite was correct was not being done. Fixes issue #353.
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| #version 400
 | |
| 
 | |
| uniform float u;
 | |
| 
 | |
| int foo(int a, const int b, in int c, const in int d, out int e, inout int f)
 | |
| {
 | |
|     int sum = a + b + c + d + f; // no e, it is out only
 | |
| 	// sum should be 47 now
 | |
| 
 | |
| 	a *= 64;
 | |
| 	// no b, it is read only
 | |
| 	c *= 64;
 | |
| 	// no d, it is read only
 | |
| 	e = 64 * 16; // e starts undefined
 | |
| 	f *= 64;
 | |
| 
 | |
| 	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
 | |
| 	// sum should be 4032 + 47  = 4079
 | |
| 	
 | |
| 	return sum;
 | |
| }
 | |
| 
 | |
| int foo2(float a, vec3 b, out int r)
 | |
| {
 | |
|     r = int(3.0 * a);
 | |
|     return int(5.0 * b.y);
 | |
| }
 | |
| 
 | |
| int foo3()
 | |
| {
 | |
|     if (u > 3.2) {
 | |
|         discard;
 | |
|         return 1000000;
 | |
|     }
 | |
| 
 | |
|     return 2000000;
 | |
| }
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     int e;
 | |
| 	int t = 2;
 | |
| 	struct s {
 | |
| 	    ivec4 t;
 | |
| 	} f;
 | |
| 	f.t.y = 32;
 | |
| 
 | |
|     // test the different qualifers
 | |
|     int color = foo(1, 2, t+t, 8, e, f.t.y);
 | |
| 
 | |
| 	color += 128 * (e + f.t.y); // right side should be 128(64(16 + 32)) = 393216
 | |
| 	// sum should be 4079 + 393216 = 397295
 | |
|     
 | |
|     // test conversions
 | |
|     float arg;
 | |
|     float ret;
 | |
|     ret = foo2(4, ivec3(1,2,3), arg);  // ret = 10, param = 12.0
 | |
|     color += int(ret + arg); // adds 22, for total of 397317
 | |
| 
 | |
|     color += foo3();         // theoretically, add 2000000, for total of 2397317
 | |
| 
 | |
|     gl_FragColor = vec4(color);
 | |
| }
 | |
| 
 | |
| vec3 m(vec2);
 | |
| void aggCall()
 | |
| {
 | |
|     float F;
 | |
|     m(ivec2(F));  // test input conversion of single argument that's an aggregate; other function tests in 120.vert
 | |
| }
 | |
| 
 | |
| vec4 badConv()
 | |
| {
 | |
|     return u;     // ERROR, can change scalar to vector
 | |
| } |