mirror of
				https://gitlab.winehq.org/wine/vkd3d.git
				synced 2025-09-12 18:50:22 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| % Check that -0.0f is not less than 0.0f
 | |
| [pixel shader todo(sm<4)]
 | |
| float a;
 | |
| 
 | |
| float4 main() : sv_target
 | |
| {
 | |
|     return -0.0f < a;
 | |
| }
 | |
| 
 | |
| [test]
 | |
| uniform 0 float 0.0
 | |
| todo(sm<4) draw quad
 | |
| probe all rgba (0.0, 0.0, 0.0, 0.0)
 | |
| 
 | |
| 
 | |
| [pixel shader todo(sm<4)]
 | |
| uniform float4 f;
 | |
| 
 | |
| float4 main() : sv_target
 | |
| {
 | |
|     float4 result;
 | |
|     float n = f.x/f.w;
 | |
| 
 | |
|     /* '!(condition)' in SM6 forces use of the unordered instruction variant. */
 | |
| 
 | |
|     result.x  = (f.y > f.x)   ?        1.0 : 0.0;
 | |
|     result.x += (f.y < f.x)   ?       10.0 : 0.0;
 | |
|     result.x += (f.y >= f.x)  ?      100.0 : 0.0;
 | |
|     result.x += (f.y <= f.x)  ?     1000.0 : 0.0;
 | |
|     result.x += !(f.y <= f.x) ?    10000.0 : 0.0;
 | |
|     result.x += !(f.y >= f.x) ?   100000.0 : 0.0;
 | |
|     result.x += !(f.y < f.x)  ?  1000000.0 : 0.0;
 | |
|     result.x += !(f.y > f.x)  ? 10000000.0 : 0.0;
 | |
|     result.y  = (n > f.x)   ?        1.0 : 0.0;
 | |
|     result.y += (n < f.x)   ?       10.0 : 0.0;
 | |
|     result.y += (n >= f.x)  ?      100.0 : 0.0;
 | |
|     result.y += (n <= f.x)  ?     1000.0 : 0.0;
 | |
|     result.y += !(n <= f.x) ?    10000.0 : 0.0;
 | |
|     result.y += !(n >= f.x) ?   100000.0 : 0.0;
 | |
|     result.y += !(n < f.x)  ?  1000000.0 : 0.0;
 | |
|     result.y += !(n > f.x)  ? 10000000.0 : 0.0;
 | |
|     result.z  = (f.z == f.y)  ?        1.0 : 0.0;
 | |
|     result.z += (f.z != f.y)  ?       10.0 : 0.0;
 | |
|     result.z += !(f.z == f.y) ?      100.0 : 0.0;
 | |
|     result.z += !(f.z != f.y) ?     1000.0 : 0.0;
 | |
|     result.z += (n == f.y)    ?    10000.0 : 0.0;
 | |
|     result.z += (n != f.y)    ?   100000.0 : 0.0;
 | |
|     result.z += !(n == f.y)   ?  1000000.0 : 0.0;
 | |
|     result.z += !(n != f.y)   ? 10000000.0 : 0.0;
 | |
|     // These compile to FCMP_ORD, but prepending a ! does not result in FCMP_UNO
 | |
|     result.w  = (f.y < f.x || f.y >= f.x) ?  1.0 : 0.0;
 | |
|     result.w += (n < f.x || n >= f.x)     ? 10.0 : 0.0;
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| [test]
 | |
| uniform 0 float4 0.0 1.5 1.5 0.0
 | |
| todo(sm<4) draw quad
 | |
| % SM1-3 apparently treats '0/0' as zero.
 | |
| if(sm<4) todo probe all rgba (1010101.0, 11001100.0, 1101001.0, 11.0)
 | |
| % SM4-5 optimises away the 'not' by inverting the condition, even though this is invalid for NaN.
 | |
| if(sm>=4 & sm<6) todo probe all rgba (1010101.0, 0.0, 1101001.0, 1.0)
 | |
| % SM6 emits the correct ordered/unordered instructions, so comparisons are false for NaN, and are made true with 'not'.
 | |
| if(sm>=6) probe all rgba (1010101.0, 11110000.0, 1101001.0, 1.0)
 | |
| 
 | |
| 
 | |
| [require]
 | |
| shader model >= 6.0
 | |
| 
 | |
| [pixel shader]
 | |
| uniform float4 f;
 | |
| 
 | |
| float4 main() : sv_target
 | |
| {
 | |
|     float4 result = float4(isinf(f.x / f.y), isnan(sqrt(f.w)), isinf(sqrt(f.w)), isnan(f.x / f.y));
 | |
|     return result + float4(isinf(f.x / f.z), isnan(sqrt(f.y)), isinf(f.y / f.z), isnan(sqrt(f.z))) * 10.0;
 | |
| }
 | |
| 
 | |
| [test]
 | |
| uniform 0 float4 1.5 0.0 1.0 -1.0
 | |
| draw quad
 | |
| probe all rgba (1.0, 1.0, 0.0, 0.0)
 | |
| 
 | |
| 
 | |
| [pixel shader]
 | |
| uniform float4 f;
 | |
| 
 | |
| float4 main() : sv_target
 | |
| {
 | |
|     return float4(isfinite(f.x / f.y), isfinite(sqrt(f.w)), isfinite(f.x / f.z), 0.0);
 | |
| }
 | |
| 
 | |
| [test]
 | |
| uniform 0 float4 1.5 0.0 1.0 -1.0
 | |
| draw quad
 | |
| probe all rgba (0.0, 0.0, 1.0, 0.0)
 |