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 / header.inc
1 /*\r
2  * Common header file for all AVC MC 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(__HEADER__)        // Make sure this file is only included once\r
11 #define __HEADER__\r
12 \r
13 // Module name: header.inc\r
14 //\r
15 // Common header file for all AVC MC kernels\r
16 //\r
17 \r
18 #ifndef COMBINED_KERNEL\r
19 #ifdef DEV_CTG\r
20   #define SW_SCOREBOARD         // SW Scoreboard should be enabled for CTG and earlier\r
21   #undef HW_SCOREBOARD          // HW Scoreboard should be disabled for CTG and earlier\r
22 #else\r
23   #define HW_SCOREBOARD         // HW Scoreboard should be enabled for ILK and beyond\r
24   #undef SW_SCOREBOARD          // SW Scoreboard should be disabled for ILK and beyond\r
25 #endif  // DEV_CTG\r
26 #endif  // COMBINED_KERNEL\r
27 \r
28 //#define MONO                          // Build Monochrome kernels\r
29 \r
30 //  Surface state definition\r
31 //\r
32 #define DESTY           0\r
33 #define DESTUV          1\r
34 #define REFYFM0         2\r
35 #define REFYFM1         3\r
36 #define REFYFM2         4\r
37 #define REFYFM3         5\r
38 #define REFYFM4         6\r
39 #define REFYFM5         7\r
40 #define REFYFM6         8\r
41 #define REFYFM7         9\r
42 #define REFYFM8         10\r
43 #define REFYFM9         11\r
44 #define REFYFM10        12\r
45 #define REFYFM11        13\r
46 #define REFYFM12        14\r
47 #define REFYFM13        15\r
48 #define REFYFM14        16\r
49 #define REFYFM15        17\r
50 #define REFUVFM0        18\r
51 #define REFUVFM1        19\r
52 #define REFUVFM2        20\r
53 #define REFUVFM3        21\r
54 #define REFUVFM4        22\r
55 #define REFUVFM5        23\r
56 #define REFUVFM6        24\r
57 #define REFUVFM7        25\r
58 #define REFUVFM8        26\r
59 #define REFUVFM9        27\r
60 #define REFUVFM10       28\r
61 #define REFUVFM11       29\r
62 #define REFUVFM12       30\r
63 #define REFUVFM13       31\r
64 #define REFUVFM14       32\r
65 #define REFUVFM15       33\r
66 \r
67 .default_execution_size (16)\r
68 .default_register_type  :ub\r
69 \r
70 //  ----------- Common constant definitions ------------\r
71 //\r
72 //  Bit position constants\r
73 //\r
74 #define BIT0    0x01\r
75 #define BIT1    0x02\r
76 #define BIT2    0x04\r
77 #define BIT3    0x08\r
78 #define BIT4    0x10\r
79 #define BIT5    0x20\r
80 #define BIT6    0x40\r
81 #define BIT7    0x80\r
82 #define BIT8    0x0100\r
83 #define BIT9    0x0200\r
84 #define BIT10   0x0400\r
85 #define BIT11   0x0800\r
86 #define BIT12   0x1000\r
87 #define BIT13   0x2000\r
88 #define BIT14   0x4000\r
89 #define BIT15   0x8000\r
90 #define BIT16   0x00010000\r
91 #define BIT17   0x00020000\r
92 #define BIT18   0x00040000\r
93 #define BIT19   0x00080000\r
94 #define BIT20   0x00100000\r
95 #define BIT21   0x00200000\r
96 #define BIT22   0x00400000\r
97 #define BIT23   0x00800000\r
98 #define BIT24   0x01000000\r
99 #define BIT25   0x02000000\r
100 #define BIT26   0x04000000\r
101 #define BIT27   0x08000000\r
102 #define BIT28   0x10000000\r
103 #define BIT29   0x20000000\r
104 #define BIT30   0x40000000\r
105 #define BIT31   0x80000000\r
106 \r
107 #define GRFWIB  32              // GRF register width in byte\r
108 #define GRFWIW  16              // GRF register width in word\r
109 #define GRFWID  8               // GRF register width in dword\r
110 \r
111 #define INST_SIZE   16          // Instruction size = 128b = 16 Bytes\r
112 \r
113 #define REGION(Width,HStride) <Width*HStride;Width,HStride>\r
114 \r
115 #define NULLREG         null<1>:ud\r
116 #define NULLREGW        null<1>:w\r
117 \r
118 #define TOP_FIELD               0\r
119 #define BOTTOM_FIELD    1\r
120 \r
121 //  M2 - M9 for date writing message payload\r
122 .declare    MSGPAYLOAD  Base=m2 ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
123 .declare    MSGPAYLOADB Base=m2 ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
124 .declare    MSGPAYLOADW Base=m2 ElementSize=2 SrcRegion=REGION(16,1) Type=uw\r
125 .declare    MSGPAYLOADD Base=m2 ElementSize=4 SrcRegion=REGION(8,1) Type=ud\r
126 \r
127 //  ----------- Common Message Descriptor ------------\r
128 //\r
129 #ifdef DEV_ILK\r
130 #define MSG_GW          0x03            // Message Gateway Extended Message Descriptor,\r
131 #define DAPREAD         0x04            // Data Port Read Extended Message Descriptor,\r
132 #define DAPWRITE        0x05            // Data Port Write Extended Message Descriptor,\r
133 #define TS                      0x07            // Thread Spawner Extended Message Descriptor\r
134 #define TS_EOT          0x27            // End of Thread Extended Message Descriptor\r
135 \r
136 #define EOTMSGDSC       0x02000010      // End of Thread Message Descriptor, don't deference URB handle\r
137 \r
138 // Data Port Message Descriptor\r
139 #define DWBRMSGDSC_RC    0x02086000     // DWORD Block Read Message Descriptor, reading from render cache = 6.\r
140 #define DWBRMSGDSC_RC_TF 0x02086600     // DWORD Block Read Message Descriptor, reading from render cache = 6.\r
141 #define DWBRMSGDSC_RC_BF 0x02086700     // DWORD Block Read Message Descriptor, reading from render cache = 6.\r
142 #define DWBRMSGDSC_SC    0x0208A000     // DWORD Block Read Message Descriptor, reading from sampler cache = A.\r
143 #define DWBRMSGDSC_SC_TF 0x0208E600     // DWORD Block Read Message Descriptor, reading top field from field mode sampler cache.\r
144 #define DWBRMSGDSC_SC_BF 0x0208E700     // DWORD Block Read Message Descriptor, reading bottom field from field mode sampler cache.\r
145 \r
146 #define DWBWMSGDSC               0x02082000     // DWORD Block Write Message Descriptor\r
147 #define DWBWMSGDSC_WC    0x0218A000     // DWORD Block Write Message Descriptor + write commit\r
148 \r
149 // Enable Write Commit writeback mesage\r
150 #define ENWRCOM         0x00108000      // Enable "write commit" and set response length = 1\r
151 \r
152 // Thread Spawner Message Descriptor\r
153 #define TSMSGDSC        0x02000011\r
154 \r
155 // Message Gateway Message Descriptors\r
156 #define OGWMSGDSC       0x02000000      // OpenGateway Message Descriptor\r
157 #define CGWMSGDSC       0x02000001      // CloseGateway Message Descriptor\r
158 #define FWDMSGDSC       0x02000002      // ForwardMsg Message Descriptor\r
159 \r
160 #define NOTIFYMSG       0x00008000      // Send notification with ForwardMsg message\r
161 \r
162 #define RESP_LEN(len)   0x100000*len\r
163 #define MSG_LEN(len)    0x2000000*len\r
164 \r
165 #else   // Pre DEV_ILK\r
166 \r
167 #define MSG_GW\r
168 #define DAPREAD\r
169 #define DAPWRITE\r
170 #define TS\r
171 #define TS_EOT\r
172 \r
173 #define EOTMSGDSC       0x87100010      // End of Thread Message Descriptor, don't deference URB handle\r
174 \r
175 // Data Port Message Descriptor\r
176 #define DWBRMSGDSC_RC    0x04106000     // DWORD Block Read Message Descriptor, reading from render cache = 6.\r
177 #define DWBRMSGDSC_RC_TF 0x04106600     // DWORD Block Read Message Descriptor, reading from render cache = 6.\r
178 #define DWBRMSGDSC_RC_BF 0x04106700     // DWORD Block Read Message Descriptor, reading from render cache = 6.\r
179 #define DWBRMSGDSC_SC    0x0410A000     // DWORD Block Read Message Descriptor, reading from sampler cache = A.\r
180 #define DWBRMSGDSC_SC_TF 0x0410A600     // DWORD Block Read Message Descriptor, reading top field from field mode sampler cache.\r
181 #define DWBRMSGDSC_SC_BF 0x0410A700     // DWORD Block Read Message Descriptor, reading bottom field from field mode sampler cache.\r
182 \r
183 #define DWBWMSGDSC               0x05102000     // DWORD Block Write Message Descriptor\r
184 #define DWBWMSGDSC_WC    0x0511A000     // DWORD Block Write Message Descriptor + write commit\r
185 \r
186 // Enable Write Commit writeback mesage\r
187 #define ENWRCOM         0x00018000      // Enable "write commit" and set response length = 1\r
188 \r
189 // Thread Spawner Message Descriptor\r
190 #define TSMSGDSC        0x07100011\r
191 \r
192 // Message Gateway Message Descriptors\r
193 #define OGWMSGDSC       0x03100000      // OpenGateway Message Descriptor\r
194 #define CGWMSGDSC       0x03100001      // CloseGateway Message Descriptor\r
195 #define FWDMSGDSC       0x03100002      // ForwardMsg Message Descriptor\r
196 \r
197 #define NOTIFYMSG       0x00008000      // Send notification with ForwardMsg message\r
198 #define ACKREQMSG       0x00014000      // Acknowledgement required so response length should be 1\r
199 \r
200 #define RESP_LEN(len)   0x10000*len\r
201 #define MSG_LEN(len)    0x100000*len\r
202 \r
203 #endif  // DEV_ILK\r
204 \r
205 // Enable frame/field selection in message descriptor\r
206 #define ENMSGDSCFM      0x400           // Enable MSGDSC to select frame surface\r
207 #define ENMSGDSCTF      0x600           // Enable MSGDSC to select top field surface\r
208 #define ENMSGDSCBF      0x700           // Enable MSGDSC to select bottom field surface\r
209 \r
210 //  ----------- Message related register ------------\r
211 //\r
212 #define MSGHDR          m1              // Message Payload Header\r
213 #define MSGHDRY         m1              // Message Payload Header register for Y data\r
214 #define MSGHDRY0        m1              // Message Payload Header register for Y data\r
215 #define MSGHDRY1        m2              // Message Payload Header register for Y data\r
216 #define MSGHDRY2        m3              // Message Payload Header register for Y data\r
217 #define MSGHDRY3        m4              // Message Payload Header register for Y data\r
218 #define MSGHDRUV        m5              // Message Payload Header register for U/V data\r
219 #define MSGSRC          r62             // Message source register, should never be used for other purposes\r
220 #define MSGDSC          a0.0:ud // Message Descriptor register (type DWORD)\r
221 \r
222 #define MH_ORI          MSGSRC.0        // DWORD block R/W message header block offset\r
223 #define MH_ORIX         MSGSRC.0        // DWORD block R/W message header X offset\r
224 #define MH_ORIY         MSGSRC.1        // DWORD block R/W message header Y offset\r
225 #define MH_SIZE         MSGSRC.2        // DWORD block R/W message header block width & height\r
226 \r
227 // Data necessary for kernel operations\r
228 //\r
229 //  Address registers used as pointers\r
230 //\r
231 //  Note: Please keep the register order as is since they are used in compressed instructions\r
232 //\r
233 #define     PPREDBUF_Y          a0.4    // Pointer to predicted Y picture\r
234 #define     PPREDBUF_Y1         a0.5    // Pointer to predicted Y picture for extended instruction\r
235 \r
236 #define     PPREDBUF_UV         a0.4    // Pointer to predicted U/V picture\r
237 #define     PPREDBUF_UV1        a0.5    // Pointer to predicted U/V picture for extended instruction\r
238 \r
239 #define     PDECBUF             a0.4    // Pointer to decoded picture data\r
240 #define     PDECBUF_UD  a0.2    // Pointer to decoded picture data in DWORD unit\r
241 \r
242 //  ----------- R63 is reserved for global variables ------------\r
243 //\r
244 //  Note: Don't program it with values other than what are defined here. \r
245 \r
246 #define G_REG           r63\r
247 \r
248 #define RETURN_REG      G_REG.0         // Return pointer for all sub-routine calls (type DWORD)\r
249 #define RETURN_REG1     G_REG.1         // Return pointer for second-level calls\r
250 \r
251 #define I_ORIX          G_REG.13        // :uw, H. origin of the macroblock in pixel unit, don't overwrite in-line data\r
252 #define I_ORIY          G_REG.14        // :uw, V. origin of the macroblock in pixel unit, don't overwrite in-line data\r
253 \r
254 //  Macros\r
255 //\r
256 //  Note: For macros that require multiple line expansion, insert "\n" at the end of each line.\r
257 //\r
258 #define GRF(reg)        r##reg\r
259 #ifdef DEV_ILK\r
260 #define END_THREAD                      send (8) NULLREG MSGHDR r0:ud TS_EOT    EOTMSGDSC\r
261 #else\r
262 #define END_THREAD                      send (8) NULLREG MSGHDR r0:ud EOTMSGDSC\r
263 #endif  // DEV_ILK\r
264 \r
265 #define CALL(subFunc, skipInst) add (1) RETURN_REG<1>:ud   ip:ud        (1+skipInst)*INST_SIZE \n\\r
266                                 jmpi (1) subFunc\r
267 \r
268 #define CALL_1(subFunc, skipInst)       add (1) RETURN_REG1<1>:ud   ip:ud       (1+skipInst)*INST_SIZE \n\\r
269                                 jmpi (1) subFunc\r
270 \r
271 #define RETURN          mov (1) ip:ud   RETURN_REG<0;1,0>:ud            // Return to calling module\r
272 #define RETURN_1        mov (1) ip:ud   RETURN_REG1<0;1,0>:ud           // Return to second-level calling module\r
273                                                                                                                                 // To support iterative calling\r
274 #ifdef SW_SCOREBOARD    \r
275 \r
276 #ifdef DEV_CTG_A\r
277   #define LEADING_THREAD        1               // For CTG A, no SRT is needed. Only PRT is necessary\r
278 #else\r
279   #define LEADING_THREAD        0               // For CTG B0 and beyond, PRT doesn't take into debug count\r
280   #define DOUBLE_SB                                     // Scoreboard size needs to be doubled\r
281 #endif\r
282 \r
283 #ifdef  DOUBLE_SB                                       // Scoreboard size needs to be doubled\r
284   #define SB_MASK               0x1ff           // Scoreboard wrap-around mask (for 512 entries)\r
285 #else\r
286   #define SB_MASK               0xff            // Scoreboard wrap-around mask (for 256 entries)\r
287 #endif  // defined(DOUBLE_SB)\r
288 \r
289 // Scoreboard related definitions\r
290 \r
291 #define TEMPX           r50\r
292 #define TEMPY           r51\r
293 #define DELTA           r52\r
294 \r
295 #define M05_STORE       r0.13           // :uw, reuse r0.6:ud upper-word to store M0.5 header information for scoreboard\r
296 \r
297 \r
298 #endif  // SW_SCOREBOARD\r
299 \r
300 // End of header.inc\r
301 \r
302 #endif  // !defined(__HEADER__)\r
303 \r