uniform shader s1, s2; uniform colorFilter cf1, cf2; uniform blender b; uniform float2 position; uniform half4 color1, color2; noinline half4 eval_shader(shader s, float2 pt) { return s.eval(pt); } noinline half4 eval_shader_at_0_0(shader s) { return eval_shader(s, float2(0)); } noinline half4 eval_colorfilter(colorFilter cf, half4 color) { return cf.eval(color); } noinline half4 eval_blender(blender b, half4 src, half4 dst) { return b.eval(src, dst); } noinline half4 multiply_two_shaders(shader s1, shader s2, float2 pt) { return s1.eval(pt) * eval_shader(s2, pt); } inline half4 eval_inlined(shader s, colorFilter cf, blender b) { return s.eval(position) + cf.eval(color1) - b.eval(color2, color1); } half4 main(float2 xy) { half4 result; // Simple non-nested specialization result += eval_shader(s1, position); result += eval_shader(s2, position); result += eval_colorfilter(cf1, color1); result += eval_blender(b, color1, color2); // Multiple specialized calls in one expression result += eval_colorfilter(cf1, color2) * eval_colorfilter(cf2, color1); // Nested specialized calls result = eval_shader_at_0_0(s1); result += multiply_two_shaders(s1, s2, position); // Compex expression containing multiple, nested specializations result += eval_blender(b, eval_shader_at_0_0(s2), eval_colorfilter(cf2, color2)); // Inlined expression with specialization result += eval_inlined(s1, cf1, b); return result; }