OSDN Git Service

i965_drv_video: add support for H264 on Clarkdale/Arrandale
[android-x86/hardware-intel-common-libva.git] / i965_drv_video / shaders / h264 / ildb / AVC_ILDB_Filter_Mbaff_Y_v.asm
1 /*\r
2  * Copyright © <2010>, Intel Corporation.\r
3  *\r
4  * This program is licensed under the terms and conditions of the\r
5  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at\r
6  * http://www.opensource.org/licenses/eclipse-1.0.php.\r
7  *\r
8  */\r
9 ////////// AVC ILDB filter vertical Mbaff Y ///////////////////////////////////////////////////////\r
10 //\r
11 //      This filter code prepares the src data and control data for ILDB filtering on all vertical edges of Y.\r
12 //\r
13 //      It sssumes the data for vertical de-blocking is already transposed.  \r
14 //\r
15 //              Luma:\r
16 //\r
17 //              +-------+-------+-------+-------+\r
18 //              |               |               |               |               |\r
19 //              |               |               |               |               |\r
20 //              |               |               |               |               |\r
21 //              +-------+-------+-------+-------+\r
22 //              |               |               |               |               |\r
23 //              |               |               |               |               |\r
24 //              |               |               |               |               |\r
25 //              +-------+-------+-------+-------+\r
26 //              |               |               |               |               |\r
27 //              |               |               |               |               |\r
28 //              |               |               |               |               |\r
29 //              +-------+-------+-------+-------+\r
30 //              |               |               |               |               |\r
31 //              |               |               |               |               |\r
32 //              |               |               |               |               |\r
33 //              +-------+-------+-------+-------+\r
34 //\r
35 //              V0              V1              V2              V3\r
36 //              Edge    Edge    Edge    Edge\r
37 //\r
38 /////////////////////////////////////////////////////////////////////////////\r
39 \r
40 #if defined(_DEBUG) \r
41         mov             (1)             EntrySignatureC:w                       0xBBBB:w\r
42 #endif  \r
43         \r
44 \r
45 //========== Luma deblocking ==========\r
46 \r
47 \r
48 //---------- Deblock Y external left edge (V0) ----------       \r
49 \r
50         cmp.z.f0.0      (8)     null:w  VertEdgePattern:uw              LEFT_FIELD_CUR_FRAME:w\r
51         cmp.z.f0.1      (8)     null:w  VertEdgePattern:uw              LEFT_FRAME_CUR_FIELD:w\r
52 \r
53         // Intial set for both are frame or field\r
54         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub\r
55         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub\r
56         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v00_0_Y]<1;4,0>:ub\r
57                 \r
58         // For FieldModeCurrentMbFlag=1 && FieldModeLeftMbFlag=0\r
59         (f0.0) mov (8)  Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }\r
60         (f0.0) mov (8)  Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }\r
61         (f0.0) mov (8)  Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }\r
62         (f0.0) mov (8)  Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }\r
63         (f0.0) mov (8)  Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }\r
64         (f0.0) mov (8)  Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }\r
65 \r
66         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag \r
67 \r
68         // For FieldModeCurrentMbFlag=0 && FieldModeLeftMbFlag=1\r
69         (f0.1) mov (8)  Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }\r
70         (f0.1) mov (8)  Mbaff_ALPHA(0,8)<1>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }\r
71         (f0.1) mov (8)  Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }\r
72         (f0.1) mov (8)  Mbaff_BETA(0,8)<1>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }\r
73         (f0.1) mov (8)  Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }\r
74         (f0.1) mov (8)  Mbaff_TC0(0,8)<1>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }\r
75 \r
76         // Get (alpha >> 2) + 2\r
77         shr (16) Mbaff_ALPHA2(0,0)<1>   Mbaff_ALPHA(0)          2:w                     // alpha >> 2\r
78 \r
79         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>\r
80         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>\r
81         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>\r
82         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>\r
83         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>\r
84         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>\r
85         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>\r
86         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>\r
87         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w        { NoDDClr }\r
88         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w         { NoDDChk }\r
89 \r
90         // Set MaskA and MaskB  \r
91         mov (2) MaskA<1>:uw             r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<2;2,1>:uw\r
92 \r
93         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  \r
94 \r
95 //      CALL(FILTER_Y_MBAFF, 1)\r
96         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)\r
97         \r
98 //BYPASS_V0_Y:\r
99 //------------------------------------------------------------------\r
100 \r
101 \r
102 /*\r
103 //---------- Deblock Y external left edge (V0) ----------       \r
104 \r
105         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag \r
106     (f0.0)      jmpi    ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_Y)      \r
107 \r
108         // Get vertical border edge control data  \r
109 \r
110 //      mov     (1)     f0.0            0:w\r
111         and     (1)     CTemp1_W:uw             r[ECM_AddrReg, BitFlags]:ub             FieldModeLeftMbFlag+FieldModeCurrentMbFlag:uw\r
112         cmp.z.f0.0      (1)     null:w  CTemp1_W:uw             LEFT_FIELD_CUR_FRAME:w\r
113         (-f0.0) jmpi LEFT_EDGE_Y_NEXT1\r
114 \r
115         // For FieldModeCurrentMbFlag=1 && FieldModeLeftMbFlag=0\r
116         mov     (8)     Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }\r
117         mov     (8)     Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }\r
118         mov     (8)     Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }\r
119         mov     (8)     Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }\r
120         mov (8) Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }\r
121         mov (8) Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }\r
122 \r
123         jmpi    LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED\r
124 \r
125 LEFT_EDGE_Y_NEXT1:\r
126         cmp.z.f0.0      (1)     null:w  CTemp1_W:uw             LEFT_FRAME_CUR_FIELD:w\r
127         (-f0.0) jmpi LEFT_EDGE_Y_NEXT2\r
128 \r
129 \r
130         // For FieldModeCurrentMbFlag=0 && FieldModeLeftMbFlag=1\r
131         mov     (8)     Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }\r
132         mov     (8)     Mbaff_ALPHA(0,8)<1>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }\r
133         mov     (8)     Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }\r
134         mov     (8)     Mbaff_BETA(0,8)<1>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }\r
135         mov (8) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }\r
136         mov (8) Mbaff_TC0(0,8)<1>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }\r
137 \r
138         jmpi    LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED\r
139         \r
140 LEFT_EDGE_Y_NEXT2:\r
141         // both are frame or field\r
142         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub\r
143         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub\r
144         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v00_0_Y]<1;4,0>:ub\r
145 \r
146 LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED:\r
147 \r
148         mov (2) MaskA<1>:uw             r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<2;2,1>:uw\r
149 \r
150         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>\r
151         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>\r
152         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>\r
153         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>\r
154         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>\r
155         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>\r
156         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>\r
157         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>\r
158         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w        { NoDDClr }\r
159         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w         { NoDDChk }\r
160         \r
161         // Get (alpha >> 2) + 2\r
162         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         2:w                     // alpha >> 2\r
163         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  \r
164         \r
165         CALL(FILTER_Y_MBAFF, 1)\r
166 \r
167 ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_Y):\r
168 //------------------------------------------------------------------\r
169 */\r
170 \r
171         // Same alpha, alpha2, beta and MaskB for all internal edges \r
172         \r
173         // Get (alpha >> 2) + 2\r
174         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub              2:w                     // alpha >> 2\r
175         \r
176         // alpha = bAlphaInternal_Y\r
177         // beta = bBetaInternal_Y\r
178         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub\r
179         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaInternal_Y]<0;1,0>:ub\r
180 \r
181         mov (1) MaskB:uw        0:w                                             // Set MaskB = 0 for all 3 edges, so it always uses bS < 4 algorithm.\r
182 \r
183         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                             // alpha2 = (alpha >> 2) + 2  \r
184 \r
185 //---------- Deblock Y internal left edge (V1) ----------\r
186 \r
187         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  \r
188         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag \r
189 //    (f0.0)    jmpi    BYPASS_V1_Y\r
190 \r
191         //      p3 = Cur MB Y row 0 = r[P_AddrReg, 0]<16;16,1>  \r
192         //      p2 = Cur MB Y row 1 = r[P_AddrReg, 16]<16;16,1>\r
193         //      p1 = Cur MB Y row 2 = r[P_AddrReg, 32]<16;16,1>\r
194         //      p0 = Cur MB Y row 3 = r[P_AddrReg, 48]<16;16,1>\r
195         //      q0 = Cur MB Y row 4 = r[Q_AddrReg, 0]<16;16,1> \r
196         //      q1 = Cur MB Y row 5 = r[Q_AddrReg, 16]<16;16,1>\r
197         //      q2 = Cur MB Y row 6 = r[Q_AddrReg, 32]<16;16,1>\r
198         //      q3 = Cur MB Y row 7 = r[Q_AddrReg, 48]<16;16,1>\r
199         mov (1) P_AddrReg:w             SRC_MB_Y_BASE:w                                         { NoDDClr }\r
200         mov (1) Q_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDChk }\r
201 \r
202         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntLeftVert]:uw\r
203 \r
204         // tc0 has bTc0_v31_Y + bTc0_v21_Y + bTc0_v11_Y + bTc0_v01_Y    \r
205         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v01_Y]<1;4,0>:ub\r
206 \r
207 //      CALL(FILTER_Y_MBAFF, 1)\r
208         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)\r
209 \r
210 BYPASS_V1_Y:\r
211 //------------------------------------------------------------------\r
212 \r
213 \r
214 //---------- Deblock Y internal mid vert edge (V2) ----------\r
215 \r
216         // Bypass deblocking if FilterInternal8x8EdgesFlag = 0  \r
217         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal8x8EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag \r
218 //    (f0.0)    jmpi    BYPASS_V2_Y\r
219 \r
220         //      p3 = Cur MB Y row 4  = r[P_AddrReg, 0]<16;16,1>  \r
221         //      p2 = Cur MB Y row 5  = r[P_AddrReg, 16]<16;16,1> \r
222         //      p1 = Cur MB Y row 6  = r[P_AddrReg, 32]<16;16,1> \r
223         //      p0 = Cur MB Y row 7  = r[P_AddrReg, 48]<16;16,1> \r
224         //      q0 = Cur MB Y row 8  = r[Q_AddrReg, 0]<16;16,1>  \r
225         //      q1 = Cur MB Y row 9  = r[Q_AddrReg, 16]<16;16,1> \r
226         //      q2 = Cur MB Y row 10 = r[Q_AddrReg, 32]<16;16,1> \r
227         //      q3 = Cur MB Y row 11 = r[Q_AddrReg, 48]<16;16,1> \r
228         mov (1) P_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }\r
229         mov (1) Q_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDChk }\r
230 \r
231         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntMidVert]:uw\r
232 \r
233         // tc0 has bTc0_v32_Y + bTc0_v22_Y + bTc0_v12_Y + bTc0_v02_Y    \r
234         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v02_Y]<1;4,0>:ub\r
235 \r
236 //      CALL(FILTER_Y_MBAFF, 1)\r
237         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)\r
238 \r
239 BYPASS_V2_Y:\r
240 //-----------------------------------------------\r
241 \r
242 \r
243 //---------- Deblock Y interal right edge (V3) ----------        \r
244 \r
245         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  \r
246         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag \r
247 //    (f0.0)    jmpi    BYPASS_V3_Y\r
248 \r
249         //      p3 = Cur MB Y row 8  = r[P_AddrReg, 0]<16;16,1> \r
250         //      p2 = Cur MB Y row 9  = r[P_AddrReg, 16]<16;16,1>\r
251         //      p1 = Cur MB Y row 10 = r[P_AddrReg, 32]<16;16,1>\r
252         //      p0 = Cur MB Y row 11 = r[P_AddrReg, 48]<16;16,1>\r
253         //      q0 = Cur MB Y row 12 = r[Q_AddrReg, 0]<16;16,1> \r
254         //      q1 = Cur MB Y row 13 = r[Q_AddrReg, 16]<16;16,1>\r
255         //      q2 = Cur MB Y row 14 = r[Q_AddrReg, 32]<16;16,1>\r
256         //      q3 = Cur MB Y row 15 = r[Q_AddrReg, 48]<16;16,1>\r
257         mov (1) P_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }\r
258         mov (1) Q_AddrReg:w             12*Y_ROW_WIDTH+SRC_MB_Y_BASE:w          { NoDDChk }\r
259         \r
260         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntRightVert]:uw\r
261 \r
262         // tc0 has bTc0_v33_Y + bTc0_v23_Y + bTc0_v13_Y + bTc0_v03_Y\r
263         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v03_Y]<1;4,0>:ub\r
264 \r
265 //      CALL(FILTER_Y_MBAFF, 1)\r
266         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)\r
267 \r
268 BYPASS_V3_Y:\r
269 //-----------------------------------------------\r