1uniform shader s1, s2; 2uniform colorFilter cf1, cf2; 3uniform blender b; 4uniform float2 position; 5uniform half4 color1, color2; 6 7noinline half4 eval_shader(shader s, float2 pt) { 8 return s.eval(pt); 9} 10 11noinline half4 eval_shader_at_0_0(shader s) { 12 return eval_shader(s, float2(0)); 13} 14 15noinline half4 eval_colorfilter(colorFilter cf, half4 color) { 16 return cf.eval(color); 17} 18 19noinline half4 eval_blender(blender b, half4 src, half4 dst) { 20 return b.eval(src, dst); 21} 22 23noinline half4 multiply_two_shaders(shader s1, shader s2, float2 pt) { 24 return s1.eval(pt) * eval_shader(s2, pt); 25} 26 27inline half4 eval_inlined(shader s, colorFilter cf, blender b) { 28 return s.eval(position) + cf.eval(color1) - b.eval(color2, color1); 29} 30 31half4 main(float2 xy) { 32 half4 result; 33 34 // Simple non-nested specialization 35 result += eval_shader(s1, position); 36 result += eval_shader(s2, position); 37 result += eval_colorfilter(cf1, color1); 38 result += eval_blender(b, color1, color2); 39 40 // Multiple specialized calls in one expression 41 result += eval_colorfilter(cf1, color2) * eval_colorfilter(cf2, color1); 42 43 // Nested specialized calls 44 result = eval_shader_at_0_0(s1); 45 result += multiply_two_shaders(s1, s2, position); 46 47 // Compex expression containing multiple, nested specializations 48 result += eval_blender(b, eval_shader_at_0_0(s2), eval_colorfilter(cf2, color2)); 49 50 // Inlined expression with specialization 51 result += eval_inlined(s1, cf1, b); 52 53 return result; 54} 55