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 / mc / intra_Header.inc
1 /*\r
2  * Header file for all AVC intra prediction kernels\r
3  * Copyright © <2010>, Intel Corporation.\r
4  *\r
5  * This program is licensed under the terms and conditions of the\r
6  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at\r
7  * http://www.opensource.org/licenses/eclipse-1.0.php.\r
8  *\r
9  */\r
10 #if !defined(__INTRA_HEADER__)  // Make sure this file is only included once\r
11 #define __INTRA_HEADER__\r
12 \r
13 // Module name: intra_header.inc\r
14 //\r
15 // Header file for all AVC intra prediction kernels\r
16 //\r
17 //      This header file defines everything that's specific to intra macroblock kernels\r
18 \r
19 \r
20 //  ----------- Various data buffers and pointers ------------\r
21 //\r
22 //      I_PCM data buffer\r
23 //\r
24 #define         I_PCM_BUF_Y                     4\r
25 #define         I_PCM_BUF_UV            12\r
26 \r
27 #define         REG_I_PCM_BUF_Y         r4\r
28 #define         REG_I_PCM_BUF_UV        r12\r
29 \r
30 .declare    I_PCM_Y  Base=REG_I_PCM_BUF_Y  ElementSize=1 SrcRegion=REGION(16,1) Type=ub // 8-bit I_PCM Y data\r
31 .declare    I_PCM_UV Base=REG_I_PCM_BUF_UV ElementSize=1 SrcRegion=REGION(16,1) Type=ub // 8-bit I_PCM U/V data\r
32 \r
33 //      Intra macroblock error data blocks\r
34 //\r
35 #define     ERRBUF              4               // Starting GRF index for error data\r
36 #define         REG_ERRBUF      r4\r
37 .declare    MBBLOCKW Base=REG_ERRBUF ElementSize=2 SrcRegion=REGION(16,1) Type=w        // For 16-bit inter MB\r
38 .declare    MBBLOCKD Base=REG_ERRBUF ElementSize=2 SrcRegion=REGION(16,1) Type=uw       // For use in "send" command\r
39 \r
40 #define     PERROR              a0.2    // Pointer to macroblock error data\r
41 #define     PERROR1             a0.3    // Pointer to macroblock error data used by instruction compression\r
42 #define     PERROR_UD   a0.1    // Pointer to macroblock error data in DWORD unit\r
43 \r
44 //      Intra macroblock reference data\r
45 //\r
46 #define         REG_INTRA_REF_TOP       r49             // Must be an odd numbered GRF register\r
47 .declare    INTRA_REF_TOP0              Base=REG_INTRA_REF_TOP   ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
48 .declare    INTRA_REF_TOP               Base=REG_INTRA_REF_TOP.4 ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
49                                                                                 // Actual top row reference data start at offset 4 in BYTE\r
50 .declare    INTRA_REF_TOP_W             Base=REG_INTRA_REF_TOP.2 ElementSize=2 SrcRegion=REGION(16,1) Type=uw\r
51                                                                                 // Actual top row reference data start at offset 2 in WORD\r
52 .declare    INTRA_REF_TOP_D             Base=REG_INTRA_REF_TOP ElementSize=4 DstRegion=<1> Type=ud      // Only used in "send" instruction\r
53 \r
54 #define         INTRA_REF_LEFT_ID       50\r
55 #define         REG_INTRA_REF_LEFT      r50\r
56 .declare    INTRA_REF_LEFT0             Base=REG_INTRA_REF_LEFT ElementSize=1 SrcRegion=REGION(8,4) Type=ub\r
57 .declare    INTRA_REF_LEFT              Base=REG_INTRA_REF_LEFT.3 ElementSize=1 SrcRegion=REGION(8,4) Type=ub\r
58                                                                                 // Actual left column reference data are located at offset 3 in BYTE\r
59 .declare    INTRA_REF_LEFT_UV   Base=REG_INTRA_REF_LEFT.2 ElementSize=1 SrcRegion=REGION(8,4) Type=ub\r
60                                                                                 // Actual left column U/V reference data are located at offset 2 in BYTE\r
61 .declare    INTRA_REF_LEFT_W    Base=REG_INTRA_REF_LEFT.1 ElementSize=2 SrcRegion=REGION(8,2) Type=uw\r
62                                                                                 // Actual left column reference data are located at offset 1 in WORD\r
63 .declare    INTRA_REF_LEFT_D    Base=REG_INTRA_REF_LEFT ElementSize=4 DstRegion=<1> Type=ud     // Only used in "send" instruction\r
64 \r
65 #define         PREF_LEFT               a0.4    // Pointer to left reference data\r
66 #define         PREF_LEFT_UD    a0.2    // Pointer in DWORD to left reference data\r
67 \r
68 #define         INTRA_TEMP_0    52\r
69 #define         INTRA_TEMP_1    53\r
70 #define         INTRA_TEMP_2    54\r
71 #define         INTRA_TEMP_3    55\r
72 #define         INTRA_TEMP_4    56\r
73 #define         INTRA_TEMP_5    57\r
74 #define         INTRA_TEMP_6    58\r
75 \r
76 #define         REG_INTRA_TEMP_0        r52\r
77 #define         REG_INTRA_TEMP_1        r53\r
78 #define         REG_INTRA_TEMP_2        r54\r
79 #define         REG_INTRA_TEMP_3        r55\r
80 #define         REG_INTRA_TEMP_4        r56\r
81 #define         REG_INTRA_TEMP_5        r57\r
82 #define         REG_INTRA_TEMP_6        r58\r
83 #define         REG_INTRA_TEMP_7        r59\r
84 #define         REG_INTRA_TEMP_8        r60\r
85 \r
86 // Destination registers for write commit\r
87 #define         REG_WRITE_COMMIT_Y      r60.0\r
88 #define         REG_WRITE_COMMIT_UV     r61.0\r
89 \r
90 //  ----------- Various data buffers and pointers ------------\r
91 //  R32 - R47 for predicted picture buffer (for both Y and U/V blocks)\r
92 //\r
93 #define     PREDBUF             32              // Starting GRF index for predicted buffer\r
94 #define         REG_PREDBUF     r32\r
95 \r
96 .declare    PRED_Y              Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub   // Predicted Y picture\r
97 .declare    PRED_YW             Base=REG_PREDBUF ElementSize=2 SrcRegion=REGION(16,1) Type=uw   // Predicted Y picture stored in WORD\r
98 .declare    PRED_Y_FM   Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub   // Predicted Y picture frame\r
99 .declare    PRED_Y_TF   Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub   // Predicted Y picture Top field\r
100 \r
101 .declare    PRED_UV             Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub   // Predicted U/V picture\r
102 .declare    PRED_UVW    Base=REG_PREDBUF ElementSize=2 SrcRegion=REGION(16,1) Type=uw   // Predicted U/V picture stored in WORD\r
103 .declare    PRED_UV_FM  Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub   // Predicted U/V picture frame\r
104 .declare    PRED_UV_TF  Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub   // Predicted U/V picture top field\r
105 .declare    PRED_UV_BF  Base=REG_PREDBUF.16 ElementSize=1 SrcRegion=REGION(16,1) Type=ub        // Predicted U/V picture bottom field\r
106 \r
107 //  The same region will also be used as finally decoded Y blocks shared with U/V blocks\r
108 //\r
109 #define     DECBUF              32\r
110 #define         REG_DECBUF      r32\r
111 .declare    DEC_Y               Base=REG_DECBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub    // Decoded Y picture\r
112 .declare    DEC_UV              Base=REG_DECBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub    // Decoded U/V P-/B-picture\r
113 .declare    DEC_UD              Base=REG_DECBUF ElementSize=4 SrcRegion=REGION(8,1) Type=ud             // Decoded buffer in UD type\r
114 \r
115 //      Reference buffer for intra_NxN prediction\r
116 //\r
117 #define         PRED_MODE       REG_INTRA_TEMP_0\r
118 .declare    REF_TOP0    Base=REG_INTRA_TEMP_5   ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
119 .declare    REF_TOP             Base=REG_INTRA_TEMP_5.4 ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
120                                                                         // Actual top reference data start from offset 3,i.e. p[-1,-1]\r
121 .declare    REF_TOP_W   Base=REG_INTRA_TEMP_5 ElementSize=2 SrcRegion=REGION(16,1) Type=uw\r
122 .declare    REF_TOP_D   Base=REG_INTRA_TEMP_5 ElementSize=4 SrcRegion=REGION(8,1) Type=ud\r
123 .declare    REF_LEFT    Base=REG_INTRA_TEMP_6 ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
124 .declare    REF_LEFT_D  Base=REG_INTRA_TEMP_6 ElementSize=4 SrcRegion=REGION(8,1) Type=ud\r
125 \r
126 // For intra prediction plane mode\r
127 //\r
128 .declare    H1  Base=REG_INTRA_TEMP_0 ElementSize=2 SrcRegion=REGION(8,1) Type=w        // Make sure it's an even GRF\r
129 .declare    H2  Base=REG_INTRA_TEMP_0.8 ElementSize=2 SrcRegion=REGION(8,1) Type=w\r
130 .declare    V1  Base=REG_INTRA_TEMP_1 ElementSize=2 SrcRegion=REGION(8,1) Type=w        // Make sure it's the following odd GRF\r
131 .declare    V2  Base=REG_INTRA_TEMP_1.8 ElementSize=2 SrcRegion=REGION(8,1) Type=w\r
132 \r
133 .declare        CP      Base=REG_INTRA_TEMP_2 ElementSize=2 SrcRegion=REGION(16,1) Type=w\r
134 \r
135 #define         PINTRAPRED_Y    a0.7    // Used as luma intra prediction mode pointer\r
136 #define         PINTRAPRED_UV   a0.7    // Used as chroma intra prediction mode pointer\r
137 #define         PINTRA4X4_Y             a0.4    // Used as luma intra_4x4 prediction mode pointer\r
138 \r
139 #define         PBWDCOPY_4              a0.4    // a0.4 - a0.7 used in intra_4x4 prediction for moving data backward\r
140 #define         PBWDCOPY_8              a0.6    // a0.6 - a0.7 used in intra_8x8 prediction for moving data backward\r
141 \r
142 // For Intra_4x4 prediction mode\r
143 //\r
144 .declare    INTRA_4X4_MODE      Base=REG_INTRA_TEMP_1 ElementSize=4 SrcRegion=REGION(1,0) DstRegion=<1> Type=d  // Actually only need 1 DWORD\r
145 \r
146 //  ----------- Intra CURBE constants ------------\r
147 //\r
148 #define         REG_CURBE1      r1\r
149 #define         REG_CURBE2      r2\r
150 #define         INTRA_4X4_OFFSET        1*GRFWIB                // 9 Bytes\r
151 #define         INTRA_8X8_OFFSET        1*GRFWIB+12             // 9 Bytes starting sub-register r1.3:ud\r
152 #define         INTRA_16X16_OFFSET      1*GRFWIB+24             // 4 Bytes starting sub-register r1.6:ud\r
153 #define         INTRA_CHROMA_OFFSET     1*GRFWIB+28             // 4 Bytes starting sub-register r1.7:ud\r
154 \r
155 #define         TOP_REF_OFFSET          REG_CURBE1.10   // r1.5:w\r
156 \r
157 //      Constants used in plane intra prediction mode\r
158 #define         XY_3    REG_CURBE2.4    // Stored BYTE constants x-3 for x=0...7, i.e. -3,-2,...3,4 for U/V, need duplicate to every other byte\r
159 #define         XY_3_1  REG_CURBE2.5    // Stored BYTE constants x-3 for x=0...7, i.e. -3,-2,...3,4 for 2nd instruction in {Comp}\r
160 #define         XY_7    REG_CURBE2.0    // Stored BYTE constants x-7 for x=0...15, i.e. -7,-6,...7,8 for Y\r
161 #define         XY_7_1  REG_CURBE2.1    // Stored BYTE constants x-7 for x=0...15, i.e. -7,-6,...7,8 for 2nd instruction in {Comp}\r
162 \r
163 #define         INV_SHIFT       REG_CURBE2.16\r
164 \r
165 #define         INV_TRANS4      REG_CURBE2.20   // For reverse data transfer for intra_4x4 (0x00020406)\r
166 #define         INV_TRANS48     REG_CURBE2.22   // For reverse data transfer for intra_4x4 (0x0002)\r
167 #define         INV_TRANS8      REG_CURBE1.22   // For reverse data transfer for intra_8x8 (0x0001)\r
168 \r
169 #define         INTRA_MODE      REG_CURBE2.24   // Offset to intra_Pred_4x4_Y from each sub-block\r
170 \r
171 //  ----------- In-line parameters ------------\r
172 //\r
173 #define REG_INLINE      r3\r
174 \r
175 #define INLINE_DW0      REG_INLINE.0<0;1,0>:ud\r
176 #define INLINE_DW1      REG_INLINE.1<0;1,0>:ud\r
177 #define INLINE_DW2      REG_INLINE.2<0;1,0>:ud\r
178 #define INLINE_DW3      REG_INLINE.3<0;1,0>:ud\r
179 #define INLINE_DW4      REG_INLINE.4<0;1,0>:ud\r
180 #define INLINE_DW5      REG_INLINE.5<0;1,0>:ud\r
181 #define INLINE_DW6      REG_INLINE.6<0;1,0>:ud\r
182 #define INLINE_DW7      REG_INLINE.7<0;1,0>:ud\r
183 \r
184 //      Intra macroblock in-line data\r
185 //\r
186 //      In-line DWORD 0\r
187 #define REG_MBAFF_FIELD                         REG_INLINE.1    // :uw, can be added directly to lower-word of MSGDSC\r
188 #define MBAFF_FIELD                                     BIT26+BIT25             // Bits 26:25 - MBAFF field macroblock flag\r
189                                                                                                         //  00 = Current macroblock is not an MBAFF field macroblock\r
190                                                                                                         //  11 = Current macroblock is an MBAFF field macroblock\r
191 \r
192 #define REG_FIELD_PARITY                        INLINE_DW0\r
193 #define FIELD_PARITY                            BIT24                   // Bit 24 - Macroblock field parity flag\r
194                                                                                                         //  0 = Current field is a top field\r
195                                                                                                         //  1 = Current field is a bottom field\r
196 \r
197 #define REG_FIELD_MACROBLOCK_FLAG       INLINE_DW0\r
198 #define FIELD_MACROBLOCK_FLAG           BIT14                   // Bit 14 - Field macroblock flag\r
199                                                                                                         //  0 = Current macroblock is not a field macroblock\r
200                                                                                                         //  1 = Current macroblock is a field macroblock\r
201 #define REG_MACROBLOCK_TYPE                     INLINE_DW0\r
202 #define MACROBLOCK_TYPE                         BIT12+BIT11+BIT10+BIT9+BIT8             // Bit 12:8 - Intra macroblock flag\r
203 \r
204 #define REG_CHROMA_FORMAT_IDC           INLINE_DW0\r
205 #define CHROMA_FORMAT_IDC                       BIT3+BIT2               // Bit 3:2 - Chroma format\r
206                                                                                                         // 00 = Luma only (Monochrome)\r
207                                                                                                         // 01 = YUV420\r
208                                                                                                         // 10 = YUV422\r
209                                                                                                         // 11 = YUV444\r
210 #define REG_MBAFF_PIC                           INLINE_DW0\r
211 #define MBAFF_PIC                                       BIT1                    // Bit 1 - MBAFF Frame picture\r
212                                                                                                         // 0 = Not an MBAFF frame picture\r
213                                                                                                         // 1 = An MBAFF frame picture\r
214 #define REG_INTRA_PRED_8X8_BLK2_AVAIL_FLAG      INLINE_DW0\r
215 #define INTRA_PRED_8X8_BLK2_AVAIL_FLAG  BIT4            // Bit 4: Pixel available for block 2 in an intra_8x8 MB.\r
216 \r
217 //      In-line DWORD 1\r
218 #define ORIX                    REG_INLINE.4    // :ub, H. origin of the macroblock in macroblock unit\r
219 #define ORIY                    REG_INLINE.5    // :ub, V. origin of the macroblock in macroblock unit\r
220 \r
221 //      In-line DWORD 2\r
222 #define REG_CBPCYB                                      REG_INLINE.9    // :ub, Coded block pattern\r
223 #define REG_CBPCY                                       INLINE_DW2              // Bits 13:8 - Coded block pattern\r
224                                                                                                         // reflect Y0, Y1, Y2, Y3, Cb4, Cr5\r
225                                                                                                         // Bit 13 - Y0\r
226                                                                                                         // Bit 12 - Y1\r
227                                                                                                         // Bit 11 - Y2\r
228                                                                                                         // Bit 10 - Y3\r
229                                                                                                         // Bit 9 - U4\r
230                                                                                                         // Bit 8 - V5\r
231 #define CBP_MASK                                        0x3F00:ud               // Bit mask for all CBP bits\r
232 #define CBP_Y_MASK                                      0x3C00:ud               // Bit mask for CBP Y bits\r
233 #define CBP_UV_MASK                                     0x0300:ud               // Bit mask for CBP U/V bits\r
234 \r
235 #define CBP_Y0_MASK                                     BIT13:ud                // Bit mask for CBP Y0 bit\r
236 #define CBP_Y1_MASK                                     BIT12:ud                // Bit mask for CBP Y1 bit\r
237 #define CBP_Y2_MASK                                     BIT11:ud                // Bit mask for CBP Y2 bit\r
238 #define CBP_Y3_MASK                                     BIT10:ud                // Bit mask for CBP Y3 bit\r
239 #define CBP_U_MASK                                      BIT9:ud                 // Bit mask for CBP U bit\r
240 #define CBP_V_MASK                                      BIT8:ud                 // Bit mask for CBP V bit\r
241 \r
242 //      In-line DWORD 3\r
243 #define REG_INTRA_CHROMA_PRED_MODE      REG_INLINE.12   // :ub - Intra chroma prediction mode\r
244 #define INTRA_CHROMA_PRED_MODE          BIT7+BIT6               // Bit 7:6 - Intra chroma prediction mode\r
245                                                                                                         // 00 = Intra DC prediction\r
246                                                                                                         // 01 = Intra horizontal prediction\r
247                                                                                                         // 10 = Intra vertical prediction\r
248                                                                                                         // 11 = Intra plane prediction\r
249 #define INTRA_CHROMA_PRED_MODE_SHIFT    6                       // Intra chroma prediction mode shift\r
250 \r
251 #define REG_INTRA_PRED_AVAIL_FLAG       INLINE_DW3\r
252 #define INTRA_PRED_AVAIL_FLAG           BIT4+BIT3+BIT2+BIT1+BIT0        // Bits 4:0 - Intra prediction available flag\r
253                                                                                                         // Bit 0: Macroblock A (the left neighbor) entire or top half\r
254                                                                                                         // Bit 1: Macroblock B (the upper neighbor)\r
255                                                                                                         // Bit 2: Macroblock C (the above-right neighbor)\r
256                                                                                                         // Bit 3: Macroblock D (the above-left neighbor)\r
257                                                                                                         // Bit 4: Macroblock A (the left neighbor) bottom half\r
258                                                                                                         // Each bit is defined below\r
259                                                                                                         // 0 = The macroblock is not available for intra prediction\r
260                                                                                                         // 1 = The macroblock is available for intra prediction\r
261 #define INTRA_PRED_LEFT_TH_AVAIL_FLAG   BIT0            // Bit 0: Macroblock A (the left neighbor) entire or top half\r
262 #define INTRA_PRED_UP_AVAIL_FLAG                BIT1            // Bit 1: Macroblock B (the upper neighbor)\r
263 #define INTRA_PRED_UP_RIGHT_AVAIL_FLAG  BIT2            // Bit 2: Macroblock C (the above-right neighbor)\r
264 #define INTRA_PRED_UP_LEFT_AVAIL_FLAG   BIT3            // Bit 3: Macroblock D (the above-left neighbor)\r
265 #define INTRA_PRED_LEFT_BH_AVAIL_FLAG   BIT4            // Bit 4: Macroblock A (the left neighbor) bottom half\r
266 //#define INTRA_PRED_8X8_BLK2_AVAIL_FLAG        BIT5            // Bit 5: Pixel available for block 2 in an intra_8x8 MB.\r
267 #define REG_INTRA_PRED_AVAIL_FLAG_BYTE  REG_INLINE.12   // Byte location of Intra_Pred_Avail_Flag\r
268 #define REG_INTRA_PRED_AVAIL_FLAG_WORD  REG_INLINE.6    // Word location of Intra_Pred_Avail_Flag\r
269 \r
270 \r
271 .declare    INTRA_PRED_MODE  Base=REG_INLINE.16 ElementSize=1 SrcRegion=REGION(16,1) Type=ub    // Intra prediction mode\r
272 \r
273 // End of intra_header.inc\r
274 \r
275 #endif  // !defined(__INTRA_HEADER__)\r
276 \r