1 /*
2 * Copyright (c) 2019, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 #if (defined BUFFER_0) || (defined BUFFER_1) || (defined BUFFER_2) || (defined BUFFER_3)
23 vector <ushort, 16> LoadMaskTemp = (TempMask0.select<1, 1, 16, 1>(0, 0) != 0);
24 #elif (defined BUFFER_4) || (defined BUFFER_5)
25 uchar sec_half_shift = (Layer_Index >> 7) * 8;
26 vector <ushort, 16> LoadMaskTemp = (TempMask.select<16, 1>(0) != 0);
27 #endif
28 
29 #if defined BUFFER_0
30 Buffer_Index = 0;
31 CalculationMask = cm_pack_mask(LoadMaskTemp) & 0x000F;
32 #elif defined BUFFER_1
33 Buffer_Index = 1;
34 CalculationMask = (cm_pack_mask(LoadMaskTemp) >> 4) & 0x000F;
35 #elif defined BUFFER_2
36 Buffer_Index = 2;
37 CalculationMask = (cm_pack_mask(LoadMaskTemp) >> 8) & 0x000F;
38 #elif defined BUFFER_3
39 Buffer_Index = 3;
40 CalculationMask = (cm_pack_mask(LoadMaskTemp) >> 12) & 0x000F;
41 #elif defined BUFFER_4
42 CalculationMask = (cm_pack_mask(LoadMaskTemp) >> sec_half_shift) & 0x000F;
43 Buffer_Index = 4;
44 #elif defined BUFFER_5
45 CalculationMask = (cm_pack_mask(LoadMaskTemp) >> (4 + sec_half_shift)) & 0x000F;
46 Buffer_Index = 5;
47 #endif
48 
49 if (CalculationMask != 0)
50 {
51     float StartX;
52     float StartY;
53     float DeltaX;
54     float DeltaY;
55     uint Vertical_Block_Num;
56     uchar Layer_Index_45;
57     uchar RotationFlag;
58     bool IefBypass = true;
59     SamplerIndex Src_Sampler(MDF_FC_AVS_SI_Y);
60     SamplerIndex Src_Sampler1(MDF_FC_AVS_SI_U);
61     SamplerIndex Src_Sampler2(MDF_FC_AVS_SI_V);
62 
63     /*
64     AVS Sampler 16x4 write back buffer layout for R/V, G/Y, B/U channel, each box stands for 8x1 ushort write back pixel
65     16x4 pixle deviding to 8 8x1 pixel block
66     _________________________________________________
67     |_______Block0__________|_______Block1__________|
68     |_______Block2__________|_______Block3__________|
69     |_______Block4__________|_______Block5__________|
70     |_______Block6__________|_______Block7__________|
71 
72     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
73     _______________________________________________
74     |____R0_________R2_____|____R4_________R6_____|
75     |____G0_________G2_____|____G4_________G6_____|
76     |____B0_________B2_____|____B4_________B6_____|
77     |____A0_________A2_____|____A4_________A6_____|
78     |____R1_________R3_____|____R5_________R7_____|
79     |____G1_________G3_____|____G5_________G7_____|
80     |____B1_________B3_____|____B5_________B7_____|
81     |____A1_________A3_____|____A5_________A7_____|
82     */
83 #ifdef BUFFER_0
84 #ifdef ROTATE_90
85     StartX = Start_X(0);
86     StartY = Start_Y(0);
87     DeltaX = Delta_X(0);
88     DeltaY = Delta_Y(0);
89     Vertical_Block_Num = 0;
90 
91     StartX = StartX + DstY * DeltaX;
92 
93     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
94     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
95     {
96         StartY = StartY + DstX * DeltaY;
97     }
98     else
99     {
100         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
101     }
102 
103 #elif defined ROTATE_180
104     StartX = Start_X(0);
105     StartY = Start_Y(0);
106     DeltaX = Delta_X(0);
107     DeltaY = Delta_Y(0);
108     Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) >> 2)) & 15;
109 
110     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
111     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
112     {
113         StartX += DstX * DeltaX;
114     }
115     else
116     {
117         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
118     }
119 
120     StartY = StartY + ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) & 0xFFC3) * DeltaY;
121 #elif defined ROTATE_270
122     StartX = Start_X(0);
123     StartY = Start_Y(0);
124     DeltaX = Delta_X(0);
125     DeltaY = Delta_Y(0);
126     Vertical_Block_Num = 0;
127 
128     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) * DeltaX;
129 
130     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
131     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
132     {
133         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
134     }
135     else
136     {
137         StartY = StartY + DstX * DeltaY;
138     }
139 
140 #else
141     StartX = Start_X(0);
142     StartY = Start_Y(0);
143     DeltaX = Delta_X(0);
144     DeltaY = Delta_Y(0);
145     Vertical_Block_Num = (DstY >> 2) & 15;
146 
147     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
148     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
149     {
150         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
151     }
152     else
153     {
154         StartX += DstX * DeltaX;
155     }
156 
157     StartY = StartY + (DstY & 0xFFC3) * DeltaY;
158 #endif
159 #endif
160 
161 #ifdef BUFFER_1
162 #ifdef ROTATE_90
163     StartX = Start_X(0);
164     StartY = Start_Y(0);
165     DeltaX = Delta_X(0);
166     DeltaY = Delta_Y(0);
167     Vertical_Block_Num = 0;
168 
169     StartX = StartX + (DstY + 4) * DeltaX;
170     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
171 
172     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
173     {
174         StartY = StartY + DstX * DeltaY;
175     }
176     else
177     {
178         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
179     }
180 
181 #elif defined ROTATE_180
182     StartX = Start_X(0);
183     StartY = Start_Y(0);
184     DeltaX = Delta_X(0);
185     DeltaY = Delta_Y(0);
186     Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) >> 2)) & 15;
187 
188     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
189     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
190     {
191         StartX += DstX * DeltaX;
192     }
193     else
194     {
195         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
196     }
197     StartY = StartY + ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) & 0xFFC3) * DeltaY;
198 #elif defined ROTATE_270
199     StartX = Start_X(0);
200     StartY = Start_Y(0);
201     DeltaX = Delta_X(0);
202     DeltaY = Delta_Y(0);
203     Vertical_Block_Num = 0;
204 
205     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) * DeltaX;
206     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
207     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
208     {
209         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
210     }
211     else
212     {
213         StartY = StartY + DstX * DeltaY;
214     }
215 
216 #else
217     StartX = Start_X(0);
218     StartY = Start_Y(0);
219     DeltaX = Delta_X(0);
220     DeltaY = Delta_Y(0);
221     Vertical_Block_Num = ((DstY >> 2) & 15) + 1;
222 
223     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
224     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
225     {
226         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
227     }
228     else
229     {
230         StartX += DstX * DeltaX;
231     }
232     StartY = StartY + (DstY & 0xFFC3) * DeltaY;
233 #endif
234 #endif
235 
236 #ifdef BUFFER_2
237 #ifdef ROTATE_90
238     StartX = Start_X(0);
239     StartY = Start_Y(0);
240     DeltaX = Delta_X(0);
241     DeltaY = Delta_Y(0);
242     Vertical_Block_Num = 0;
243 
244     StartX = StartX + (DstY + 8) * DeltaX;
245     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
246 
247     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
248     {
249         StartY = StartY + DstX * DeltaY;
250     }
251     else
252     {
253         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
254     }
255 
256 #elif defined ROTATE_180
257     StartX = Start_X(0);
258     StartY = Start_Y(0);
259     DeltaX = Delta_X(0);
260     DeltaY = Delta_Y(0);
261     Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) >> 2)) & 15;
262 
263     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
264     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
265     {
266         StartX += DstX * DeltaX;
267     }
268     else
269     {
270         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
271     }
272     StartY = StartY + ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) & 0xFFC3) * DeltaY;
273 #elif defined ROTATE_270
274     StartX = Start_X(0);
275     StartY = Start_Y(0);
276     DeltaX = Delta_X(0);
277     DeltaY = Delta_Y(0);
278     Vertical_Block_Num = 0;
279 
280     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) * DeltaX;
281     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
282     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
283     {
284         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
285     }
286     else
287     {
288         StartY = StartY + DstX * DeltaY;
289     }
290 #else
291     StartX = Start_X(0);
292     StartY = Start_Y(0);
293     DeltaX = Delta_X(0);
294     DeltaY = Delta_Y(0);
295     Vertical_Block_Num = ((DstY >> 2) & 15) + 2;
296 
297     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
298     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
299     {
300         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
301     }
302     else
303     {
304         StartX += DstX * DeltaX;
305     }
306     StartY = StartY + (DstY & 0xFFC3) * DeltaY;
307 #endif
308 #endif
309 
310 #ifdef BUFFER_3
311 #ifdef ROTATE_90
312     StartX = Start_X(0);
313     StartY = Start_Y(0);
314     DeltaX = Delta_X(0);
315     DeltaY = Delta_Y(0);
316     Vertical_Block_Num = 0;
317 
318     StartX = StartX + (DstY + 12) * DeltaX;
319     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
320 
321     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
322     {
323         StartY = StartY + DstX * DeltaY;
324     }
325     else
326     {
327         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
328     }
329 
330 #elif defined ROTATE_180
331     StartX = Start_X(0);
332     StartY = Start_Y(0);
333     DeltaX = Delta_X(0);
334     DeltaY = Delta_Y(0);
335     Vertical_Block_Num = ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) >> 2) & 15;
336 
337     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
338     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
339     {
340         StartX += DstX * DeltaX;
341     }
342     else
343     {
344         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
345     }
346     StartY = StartY + ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) & 0xFFC3) * DeltaY;
347 #elif defined ROTATE_270
348     StartX = Start_X(0);
349     StartY = Start_Y(0);
350     DeltaX = Delta_X(0);
351     DeltaY = Delta_Y(0);
352     Vertical_Block_Num = 0;
353 
354     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) * DeltaX;
355     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
356     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
357     {
358         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
359     }
360     else
361     {
362         StartY = StartY + DstX * DeltaY;
363     }
364 #else
365     StartX = Start_X(0);
366     StartY = Start_Y(0);
367     DeltaX = Delta_X(0);
368     DeltaY = Delta_Y(0);
369     Vertical_Block_Num = ((DstY >> 2) & 15) + 3;
370 
371     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
372     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
373     {
374         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
375     }
376     else
377     {
378         StartX += DstX * DeltaX;
379     }
380     StartY = StartY + (DstY & 0xFFC3) * DeltaY;
381 #endif
382 #endif
383 
384 #ifdef BUFFER_4
385 #ifdef ROTATE_90
386     Layer_Index_45 = Layer_Index & 0x7f;
387     StartX = Start_X(Layer_Index_45);
388     StartY = Start_Y(Layer_Index_45);
389     DeltaX = Delta_X(Layer_Index_45);
390     DeltaY = Delta_Y(Layer_Index_45);
391     Vertical_Block_Num = 0;
392 
393     StartX = StartX + (DstY + 8 * (Layer_Index >> 7)) * DeltaX;
394     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
395 
396     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
397     {
398         StartY = StartY + DstX * DeltaY;
399     }
400     else
401     {
402         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
403     }
404 
405 #elif defined ROTATE_180
406     Layer_Index_45 = Layer_Index & 0x7f;
407     StartX = Start_X(Layer_Index_45);
408     StartY = Start_Y(Layer_Index_45);
409     DeltaX = Delta_X(Layer_Index_45);
410     DeltaY = Delta_Y(Layer_Index_45);
411     Vertical_Block_Num = ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) >> 2) & 15;
412 
413     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
414 
415     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
416     {
417         StartX += DstX * DeltaX;
418     }
419     else
420     {
421         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
422     }
423 
424     StartY = StartY + ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) & 0xFFC3) * DeltaY;
425 #elif defined ROTATE_270
426     Layer_Index_45 = Layer_Index & 0x7f;
427 
428     StartX = Start_X(Layer_Index_45);
429     StartY = Start_Y(Layer_Index_45);
430     DeltaX = Delta_X(Layer_Index_45);
431     DeltaY = Delta_Y(Layer_Index_45);
432     Vertical_Block_Num = 0;
433 
434     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) * DeltaX;
435     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
436     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
437     {
438         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
439     }
440     else
441     {
442         StartY = StartY + DstX * DeltaY;
443     }
444 #else
445     Layer_Index_45 = Layer_Index & 0x7f;
446     StartX = Start_X(Layer_Index_45);
447     StartY = Start_Y(Layer_Index_45);
448     DeltaX = Delta_X(Layer_Index_45);
449     DeltaY = Delta_Y(Layer_Index_45);
450     Vertical_Block_Num = ((DstY >> 2) & 15) + (2 * (Layer_Index >> 7));
451 
452     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
453     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
454     {
455         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
456     }
457     else
458     {
459         StartX += DstX * DeltaX;
460     }
461     StartY = StartY + (DstY & 0xFFC3) * DeltaY;
462 #endif
463 #endif
464 
465 #ifdef BUFFER_5
466 #ifdef ROTATE_90
467     Layer_Index_45 = Layer_Index & 0x7f;
468     StartX = Start_X(Layer_Index_45);
469     StartY = Start_Y(Layer_Index_45);
470     DeltaX = Delta_X(Layer_Index_45);
471     DeltaY = Delta_Y(Layer_Index_45);
472     Vertical_Block_Num = 0;
473 
474     StartX = StartX + (DstY + 8 * (Layer_Index >> 7) + 4) * DeltaX;
475     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
476 
477     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
478     {
479         StartY = StartY + DstX * DeltaY;
480     }
481     else
482     {
483         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
484     }
485 
486 #elif defined ROTATE_180
487     Layer_Index_45 = Layer_Index & 0x7f;
488     StartX = Start_X(Layer_Index_45);
489     StartY = Start_Y(Layer_Index_45);
490     DeltaX = Delta_X(Layer_Index_45);
491     DeltaY = Delta_Y(Layer_Index_45);
492     Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - 8 * (Layer_Index >> 7)) >> 2)) & 15;
493 
494     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
495 
496     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
497     {
498         StartX += DstX * DeltaX;
499     }
500     else
501     {
502         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
503     }
504 
505     StartY = StartY + ((Dst_Height - MDF_FC_BLOCK_HEIGHT + 8 - DstY - 8 * (Layer_Index >> 7)) & 0xFFC3) * DeltaY;
506 #elif defined ROTATE_270
507     Layer_Index_45 = Layer_Index & 0x7f;
508 
509     StartX = Start_X(Layer_Index_45);
510     StartY = Start_Y(Layer_Index_45);
511     DeltaX = Delta_X(Layer_Index_45);
512     DeltaY = Delta_Y(Layer_Index_45);
513     Vertical_Block_Num = 0;
514 
515     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - (8 * (Layer_Index >> 7))) * DeltaX;
516     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
517     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
518     {
519         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
520     }
521     else
522     {
523         StartY = StartY + DstX * DeltaY;
524     }
525 #else
526     Layer_Index_45 = Layer_Index & 0x7f;
527     StartX = Start_X(Layer_Index_45);
528     StartY = Start_Y(Layer_Index_45);
529     DeltaX = Delta_X(Layer_Index_45);
530     DeltaY = Delta_Y(Layer_Index_45);
531     Vertical_Block_Num = ((DstY >> 2) & 15) + (2 * (Layer_Index >> 7)) + 1;
532 
533     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
534 
535     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
536     {
537         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
538     }
539     else
540     {
541         StartX += DstX * DeltaX;
542     }
543     StartY = StartY + (DstY & 0xFFC3) * DeltaY;
544 #endif
545 #endif
546 
547 
548 #ifdef BUFFER_0
549 #define WriteBackBuffer DataBuffer0
550     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
551     cm_avs_sampler(
552         DataBuffer0.format<ushort, 8, 32>().select<2, 4, 32, 1>(1, 0),
553         CM_G_ENABLE,
554         Src_Surface,
555         Src_Sampler,
556         StartX,
557         StartY,
558         DeltaX,
559         DeltaY,
560         0,
561         0,
562         Vertical_Block_Num,
563         CM_16_FULL,
564         0,
565         CM_AVS_16x4,
566         IefBypass);
567 
568     SurfaceIndex Src_Surface1(MDF_FC_INPUT_BTI_START + MDF_FC_U_PLANE_BTI_OFFSET);
569     cm_avs_sampler(
570         DataBuffer0.format<ushort, 8, 32>().select<2, 4, 32, 1>(2, 0),
571         CM_R_ENABLE,
572         Src_Surface1,
573         Src_Sampler1,
574         StartX,
575         StartY,
576         DeltaX,
577         DeltaY,
578         0,
579         0,
580         Vertical_Block_Num,
581         CM_16_FULL,
582         0,
583         CM_AVS_16x4,
584         IefBypass);
585 
586     SurfaceIndex Src_Surface2(MDF_FC_INPUT_BTI_START + MDF_FC_V_PLANE_BTI_OFFSET);
587     cm_avs_sampler(
588         DataBuffer0.format<ushort, 8, 32>().select<2, 4, 32, 1>(0, 0),
589         CM_R_ENABLE,
590         Src_Surface2,
591         Src_Sampler2,
592         StartX,
593         StartY,
594         DeltaX,
595         DeltaY,
596         0,
597         0,
598         Vertical_Block_Num,
599         CM_16_FULL,
600         0,
601         CM_AVS_16x4,
602         IefBypass);
603 
604 #endif
605 #ifdef BUFFER_1
606 #define WriteBackBuffer DataBuffer1
607     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
608     cm_avs_sampler(
609         DataBuffer1.format<ushort, 8, 32>().select<2, 4, 32, 1>(1, 0),
610         CM_G_ENABLE,
611         Src_Surface,
612         Src_Sampler,
613         StartX,
614         StartY,
615         DeltaX,
616         DeltaY,
617         0,
618         0,
619         Vertical_Block_Num,
620         CM_16_FULL,
621         0,
622         CM_AVS_16x4,
623         IefBypass);
624 
625     SurfaceIndex Src_Surface1(MDF_FC_INPUT_BTI_START + MDF_FC_U_PLANE_BTI_OFFSET);
626     cm_avs_sampler(
627         DataBuffer1.format<ushort, 8, 32>().select<2, 4, 32, 1>(2, 0),
628         CM_R_ENABLE,
629         Src_Surface1,
630         Src_Sampler1,
631         StartX,
632         StartY,
633         DeltaX,
634         DeltaY,
635         0,
636         0,
637         Vertical_Block_Num,
638         CM_16_FULL,
639         0,
640         CM_AVS_16x4,
641         IefBypass);
642 
643     SurfaceIndex Src_Surface2(MDF_FC_INPUT_BTI_START + MDF_FC_V_PLANE_BTI_OFFSET);
644     cm_avs_sampler(
645         DataBuffer1.format<ushort, 8, 32>().select<2, 4, 32, 1>(0, 0),
646         CM_R_ENABLE,
647         Src_Surface2,
648         Src_Sampler2,
649         StartX,
650         StartY,
651         DeltaX,
652         DeltaY,
653         0,
654         0,
655         Vertical_Block_Num,
656         CM_16_FULL,
657         0,
658         CM_AVS_16x4,
659         IefBypass);
660 
661 #endif
662 #ifdef BUFFER_2
663 #define WriteBackBuffer DataBuffer2
664     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
665     cm_avs_sampler(
666         DataBuffer2.format<ushort, 8, 32>().select<2, 4, 32, 1>(1, 0),
667         CM_G_ENABLE,
668         Src_Surface,
669         Src_Sampler,
670         StartX,
671         StartY,
672         DeltaX,
673         DeltaY,
674         0,
675         0,
676         Vertical_Block_Num,
677         CM_16_FULL,
678         0,
679         CM_AVS_16x4,
680         IefBypass);
681 
682     SurfaceIndex Src_Surface1(MDF_FC_INPUT_BTI_START + MDF_FC_U_PLANE_BTI_OFFSET);
683     cm_avs_sampler(
684         DataBuffer2.format<ushort, 8, 32>().select<2, 4, 32, 1>(2, 0),
685         CM_R_ENABLE,
686         Src_Surface1,
687         Src_Sampler1,
688         StartX,
689         StartY,
690         DeltaX,
691         DeltaY,
692         0,
693         0,
694         Vertical_Block_Num,
695         CM_16_FULL,
696         0,
697         CM_AVS_16x4,
698         IefBypass);
699 
700     SurfaceIndex Src_Surface2(MDF_FC_INPUT_BTI_START + MDF_FC_V_PLANE_BTI_OFFSET);
701     cm_avs_sampler(
702         DataBuffer2.format<ushort, 8, 32>().select<2, 4, 32, 1>(0, 0),
703         CM_R_ENABLE,
704         Src_Surface2,
705         Src_Sampler2,
706         StartX,
707         StartY,
708         DeltaX,
709         DeltaY,
710         0,
711         0,
712         Vertical_Block_Num,
713         CM_16_FULL,
714         0,
715         CM_AVS_16x4,
716         IefBypass);
717 
718 #endif
719 #ifdef BUFFER_3
720 #define WriteBackBuffer DataBuffer3
721     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
722     cm_avs_sampler(
723         DataBuffer3.format<ushort, 8, 32>().select<2, 4, 32, 1>(1, 0),
724         CM_G_ENABLE,
725         Src_Surface,
726         Src_Sampler,
727         StartX,
728         StartY,
729         DeltaX,
730         DeltaY,
731         0,
732         0,
733         Vertical_Block_Num,
734         CM_16_FULL,
735         0,
736         CM_AVS_16x4,
737         IefBypass);
738 
739     SurfaceIndex Src_Surface1(MDF_FC_INPUT_BTI_START + MDF_FC_U_PLANE_BTI_OFFSET);
740     cm_avs_sampler(
741         DataBuffer3.format<ushort, 8, 32>().select<2, 4, 32, 1>(2, 0),
742         CM_R_ENABLE,
743         Src_Surface1,
744         Src_Sampler1,
745         StartX,
746         StartY,
747         DeltaX,
748         DeltaY,
749         0,
750         0,
751         Vertical_Block_Num,
752         CM_16_FULL,
753         0,
754         CM_AVS_16x4,
755         IefBypass);
756 
757     SurfaceIndex Src_Surface2(MDF_FC_INPUT_BTI_START + MDF_FC_V_PLANE_BTI_OFFSET);
758     cm_avs_sampler(
759         DataBuffer3.format<ushort, 8, 32>().select<2, 4, 32, 1>(0, 0),
760         CM_R_ENABLE,
761         Src_Surface2,
762         Src_Sampler2,
763         StartX,
764         StartY,
765         DeltaX,
766         DeltaY,
767         0,
768         0,
769         Vertical_Block_Num,
770         CM_16_FULL,
771         0,
772         CM_AVS_16x4,
773         IefBypass);
774 
775 #endif
776 #ifdef BUFFER_4
777 #define WriteBackBuffer DataBuffer4
778     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45);
779 
780     cm_avs_sampler(
781         DataBuffer4.format<ushort, 8, 32>().select<2, 4, 32, 1>(1, 0),
782         CM_G_ENABLE,
783         Src_Surface,
784         Src_Sampler,
785         StartX,
786         StartY,
787         DeltaX,
788         DeltaY,
789         0,
790         0,
791         Vertical_Block_Num,
792         CM_16_FULL,
793         0,
794         CM_AVS_16x4,
795         IefBypass);
796 
797     SurfaceIndex Src_Surface1(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45 + MDF_FC_U_PLANE_BTI_OFFSET);
798     cm_avs_sampler(
799         DataBuffer4.format<ushort, 8, 32>().select<2, 4, 32, 1>(2, 0),
800         CM_R_ENABLE,
801         Src_Surface1,
802         Src_Sampler1,
803         StartX,
804         StartY,
805         DeltaX,
806         DeltaY,
807         0,
808         0,
809         Vertical_Block_Num,
810         CM_16_FULL,
811         0,
812         CM_AVS_16x4,
813         IefBypass);
814 
815     SurfaceIndex Src_Surface2(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45 + MDF_FC_V_PLANE_BTI_OFFSET);
816     cm_avs_sampler(
817         DataBuffer4.format<ushort, 8, 32>().select<2, 4, 32, 1>(0, 0),
818         CM_R_ENABLE,
819         Src_Surface2,
820         Src_Sampler2,
821         StartX,
822         StartY,
823         DeltaX,
824         DeltaY,
825         0,
826         0,
827         Vertical_Block_Num,
828         CM_16_FULL,
829         0,
830         CM_AVS_16x4,
831         IefBypass);
832 
833 #endif
834 #ifdef BUFFER_5
835 #define WriteBackBuffer DataBuffer5
836     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45);
837 
838     cm_avs_sampler(
839         DataBuffer5.format<ushort, 8, 32>().select<2, 4, 32, 1>(1, 0),
840         CM_G_ENABLE,
841         Src_Surface,
842         Src_Sampler,
843         StartX,
844         StartY,
845         DeltaX,
846         DeltaY,
847         0,
848         0,
849         Vertical_Block_Num,
850         CM_16_FULL,
851         0,
852         CM_AVS_16x4,
853         IefBypass);
854 
855     SurfaceIndex Src_Surface1(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45 + MDF_FC_U_PLANE_BTI_OFFSET);
856     cm_avs_sampler(
857         DataBuffer5.format<ushort, 8, 32>().select<2, 4, 32, 1>(2, 0),
858         CM_R_ENABLE,
859         Src_Surface1,
860         Src_Sampler1,
861         StartX,
862         StartY,
863         DeltaX,
864         DeltaY,
865         0,
866         0,
867         Vertical_Block_Num,
868         CM_16_FULL,
869         0,
870         CM_AVS_16x4,
871         IefBypass);
872 
873     SurfaceIndex Src_Surface2(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45 + MDF_FC_V_PLANE_BTI_OFFSET);
874     cm_avs_sampler(
875         DataBuffer5.format<ushort, 8, 32>().select<2, 4, 32, 1>(0, 0),
876         CM_R_ENABLE,
877         Src_Surface2,
878         Src_Sampler2,
879         StartX,
880         StartY,
881         DeltaX,
882         DeltaY,
883         0,
884         0,
885         Vertical_Block_Num,
886         CM_16_FULL,
887         0,
888         CM_AVS_16x4,
889         IefBypass);
890 
891 #endif
892 
893 
894     // Shuffle the write back of sampler
895     /*
896     Buffer layout after shuffle
897     _________________________________________________
898     |_______Block0__________|_______Block1__________|
899     |_______Block2__________|_______Block3__________|
900     |_______Block4__________|_______Block5__________|
901     |_______Block6__________|_______Block7__________|
902 
903     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
904     _______________________________________________
905     |____R0_________R1_____|____R2_________R3_____|
906     |____G0_________G1_____|____G2_________G3_____|
907     |____B0_________B1_____|____B2_________B3_____|
908     |____A0_________A1_____|____A2_________A3_____|
909     |____R4_________R5_____|____R6_________R7_____|
910     |____G4_________G5_____|____G6_________G7_____|
911     |____B4_________B5_____|____B6_________B7_____|
912     |____A4_________A5_____|____A6_________A7_____|
913     */
914 
915     WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(6, 0) = 0xffff;
916     WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(14, 0) = 0xffff;
917 
918 #undef WriteBackBuffer
919 }