xref: /aosp_15_r20/external/igt-gpu-tools/assembler/doc/examples/packed_yuv_wm.g4a (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1/* The initial payload of the thread is always g0.
2 * WM_URB (incoming URB entries) is g3
3 * X0_R is g4
4 * X1_R is g5
5 * Y0_R is g6
6 * Y1_R is g7
7 */
8
9    /* Set up the X/Y screen coordinates of the pixels in our 4 subspans.  Each
10     * subspan is a 2x2 rectangle, and the screen x/y of the upper left of each
11     * subspan are given in GRF register 1.2 through 1.5 (which, with the word
12     * addressing below, are 1.4 through 1.11).
13     *
14     * The result is WM_X*_R and WM_Y*R being:
15     *
16     * X0: {ss0.x, ss0.x+1, ss0.x,   ss0.x+1, ss1.x, ss1.x+1, ss1.x,   ss1.x+y}
17     * Y0: {ss0.y, ss0.y,   ss0.y+1, ss0.y+1, ss1.y, ss1.y,   ss1.y+1, ss1.y+1}
18     * X1: {ss2.x, ss2.x+1, ss2.x,   ss2.x+1, ss3.x, ss3.x+1, ss3.x,   ss3.x+y}
19     * Y1: {ss2.y, ss2.y,   ss2.y+1, ss2.y+1, ss3.y, ss3.y,   ss3.y+1, ss3.y+1}
20     */
21
22    /* Set up ss0.x coordinates*/
23mov (1) g4<1>F g1.8<0,1,0>UW { align1 };
24add (1) g4.4<1>F g1.8<0,1,0>UW 1UB { align1 };
25mov (1) g4.8<1>F g1.8<0,1,0>UW { align1 };
26add (1) g4.12<1>F g1.8<0,1,0>UW 1UB { align1 };
27    /* Set up ss0.y coordinates */
28mov (1) g6<1>F g1.10<0,1,0>UW { align1 };
29mov (1) g6.4<1>F g1.10<0,1,0>UW { align1 };
30add (1) g6.8<1>F g1.10<0,1,0>UW 1UB { align1 };
31add (1) g6.12<1>F g1.10<0,1,0>UW 1UB { align1 };
32    /* set up ss1.x coordinates */
33mov (1) g4.16<1>F g1.12<0,1,0>UW { align1 };
34add (1) g4.20<1>F g1.12<0,1,0>UW 1UB { align1 };
35mov (1) g4.24<1>F g1.12<0,1,0>UW { align1 };
36add (1) g4.28<1>F g1.12<0,1,0>UW 1UB { align1 };
37    /* set up ss1.y coordinates */
38mov (1) g6.16<1>F g1.14<0,1,0>UW { align1 };
39mov (1) g6.20<1>F g1.14<0,1,0>UW { align1 };
40add (1) g6.24<1>F g1.14<0,1,0>UW 1UB { align1 };
41add (1) g6.28<1>F g1.14<0,1,0>UW 1UB { align1 };
42    /* Set up ss2.x coordinates */
43mov (1) g5<1>F g1.16<0,1,0>UW { align1 };
44add (1) g5.4<1>F g1.16<0,1,0>UW 1UB { align1 };
45mov (1) g5.8<1>F g1.16<0,1,0>UW { align1 };
46add (1) g5.12<1>F g1.16<0,1,0>UW 1UB { align1 };
47    /* Set up ss2.y coordinates */
48mov (1) g7<1>F g1.18<0,1,0>UW { align1 };
49mov (1) g7.4<1>F g1.18<0,1,0>UW { align1 };
50add (1) g7.8<1>F g1.18<0,1,0>UW 1UB { align1 };
51add (1) g7.12<1>F g1.18<0,1,0>UW 1UB { align1 };
52    /* Set up ss3.x coordinates */
53mov (1) g5.16<1>F g1.20<0,1,0>UW { align1 };
54add (1) g5.20<1>F g1.20<0,1,0>UW 1UB { align1 };
55mov (1) g5.24<1>F g1.20<0,1,0>UW { align1 };
56add (1) g5.28<1>F g1.20<0,1,0>UW 1UB { align1 };
57    /* Set up ss3.y coordinates */
58mov (1) g7.16<1>F g1.22<0,1,0>UW { align1 };
59mov (1) g7.20<1>F g1.22<0,1,0>UW { align1 };
60add (1) g7.24<1>F g1.22<0,1,0>UW 1UB { align1 };
61add (1) g7.28<1>F g1.22<0,1,0>UW 1UB { align1 };
62
63    /* Now, map these screen space coordinates into texture coordinates. */
64    /* subtract screen-space X origin of vertex 0. */
65add (8) g4<1>F g4<8,8,1>F -g1<0,1,0>F { align1 };
66add (8) g5<1>F g5<8,8,1>F -g1<0,1,0>F { align1 };
67    /* scale by texture X increment */
68mul (8) g4<1>F g4<8,8,1>F g3<0,1,0>F { align1 };
69mul (8) g5<1>F g5<8,8,1>F g3<0,1,0>F { align1 };
70    /* add in texture X offset */
71add (8) g4<1>F g4<8,8,1>F g3.12<0,1,0>F { align1 };
72add (8) g5<1>F g5<8,8,1>F g3.12<0,1,0>F { align1 };
73    /* subtract screen-space Y origin of vertex 0. */
74add (8) g6<1>F g6<8,8,1>F -g1.4<0,1,0>F { align1 };
75add (8) g7<1>F g7<8,8,1>F -g1.4<0,1,0>F { align1 };
76    /* scale by texture Y increment */
77mul (8) g6<1>F g6<8,8,1>F g3.20<0,1,0>F { align1 };
78mul (8) g7<1>F g7<8,8,1>F g3.20<0,1,0>F { align1 };
79    /* add in texture Y offset */
80add (8) g6<1>F g6<8,8,1>F g3.28<0,1,0>F { align1 };
81add (8) g7<1>F g7<8,8,1>F g3.28<0,1,0>F { align1 };
82    /* sampler  */
83mov (8) m1<1>F g4<8,8,1>F { align1 };
84mov (8) m2<1>F g5<8,8,1>F { align1 };
85mov (8) m3<1>F g6<8,8,1>F { align1 };
86mov (8) m4<1>F g7<8,8,1>F { align1 };
87
88    /*
89     * g0 holds the PS thread payload, which (oddly) contains
90     * precisely what the sampler wants to see in m0
91     */
92send  (16) 0 g12<1>UW g0<8,8,1>UW sampler (1,0,F) mlen 5 rlen 8 { align1 };
93mov (8) g19<1>UW g19<8,8,1>UW { align1 };
94
95    /* color space conversion function:
96     * R = Clamp ( 1.164(Y-16/255) + 1.596(Cr-128/255), 0, 1)
97     * G = Clamp ( 1.164(Y-16/255) - 0.813(Cr-128/255) - 0.392(Cb-128/255), 0, 1)
98     * B = Clamp ( 1.164(Y-16/255) + 2.017(Cb-128/255), 0, 1)
99     *
100     * Y is g14, g15.
101     * Cr is g12, g13.
102     * Cb is g16, g17.
103     *
104     * R is g2, g6.
105     * G is g3, g7.
106     * B is g4, g8.
107     */
108	/* Y = Y - 16/255 */
109add (8) g14<1>F g14<8,8,1>F -0.0627451F { align1 };
110	/* Cr = Cr - 128/255 */
111add (8) g12<1>F g12<8,8,1>F -0.501961F { align1 };
112	/* Cb = Cb - 128 / 255 */
113add (8) g16<1>F g16<8,8,1>F -0.501961F { align1 };
114	/* Y = Y * 1.164 */
115mul (8) g14<1>F g14<8,8,1>F 1.164F { align1 };
116	/* acc = 1.596 * Cr */
117mul (8) null g12<8,8,1>F 1.596F { align1 };
118	/* R = acc + Y */
119mac.sat (8) m2<1>F g14<8,8,1>F 1F { align1  };
120	/* acc = Cr * -0.813 */
121mul (8) null g12<8,8,1>F -0.813F { align1 };
122	/* acc += Cb * -0.392 */
123mac (8) null g16<8,8,1>F -0.392F { align1 };
124	/* G = acc + Y */
125mac.sat (8) m3<1>F g14<8,8,1>F 1F { align1  };
126	/* acc = Cb * 2.017 */
127mul (8) null g16<8,8,1>F 2.017F { align1 };
128	/* B = acc + Y */
129mac.sat (8) m4<1>F g14<8,8,1>F 1F { align1  };
130 /* and do it again */
131add (8) g15<1>F g15<8,8,1>F -0.0627451F { align1 };
132add (8) g13<1>F g13<8,8,1>F -0.501961F { align1 };
133add (8) g17<1>F g17<8,8,1>F -0.501961F { align1 };
134mul (8) g15<1>F g15<8,8,1>F 1.164F { align1 };
135mul (8) null g13<8,8,1>F 1.596F { align1 };
136mac.sat (8) m6<1>F g15<8,8,1>F 1F { align1  };
137mul (8) null g13<8,8,1>F -0.813F { align1 };
138mac (8) null g17<8,8,1>F -0.392F { align1 };
139mac.sat (8) m7<1>F g15<8,8,1>F 1F { align1  };
140mul (8) null g17<8,8,1>F 2.017F { align1 };
141mac.sat (8) m8<1>F g15<8,8,1>F 1F { align1  };
142
143   /* Pass through control information:
144    */
145mov (8) m1<1>UD g1<8,8,1>UD { align1 mask_disable };
146   /* Send framebuffer write message: XXX: acc0? */
147send (16) 0 null g0<8,8,1>UW write (
148	0, /* binding table index 0 */
149	8, /* pixel scoreboard clear */
150	4, /* render target write */
151	0 /* no write commit message */
152	) mlen 10 rlen 0 { align1 EOT };
153   /* padding */
154nop;
155nop;
156nop;
157nop;
158nop;
159nop;
160nop;
161nop;
162