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_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 LDB filter vertical UV ///////////////////////////////////////////////////////\r
10 //\r
11 //      This filter code prepares the src data and control data for ILDB filtering on all vertical edges of UV.\r
12 //\r
13 //      It sssumes the data for vertical de-blocking is already transposed.  \r
14 //\r
15 //              Chroma:\r
16 //\r
17 //              +-------+-------+\r
18 //              |               |               |\r
19 //              |               |               |\r
20 //              |               |               |\r
21 //              +-------+-------+\r
22 //              |               |               |\r
23 //              |               |               |\r
24 //              |               |               |\r
25 //              +-------+-------+\r
26 //\r
27 //              V0              V1              \r
28 //              Edge    Edge    \r
29 //\r
30 /////////////////////////////////////////////////////////////////////////////\r
31 \r
32 #if defined(_DEBUG) \r
33         mov             (1)             EntrySignatureC:w                       0xBBBC:w\r
34 #endif  \r
35 \r
36 //=============== Chroma deblocking ================\r
37 \r
38         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag \r
39 //    (f0.0)    jmpi    BYPASS_EXT_LEFT_EDGE_UV \r
40  \r
41         // Get vertical border edge control data.  \r
42         \r
43         // Get Luma maskA and maskB     \r
44         shr (16)        TempRow0(0)<1>          r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<0;1,0>:uw            RRampW(0)\r
45         shr (16)        TempRow1(0)<1>          r[ECM_AddrReg, wEdgeCntlMapB_ExtLeftVert0]<0;1,0>:uw            RRampW(0)\r
46         \r
47     (f0.0)      jmpi    ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_UV)\r
48 \r
49         // Extract UV MaskA and MaskB from every other bit of Y masks\r
50         and.nz.f0.0 (8) null:w                  TempRow0(0)<16;8,2>             1:w\r
51         and.nz.f0.1 (8) null:w                  TempRow1(0)<16;8,2>             1:w\r
52 \r
53 //---------- Deblock U external edge ----------\r
54         //      p1 = Prev MB U row 0\r
55         //      p0 = Prev MB U row 1\r
56         //      q0 = Cur MB U row 0\r
57         //      q1 = Cur MB U row 1\r
58         mov (1) P_AddrReg:w             PREV_MB_U_BASE:w                                                                        { NoDDClr }\r
59         mov (1) Q_AddrReg:w             SRC_MB_U_BASE:w                                                                         { NoDDChk }\r
60 \r
61         // alpha = bAlphaLeft0_Cb, beta = bBetaLeft0_Cb\r
62         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaLeft0_Cb]<2;2,1>:ub                                { NoDDClr }\r
63         // tc0 has bTc0_v30_0_Cb + bTc0_v20_0_Cb + bTc0_v10_0_Cb + bTc0_v00_0_Cb\r
64         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v00_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 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) Q_AddrReg:w             SRC_MB_V_BASE:w                                                                         { NoDDChk }\r
78 \r
79         // for vert edge: alpha = bAlphaLeft0_Cr, beta = bBetaLeft0_Cr\r
80         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaLeft0_Cr]<2;2,1>:ub                                { NoDDClr }\r
81         \r
82         // tc0 has bTc0_v30_0_Cr + bTc0_v20_0_Cr + bTc0_v10_0_Cr + bTc0_v00_0_Cr\r
83         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v00_0_Cr]<4;4,1>:ub                                 { NoDDChk }\r
84 \r
85         // UV MaskA and MaskB\r
86         mov (2)         f0.0<1>:uw              MaskA<2;2,1>:uw\r
87 \r
88         CALL(FILTER_UV, 1)      \r
89 \r
90 \r
91 ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_UV):\r
92         // Set EdgeCntlMap2 = 0, so it always uses bS < 4 algorithm.\r
93         // Same alpha and beta for all internal vert and horiz edges \r
94 \r
95 \r
96         //***** Need to take every other bit to form U or V maskA\r
97         // Get Luma maskA and maskB     \r
98         shr (16)        TempRow0(0)<1>          r[ECM_AddrReg, wEdgeCntlMap_IntMidVert]<0;1,0>:uw               RRampW(0)\r
99 \r
100 //---------- Deblock U internal edge ----------\r
101         //      p1 = Cur MB U row 2\r
102         //      p0 = Cur MB U row 3\r
103         //      q0 = Cur MB U row 4\r
104         //      q1 = Cur MB U row 5\r
105         mov (1) P_AddrReg:w             4*UV_ROW_WIDTH+SRC_MB_U_BASE:w                                  { NoDDClr }\r
106         mov (1) Q_AddrReg:w             8*UV_ROW_WIDTH+SRC_MB_U_BASE:w                                  { NoDDChk }\r
107 \r
108         // alpha = bAlphaInternal_Cb, beta = bBetaInternal_Cb\r
109         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaInternal_Cb]<2;2,1>:ub             { NoDDClr }\r
110 \r
111         // tc0 has bTc0_v32_Cb + bTc0_v22_Cb + bTc0_v12_Cb + bTc0_v02_Cb        \r
112         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v02_Cb]<4;4,1>:ub                           { NoDDChk }\r
113 \r
114         // Extract UV MaskA and MaskB from every other bit of Y masks\r
115         and.nz.f0.0 (8) null:w                  TempRow0(0)<16;8,2>             1:w\r
116 \r
117         // UV MaskA and MaskB\r
118         mov (1) f0.1:uw         0:w\r
119         mov (1) MaskB:uw        0:w                                                                                                     { NoDDClr }\r
120         mov (1) MaskA:uw        f0.0:uw                                                                                         { NoDDChk }\r
121         \r
122         CALL(FILTER_UV, 1)      \r
123 \r
124 \r
125 //---------- Deblock V internal edge ----------\r
126         //      P1 = Cur MB V row 2\r
127         //      P0 = Cur MB V row 3\r
128         //      Q0 = Cur MB V row 4\r
129         //      Q1 = Cur MB V row 5\r
130         mov (1) P_AddrReg:w             4*UV_ROW_WIDTH+SRC_MB_V_BASE:w                                  { NoDDClr }\r
131         mov (1) Q_AddrReg:w             8*UV_ROW_WIDTH+SRC_MB_V_BASE:w                                  { NoDDChk }\r
132 \r
133         // alpha = bAlphaInternal_Cr, beta = bBetaInternal_Cr\r
134         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaInternal_Cr]<2;2,1>:ub             { NoDDClr }     \r
135 \r
136         // tc0 has bTc0_v32_Cr + bTc0_v22_Cr + bTc0_v12_Cr + bTc0_v02_Cr        \r
137         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v02_Cr]<4;4,1>:ub                           { NoDDChk }\r
138 \r
139         // UV MaskA and MaskB\r
140         mov (2)         f0.0<1>:uw              MaskA<2;2,1>:uw\r
141 \r
142         CALL(FILTER_UV, 1)      \r
143 \r
144 \r
145 //BYPASS_4x4_DEBLOCK_V:\r