xref: /aosp_15_r20/external/skia/resources/sksl/runtime/ChildEffectSpecialization.privrts (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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