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_UV_h.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 horizontal UV ///////////////////////////////////////////////////////\r
10 //\r
11 //      This filter code prepares the src data and control data for ILDB filtering on all horizontal edges of UV.\r
12 //\r
13 //      It sssumes the data for horizontal de-blocking is already transposed.  \r
14 //\r
15 //              Chroma:\r
16 //\r
17 //              +-------+-------+               H0 Edge\r
18 //              |               |               |\r
19 //              |               |               |\r
20 //              |               |               |\r
21 //              +-------+-------+               H1 Edge\r
22 //              |               |               |\r
23 //              |               |               |\r
24 //              |               |               |\r
25 //              +-------+-------+\r
26 //\r
27 /////////////////////////////////////////////////////////////////////////////\r
28 \r
29 #if defined(_DEBUG) \r
30         mov             (1)             EntrySignatureC:w                       0xBBBC:w\r
31 #endif  \r
32 \r
33 //=============== Chroma deblocking ================\r
34 \r
35 //---------- Deblock U external top edge ----------\r
36         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterTopMbEdgeFlag:w           // Check for FilterTopMbEdgeFlag \r
37 //    (f0.0)    jmpi    BYPASS_EXT_TOP_EDGE_UV  \r
38 \r
39         // Get horizontal border edge control data.\r
40         \r
41         //***** Need to take every other bit to form U maskA and mask B\r
42         // Get Luma maskA and maskB     \r
43         shr (16)        TempRow0(0)<1>          r[ECM_AddrReg, wEdgeCntlMapA_ExtTopHorz0]<0;1,0>:uw             RRampW(0)\r
44         shr (16)        TempRow1(0)<1>          r[ECM_AddrReg, wEdgeCntlMapB_ExtTopHorz0]<0;1,0>:uw             RRampW(0)\r
45                 \r
46     (f0.0)      jmpi    ILDB_LABEL(BYPASS_EXT_TOP_EDGE_UV)                      \r
47 \r
48         // Extract UV MaskA and MaskB from every other bit of Y masks\r
49         and.nz.f0.0 (8) null:w                  TempRow0(0)<16;8,2>             1:w\r
50         and.nz.f0.1 (8) null:w                  TempRow1(0)<16;8,2>             1:w\r
51 \r
52 //---------- Deblock U external edge ----------\r
53         //      p1 = Prev MB U row 0\r
54         //      p0 = Prev MB U row 1\r
55         //      q0 = Cur MB U row 0\r
56         //      q1 = Cur MB U row 1\r
57 //      mov (1) P_AddrReg:w             PREV_MB_U_BASE:w                                                                        { NoDDClr }\r
58         mov (1) P_AddrReg:w             TOP_MB_U_BASE:w                                                                         { NoDDClr }\r
59         mov (1) Q_AddrReg:w             SRC_MB_U_BASE:w                                                                         { NoDDChk }\r
60 \r
61         // alpha = bAlphaTop0_Cb, beta = bBetaTop0_Cb\r
62         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaTop0_Cb]<2;2,1>:ub                                 { NoDDClr } \r
63         // tc0 has bTc0_h03_0_Cb + bTc0_h02_0_Cb + bTc0_h01_0_Cb + bTc0_h00_0_Cb\r
64         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h00_0_Cb]<4;4,1>:ub                                 { NoDDChk } \r
65                 \r
66         // UV MaskA and MaskB\r
67         mov (2)         MaskA<1>:uw                     f0.0<2;2,1>:uw\r
68 \r
69         CALL(FILTER_UV, 1)      \r
70 \r
71 //---------- Deblock V external top edge ----------\r
72         //      p1 = Prev MB V row 0\r
73         //      p0 = Prev MB V row 1\r
74         //      q0 = Cur MB V row 0\r
75         //      q1 = Cur MB V row 1\r
76 //      mov (1) P_AddrReg:w             PREV_MB_V_BASE:w                { NoDDClr }\r
77         mov (1) P_AddrReg:w             TOP_MB_V_BASE:w         { NoDDClr }\r
78         mov (1) Q_AddrReg:w             SRC_MB_V_BASE:w                 { NoDDChk }\r
79 \r
80         // alpha = bAlphaTop0_Cr, beta = bBetaTop0_Cr\r
81         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaTop0_Cr]<2;2,1>:ub         { NoDDClr }\r
82         \r
83         // tc0 has bTc0_h03_0_Cr + bTc0_h02_0_Cr + bTc0_h01_0_Cr + bTc0_h00_0_Cr\r
84         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h00_0_Cr]<4;4,1>:ub         { NoDDChk }\r
85 \r
86         // UV MaskA and MaskB\r
87         mov (2)         f0.0<1>:uw              MaskA<2;2,1>:uw\r
88 \r
89         CALL(FILTER_UV, 1)      \r
90 \r
91 ILDB_LABEL(BYPASS_EXT_TOP_EDGE_UV):\r
92 \r
93         // Set EdgeCntlMap2 = 0, so it always uses bS < 4 algorithm.\r
94 \r
95         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  \r
96 //      and.z.f0.0 (1) null:w   r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag \r
97 //    (f0.0)    jmpi    BYPASS_4x4_DEBLOCK_H\r
98 \r
99 //---------- Deblock U internal horz middle edge ----------\r
100 \r
101         //***** Need to take every other bit to form U maskA\r
102         // Get Luma maskA and maskB     \r
103         shr (16)        TempRow0(0)<1>          r[ECM_AddrReg, wEdgeCntlMap_IntMidHorz]<0;1,0>:uw               RRampW(0)\r
104 \r
105         //      p1 = Cur MB U row 2\r
106         //      p0 = Cur MB U row 3\r
107         //      q0 = Cur MB U row 4\r
108         //      q1 = Cur MB U row 5\r
109         mov (1) P_AddrReg:w             4*UV_ROW_WIDTH+SRC_MB_U_BASE:w                                  { NoDDClr }             // Skip 2 U rows and 2 V rows\r
110         mov (1) Q_AddrReg:w             8*UV_ROW_WIDTH+SRC_MB_U_BASE:w                                  { NoDDChk }\r
111 \r
112         // alpha = bAlphaInternal_Cb, beta = bBetaInternal_Cb\r
113         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaInternal_Cb]<2;2,1>:ub             { NoDDClr }\r
114         // tc0 has bTc0_h23_Cb + bTc0_h22_Cb + bTc0_h21_Cb + bTc0_h20_Cb                \r
115         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h20_Cb]<4;4,1>:ub                           { NoDDChk }\r
116 \r
117         // Extract UV MaskA and MaskB from every other bit of Y masks\r
118         and.nz.f0.0 (8) null:w                  TempRow0(0)<16;8,2>             1:w\r
119 \r
120         // UV MaskA and MaskB\r
121         mov (1) f0.1:uw         0:w\r
122         mov (1) MaskB:uw        0:w                                                                                                     { NoDDClr }\r
123         mov (1) MaskA:uw        f0.0:uw                                                                                         { NoDDChk }\r
124 \r
125         CALL(FILTER_UV, 1)      \r
126 \r
127 //---------- Deblock V internal horz middle edge ----------\r
128         //      p1 = Cur MB V row 2\r
129         //      p0 = Cur MB V row 3\r
130         //      q0 = Cur MB V row 4\r
131         //      q1 = Cur MB V row 5\r
132         mov (1) P_AddrReg:w             4*UV_ROW_WIDTH+SRC_MB_V_BASE:w                                  { NoDDClr }             // Skip 2 U rows and 2 V rows\r
133         mov (1) Q_AddrReg:w             8*UV_ROW_WIDTH+SRC_MB_V_BASE:w                                  { NoDDChk }\r
134 \r
135         // alpha = bAlphaInternal_Cr, beta = bBetaInternal_Cr\r
136         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaInternal_Cr]<2;2,1>:ub             { NoDDClr }\r
137         // tc0 has bTc0_h23_Cr + bTc0_h22_Cr + bTc0_h21_Cr + bTc0_h20_Cr\r
138         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h20_Cr]<4;4,1>:ub                           { NoDDChk }\r
139 \r
140         // UV MaskA and MaskB\r
141         mov (2)         f0.0<1>:uw              MaskA<2;2,1>:uw\r
142 \r
143         CALL(FILTER_UV, 1)      \r
144 \r
145 //BYPASS_4x4_DEBLOCK_H:\r