1/*#pragma settings NoES2Restrictions*/ 2uniform half4 colorGreen, colorRed; 3 4struct S {float f1; vec2 v2; }; 5 6bool test_same_types(bool eq, float f1, float v2, float f3, float f4, float f5, float f6) { 7 float one = colorGreen.r + 1; 8 S a[2]; a[0].f1 = f1; a[0].v2 = vec2(v2, f3); 9 a[1].f1 = f4; a[1].v2 = vec2(f5, f6); 10 S b[2]; b[0].f1 = f1 * one; b[0].v2 = vec2(v2 * one, f3 * one); 11 b[1].f1 = f4 * one; b[1].v2 = vec2(f5 * one, f6 * one); 12 return eq ? a == b : a != b; 13} 14 15bool test_diff_types(bool eq, float f1, float v2, float f3, float f4, float f5, float f6) { 16 float two = colorGreen.r + 2; 17 S a[2]; a[0].f1 = f1; a[0].v2 = vec2(v2, f3); 18 a[1].f1 = f4; a[1].v2 = vec2(f5, f6); 19 S b[2]; b[0].f1 = f1 * two; b[0].v2 = vec2(v2 * two, f3 * two); 20 b[1].f1 = f4 * two; b[1].v2 = vec2(f5 * two, f6); 21 return eq ? a == b : a != b; 22} 23 24vec4 main(vec2 coords) { 25 26 float NAN1 = colorGreen.r/colorGreen.b; 27 float NAN2 = colorGreen.b/colorGreen.r; 28 float ZP = +colorGreen.r*colorGreen.b; 29 float ZM = -colorGreen.r*colorGreen.b; 30 float F42 = colorGreen.g * 42.0; 31 float F43 = colorGreen.g * 43.0; 32 float F44 = colorGreen.g * 44.0; 33 float F45 = colorGreen.g * 45.0; 34 float F46 = colorGreen.g * 46.0; 35 float F47 = colorGreen.g * 47.0; 36 37 bool EQ = true; // Tests for == 38 bool NE = false; // Tests for != 39 40 return true 41 && test_same_types(EQ, F42, ZM, ZP, F43, F44, F45) // equal, including -0 and +0 values 42 && !test_same_types(NE, F42, ZM, ZP, F43, F44, F45) // not (not equal) 43 && test_same_types(NE, F42, NAN1, NAN2, F43, F44, F45) // NA values always not equal 44 && !test_same_types(EQ, F42, NAN1, NAN2, F43, F44, F45) 45 && test_diff_types(NE, F42, F43, F44, F45, F46, F47) // one of the normal values not equal 46 && !test_diff_types(EQ, F42, F43, F44, F45, F46, F47) 47 && test_diff_types(NE, NAN1, ZM, ZP, F42, F43, F44) // one of the normal values not equal 48 && !test_diff_types(EQ, NAN1, ZM, ZP, F42, F43, F44) 49 ? colorGreen : colorRed; 50} 51