1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen; 2*c8dee2aaSAndroid Build Coastguard Workeruniform half unknownInput; 3*c8dee2aaSAndroid Build Coastguard Workeruniform half2x2 testMatrix2x2; 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard Workerstruct S { 6*c8dee2aaSAndroid Build Coastguard Worker half4 ah4[1]; 7*c8dee2aaSAndroid Build Coastguard Worker half ah[1]; 8*c8dee2aaSAndroid Build Coastguard Worker half4 h4; 9*c8dee2aaSAndroid Build Coastguard Worker half h; 10*c8dee2aaSAndroid Build Coastguard Worker}; 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Workerstruct S4 { 13*c8dee2aaSAndroid Build Coastguard Worker half a, b, c, d; 14*c8dee2aaSAndroid Build Coastguard Worker}; 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Workerstruct S5 { 17*c8dee2aaSAndroid Build Coastguard Worker half a, b, c, d, e; 18*c8dee2aaSAndroid Build Coastguard Worker}; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker// Each helper function needs to reference the variable multiple times, because if it's only read 21*c8dee2aaSAndroid Build Coastguard Worker// from once, it is inlined directly whether or not it is trivial. 22*c8dee2aaSAndroid Build Coastguard Workerhalf4 funcb(bool b) { 23*c8dee2aaSAndroid Build Coastguard Worker return half4(b, b, b, !b); 24*c8dee2aaSAndroid Build Coastguard Worker} 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Workerhalf4 func1(half h) { 27*c8dee2aaSAndroid Build Coastguard Worker return h.xxxx * h.xxxx; 28*c8dee2aaSAndroid Build Coastguard Worker} 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Workerhalf4 func2(half2 h2) { 31*c8dee2aaSAndroid Build Coastguard Worker return h2.xyxy * h2.yxyx; 32*c8dee2aaSAndroid Build Coastguard Worker} 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Workerhalf4 func3(half3 h3) { 35*c8dee2aaSAndroid Build Coastguard Worker return h3.xyzx * h3.xyzx; 36*c8dee2aaSAndroid Build Coastguard Worker} 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Workerhalf4 func4(half4 h4) { 39*c8dee2aaSAndroid Build Coastguard Worker return h4 * h4; 40*c8dee2aaSAndroid Build Coastguard Worker} 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Workerhalf2x2 func2x2(half2x2 m) { 43*c8dee2aaSAndroid Build Coastguard Worker return m * m[0][0]; 44*c8dee2aaSAndroid Build Coastguard Worker} 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Workerhalf4 funcS4(S4 s) { 47*c8dee2aaSAndroid Build Coastguard Worker return half4(s.a, s.b, s.c, 1) * s.d; 48*c8dee2aaSAndroid Build Coastguard Worker} 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Workerhalf4 funcS5(S5 s) { 51*c8dee2aaSAndroid Build Coastguard Worker return half4(s.a, s.b, s.c, s.d) * s.e; 52*c8dee2aaSAndroid Build Coastguard Worker} 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Workernoinline void keepAlive(inout half f) {} 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) { 57*c8dee2aaSAndroid Build Coastguard Worker S s; 58*c8dee2aaSAndroid Build Coastguard Worker s.ah4[0] = half4(unknownInput); 59*c8dee2aaSAndroid Build Coastguard Worker s.ah[0] = unknownInput; 60*c8dee2aaSAndroid Build Coastguard Worker s.h4 = half4(unknownInput); 61*c8dee2aaSAndroid Build Coastguard Worker s.h = unknownInput; 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker S as[1]; 64*c8dee2aaSAndroid Build Coastguard Worker as[0].ah4[0] = half4(unknownInput); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker bool b = bool(unknownInput); 67*c8dee2aaSAndroid Build Coastguard Worker int i = int(unknownInput); 68*c8dee2aaSAndroid Build Coastguard Worker int4 i4 = i.xxxx; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker // These expressions are considered "trivial" and will be cloned directly into the inlined 71*c8dee2aaSAndroid Build Coastguard Worker // function without a temporary variable. 72*c8dee2aaSAndroid Build Coastguard Worker half4 var; 73*c8dee2aaSAndroid Build Coastguard Worker half2x2 mat; 74*c8dee2aaSAndroid Build Coastguard Worker var = func1(+s.h); // field access (unary + is optimized away) 75*c8dee2aaSAndroid Build Coastguard Worker var = funcb(b); // variable reference 76*c8dee2aaSAndroid Build Coastguard Worker var = func2(s.ah4[0].yw); // var, field access, array index, swizzle 77*c8dee2aaSAndroid Build Coastguard Worker var = func2(as[0].ah4[0].xy); // var, array index, field access, array index, swizzle 78*c8dee2aaSAndroid Build Coastguard Worker var = func3(s.h4.zzz); // var, field access, swizzle 79*c8dee2aaSAndroid Build Coastguard Worker var = func3(colorGreen.xyz); // var, swizzle 80*c8dee2aaSAndroid Build Coastguard Worker var = func3(s.h.xxx); // var, field access, splat ctor (from scalar swizzle) 81*c8dee2aaSAndroid Build Coastguard Worker var = func4(half4(s.h)); // var, splat, field access 82*c8dee2aaSAndroid Build Coastguard Worker var = func4(s.ah4[0].xxxy); // var, field access, array index, swizzle 83*c8dee2aaSAndroid Build Coastguard Worker var = func4(colorGreen); // variable reference 84*c8dee2aaSAndroid Build Coastguard Worker var = func4(half4(1, 2, 3, 4)); // compound ctor, compile-time constant 85*c8dee2aaSAndroid Build Coastguard Worker var = func1(half(i)); // scalar-cast ctor, variable 86*c8dee2aaSAndroid Build Coastguard Worker var = func4(half4(i4)); // compound-cast ctor, variable 87*c8dee2aaSAndroid Build Coastguard Worker var = funcS4(S4(1, 2, 3, 4)); // struct with slotCount <= 4 88*c8dee2aaSAndroid Build Coastguard Worker mat = func2x2(half2x2(unknownInput)); // diagonal matrix, variable reference 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker // These expressions are considered "non-trivial" and will be placed in a temporary variable 91*c8dee2aaSAndroid Build Coastguard Worker // when inlining occurs. 92*c8dee2aaSAndroid Build Coastguard Worker var = func4(half4(testMatrix2x2)); // compound ctor, not compile-time constant 93*c8dee2aaSAndroid Build Coastguard Worker mat = func2x2(half2x2(colorGreen)); // compound ctor, not compile-time constant 94*c8dee2aaSAndroid Build Coastguard Worker mat = func2x2(half2x2(half3x3(unknownInput))); // matrix resize, diagonal matrix, var 95*c8dee2aaSAndroid Build Coastguard Worker var = func4(half4(1, 2, 3, unknownInput)); // compound ctor, not compile-time constant 96*c8dee2aaSAndroid Build Coastguard Worker var = funcS5(S5(1, 2, 3, 4, 5)); // struct with slotCount > 4 97*c8dee2aaSAndroid Build Coastguard Worker var = func1(-s.h); // unary minus, var, field access 98*c8dee2aaSAndroid Build Coastguard Worker var = funcb(!b); // prefix expression, var 99*c8dee2aaSAndroid Build Coastguard Worker// var = func2(as[i].h4.yw); // (non-constant array index disallowed in ES2) 100*c8dee2aaSAndroid Build Coastguard Worker var = func3(s.h4.yyy + s.h4.zzz); // binary expression 101*c8dee2aaSAndroid Build Coastguard Worker var = func4(s.h4.y001); // compound ctor, not compile-time constant 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker keepAlive(var[0]); 104*c8dee2aaSAndroid Build Coastguard Worker keepAlive(mat[0][0]); 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker return colorGreen; 107*c8dee2aaSAndroid Build Coastguard Worker} 108