38 lines
		
	
	
		
			878 B
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			878 B
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| #version 450
 | |
| 
 | |
| struct S1 {
 | |
|     float a;
 | |
|     int b;
 | |
| };
 | |
| 
 | |
| layout(location = 0) flat in S1 in1;
 | |
| layout(location = 2) flat in S1 in2;
 | |
| layout(location = 4) flat in int cond;
 | |
| 
 | |
| layout(location = 0) out float outv;
 | |
| 
 | |
| void fun1(){}
 | |
| void fun2(){}
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     // glslang will only make OpSelect for very trivial looking expressions
 | |
| 
 | |
|     float f1 = 1.0;
 | |
|     float f2 = 2.0;
 | |
|     outv = cond < 8 ? f1 : f2;           // in all versions
 | |
| 
 | |
|     ivec4 iv1 = ivec4(f1);
 | |
|     ivec4 iv2 = ivec4(f2);
 | |
|     outv *= (cond > 0 ? iv1 : iv2).z;     // in all versions, but in 1.4 as scalar condition, not smeared ala mix()
 | |
| 
 | |
|     mat3 m1 = mat3(1.0);
 | |
|     mat3 m2 = mat3(2.0);
 | |
|     outv *= (cond < 20 ? m1 : m2)[2][1];  // in 1.4, but not before
 | |
| 
 | |
|     S1 fv = cond > 5 ? in1 : in2;         // in 1.4, but not before
 | |
|     outv *= fv.a;
 | |
| 
 | |
|     cond > 0 ? fun1() : fun2();           // not allowed by any version
 | |
| }
 | 
