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