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     // AVS Y
52     {
53         float StartX;
54         float StartY;
55         float DeltaX;
56         float DeltaY;
57         uint Vertical_Block_Num;
58         uchar Layer_Index_45;
59         uchar RotationFlag;
60         bool IefBypass = true;
61         int TempOffset;
62         SamplerIndex Src_Sampler(MDF_FC_AVS_SI_Y);
63         matrix<ushort, 4, 16> sampler_temp;
64 
65         /*
66         AVS Sampler 16x4 write back buffer layout for R/V, G/Y, B/U channel, each box stands for 8x1 ushort write back pixel
67         16x4 pixle deviding to 8 8x1 pixel block
68         _________________________________________________
69         |_______Block0__________|_______Block1__________|
70         |_______Block2__________|_______Block3__________|
71         |_______Block4__________|_______Block5__________|
72         |_______Block6__________|_______Block7__________|
73 
74         Write back buffer layout correlate to the block number#, each box stands for 1 GRF
75         _______________________________________________
76         |____R0_________R2_____|____R4_________R6_____|
77         |____G0_________G2_____|____G4_________G6_____|
78         |____B0_________B2_____|____B4_________B6_____|
79         |____A0_________A2_____|____A4_________A6_____|
80         |____R1_________R3_____|____R5_________R7_____|
81         |____G1_________G3_____|____G5_________G7_____|
82         |____B1_________B3_____|____B5_________B7_____|
83         |____A1_________A3_____|____A5_________A7_____|
84         */
85 
86 #ifdef BUFFER_0
87 #ifdef ROTATE_90
88         StartX = Start_X(0);
89         StartY = Start_Y(0);
90         DeltaX = Delta_X(0);
91         DeltaY = Delta_Y(0);
92         Vertical_Block_Num = 0;
93 
94         StartX = StartX + DstY * DeltaX;
95 
96         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
97         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
98         {
99             StartY = StartY + DstX * DeltaY;
100         }
101         else
102         {
103             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
104         }
105 
106 #elif defined ROTATE_180
107         StartX = Start_X(0);
108         StartY = Start_Y(0);
109         DeltaX = Delta_X(0);
110         DeltaY = Delta_Y(0);
111         Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) >> 2)) & 15;
112 
113         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
114         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
115         {
116             StartX += DstX * DeltaX;
117         }
118         else
119         {
120             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
121         }
122 
123         TempOffset = Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12;
124         TempOffset &= 0xFFFFFFC3;
125         StartY = StartY + TempOffset * DeltaY;
126 #elif defined ROTATE_270
127         StartX = Start_X(0);
128         StartY = Start_Y(0);
129         DeltaX = Delta_X(0);
130         DeltaY = Delta_Y(0);
131         Vertical_Block_Num = 0;
132 
133         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) * DeltaX;
134 
135         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
136         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
137         {
138             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
139         }
140         else
141         {
142             StartY = StartY + DstX * DeltaY;
143     }
144 
145 #else
146         StartX = Start_X(0);
147         StartY = Start_Y(0);
148         DeltaX = Delta_X(0);
149         DeltaY = Delta_Y(0);
150         Vertical_Block_Num = (DstY >> 2) & 15;
151 
152         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
153         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
154         {
155             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
156         }
157         else
158         {
159             StartX += DstX * DeltaX;
160         }
161 
162         StartY = StartY + (DstY & 0xFFC3) * DeltaY;
163 #endif
164 #endif
165 
166 #ifdef BUFFER_1
167 #ifdef ROTATE_90
168         StartX = Start_X(0);
169         StartY = Start_Y(0);
170         DeltaX = Delta_X(0);
171         DeltaY = Delta_Y(0);
172         Vertical_Block_Num = 0;
173 
174         StartX = StartX + (DstY + 4) * DeltaX;
175         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
176 
177         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
178         {
179             StartY = StartY + DstX * DeltaY;
180         }
181         else
182         {
183             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
184         }
185 
186 #elif defined ROTATE_180
187         StartX = Start_X(0);
188         StartY = Start_Y(0);
189         DeltaX = Delta_X(0);
190         DeltaY = Delta_Y(0);
191         Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) >> 2)) & 15;
192 
193         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
194         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
195         {
196             StartX += DstX * DeltaX;
197         }
198         else
199         {
200             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
201         }
202 
203         TempOffset = Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8;
204         TempOffset &= 0xFFFFFFC3;
205         StartY = StartY + TempOffset * DeltaY;
206 #elif defined ROTATE_270
207         StartX = Start_X(0);
208         StartY = Start_Y(0);
209         DeltaX = Delta_X(0);
210         DeltaY = Delta_Y(0);
211         Vertical_Block_Num = 0;
212 
213         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) * DeltaX;
214         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
215         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
216         {
217             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
218         }
219         else
220         {
221             StartY = StartY + DstX * DeltaY;
222         }
223 
224 #else
225         StartX = Start_X(0);
226         StartY = Start_Y(0);
227         DeltaX = Delta_X(0);
228         DeltaY = Delta_Y(0);
229         Vertical_Block_Num = ((DstY >> 2) & 15) + 1;
230 
231         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
232         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
233         {
234             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
235         }
236         else
237         {
238             StartX += DstX * DeltaX;
239         }
240         StartY = StartY + (DstY & 0xFFC3) * DeltaY;
241 #endif
242 #endif
243 
244 #ifdef BUFFER_2
245 #ifdef ROTATE_90
246         StartX = Start_X(0);
247         StartY = Start_Y(0);
248         DeltaX = Delta_X(0);
249         DeltaY = Delta_Y(0);
250         Vertical_Block_Num = 0;
251 
252         StartX = StartX + (DstY + 8) * DeltaX;
253         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
254 
255         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
256         {
257             StartY = StartY + DstX * DeltaY;
258         }
259         else
260         {
261             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
262         }
263 
264 #elif defined ROTATE_180
265         StartX = Start_X(0);
266         StartY = Start_Y(0);
267         DeltaX = Delta_X(0);
268         DeltaY = Delta_Y(0);
269         Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) >> 2)) & 15;
270 
271         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
272         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
273         {
274             StartX += DstX * DeltaX;
275         }
276         else
277         {
278             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
279         }
280 
281         TempOffset = Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4;
282         TempOffset &= 0xFFFFFFC3;
283         StartY = StartY + TempOffset * DeltaY;
284 #elif defined ROTATE_270
285         StartX = Start_X(0);
286         StartY = Start_Y(0);
287         DeltaX = Delta_X(0);
288         DeltaY = Delta_Y(0);
289         Vertical_Block_Num = 0;
290 
291         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) * DeltaX;
292         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
293         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
294         {
295             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
296         }
297         else
298         {
299             StartY = StartY + DstX * DeltaY;
300         }
301 #else
302         StartX = Start_X(0);
303         StartY = Start_Y(0);
304         DeltaX = Delta_X(0);
305         DeltaY = Delta_Y(0);
306         Vertical_Block_Num = ((DstY >> 2) & 15) + 2;
307 
308         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
309         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
310         {
311             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
312         }
313         else
314         {
315             StartX += DstX * DeltaX;
316         }
317         StartY = StartY + (DstY & 0xFFC3) * DeltaY;
318 #endif
319 #endif
320 
321 #ifdef BUFFER_3
322 #ifdef ROTATE_90
323         StartX = Start_X(0);
324         StartY = Start_Y(0);
325         DeltaX = Delta_X(0);
326         DeltaY = Delta_Y(0);
327         Vertical_Block_Num = 0;
328 
329         StartX = StartX + (DstY + 12) * DeltaX;
330         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
331 
332         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
333         {
334             StartY = StartY + DstX * DeltaY;
335         }
336         else
337         {
338             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
339         }
340 
341 #elif defined ROTATE_180
342         StartX = Start_X(0);
343         StartY = Start_Y(0);
344         DeltaX = Delta_X(0);
345         DeltaY = Delta_Y(0);
346         Vertical_Block_Num = ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) >> 2) & 15;
347 
348         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
349         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
350         {
351             StartX += DstX * DeltaX;
352         }
353         else
354         {
355             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
356         }
357 
358         TempOffset = Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY;
359         TempOffset &= 0xFFFFFFC3;
360         StartY = StartY + TempOffset * DeltaY;
361 #elif defined ROTATE_270
362         StartX = Start_X(0);
363         StartY = Start_Y(0);
364         DeltaX = Delta_X(0);
365         DeltaY = Delta_Y(0);
366         Vertical_Block_Num = 0;
367 
368         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) * DeltaX;
369         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
370         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
371         {
372             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
373         }
374         else
375         {
376             StartY = StartY + DstX * DeltaY;
377         }
378 #else
379         StartX = Start_X(0);
380         StartY = Start_Y(0);
381         DeltaX = Delta_X(0);
382         DeltaY = Delta_Y(0);
383         Vertical_Block_Num = ((DstY >> 2) & 15) + 3;
384 
385         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
386         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
387         {
388             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
389         }
390         else
391         {
392             StartX += DstX * DeltaX;
393         }
394         StartY = StartY + (DstY & 0xFFC3) * DeltaY;
395 #endif
396 #endif
397 
398 #ifdef BUFFER_4
399 #ifdef ROTATE_90
400         Layer_Index_45 = Layer_Index & 0x7f;
401         StartX = Start_X(Layer_Index_45);
402         StartY = Start_Y(Layer_Index_45);
403         DeltaX = Delta_X(Layer_Index_45);
404         DeltaY = Delta_Y(Layer_Index_45);
405         Vertical_Block_Num = 0;
406 
407         StartX = StartX + (DstY + 8 * (Layer_Index >> 7)) * DeltaX;
408         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
409 
410         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
411         {
412             StartY = StartY + DstX * DeltaY;
413         }
414         else
415         {
416             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
417         }
418 
419 #elif defined ROTATE_180
420         Layer_Index_45 = Layer_Index & 0x7f;
421         StartX = Start_X(Layer_Index_45);
422         StartY = Start_Y(Layer_Index_45);
423         DeltaX = Delta_X(Layer_Index_45);
424         DeltaY = Delta_Y(Layer_Index_45);
425         Vertical_Block_Num = ((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) >> 2) & 15;
426 
427         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
428 
429         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
430         {
431             StartX += DstX * DeltaX;
432         }
433         else
434         {
435             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
436         }
437 
438         TempOffset = Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7);
439         TempOffset &= 0xFFFFFFC3;
440         StartY = StartY + TempOffset * DeltaY;
441 #elif defined ROTATE_270
442         Layer_Index_45 = Layer_Index & 0x7f;
443 
444         StartX = Start_X(Layer_Index_45);
445         StartY = Start_Y(Layer_Index_45);
446         DeltaX = Delta_X(Layer_Index_45);
447         DeltaY = Delta_Y(Layer_Index_45);
448         Vertical_Block_Num = 0;
449 
450         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) * DeltaX;
451         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
452         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
453         {
454             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
455         }
456         else
457         {
458             StartY = StartY + DstX * DeltaY;
459         }
460 #else
461         Layer_Index_45 = Layer_Index & 0x7f;
462         StartX = Start_X(Layer_Index_45);
463         StartY = Start_Y(Layer_Index_45);
464         DeltaX = Delta_X(Layer_Index_45);
465         DeltaY = Delta_Y(Layer_Index_45);
466         Vertical_Block_Num = ((DstY >> 2) & 15) + (2 * (Layer_Index >> 7));
467 
468         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
469         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
470         {
471             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
472         }
473         else
474         {
475             StartX += DstX * DeltaX;
476         }
477         StartY = StartY + (DstY & 0xFFC3) * DeltaY;
478 #endif
479 #endif
480 
481 #ifdef BUFFER_5
482 #ifdef ROTATE_90
483         Layer_Index_45 = Layer_Index & 0x7f;
484         StartX = Start_X(Layer_Index_45);
485         StartY = Start_Y(Layer_Index_45);
486         DeltaX = Delta_X(Layer_Index_45);
487         DeltaY = Delta_Y(Layer_Index_45);
488         Vertical_Block_Num = 0;
489 
490         StartX = StartX + (DstY + 8 * (Layer_Index >> 7) + 4) * DeltaX;
491         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
492 
493         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
494         {
495             StartY = StartY + DstX * DeltaY;
496         }
497         else
498         {
499             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
500         }
501 
502 #elif defined ROTATE_180
503         Layer_Index_45 = Layer_Index & 0x7f;
504         StartX = Start_X(Layer_Index_45);
505         StartY = Start_Y(Layer_Index_45);
506         DeltaX = Delta_X(Layer_Index_45);
507         DeltaY = Delta_Y(Layer_Index_45);
508         Vertical_Block_Num = (((Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - 8 * (Layer_Index >> 7)) >> 2)) & 15;
509 
510         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
511 
512         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
513         {
514             StartX += DstX * DeltaX;
515         }
516         else
517         {
518             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
519         }
520         TempOffset = Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - 8 * (Layer_Index >> 7);
521         TempOffset &= 0xFFFFFFC3;
522         StartY = StartY + TempOffset * DeltaY;
523 #elif defined ROTATE_270
524         Layer_Index_45 = Layer_Index & 0x7f;
525 
526         StartX = Start_X(Layer_Index_45);
527         StartY = Start_Y(Layer_Index_45);
528         DeltaX = Delta_X(Layer_Index_45);
529         DeltaY = Delta_Y(Layer_Index_45);
530         Vertical_Block_Num = 0;
531 
532         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - (8 * (Layer_Index >> 7))) * DeltaX;
533         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
534         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
535         {
536             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
537         }
538         else
539         {
540             StartY = StartY + DstX * DeltaY;
541         }
542 #else
543         Layer_Index_45 = Layer_Index & 0x7f;
544         StartX = Start_X(Layer_Index_45);
545         StartY = Start_Y(Layer_Index_45);
546         DeltaX = Delta_X(Layer_Index_45);
547         DeltaY = Delta_Y(Layer_Index_45);
548         Vertical_Block_Num = ((DstY >> 2) & 15) + (2 * (Layer_Index >> 7)) + 1;
549 
550         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
551 
552         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
553         {
554             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
555         }
556         else
557         {
558             StartX += DstX * DeltaX;
559         }
560         StartY = StartY + (DstY & 0xFFC3) * DeltaY;
561 #endif
562 #endif
563 
564 
565 #ifdef BUFFER_0
566 #define WriteBackBuffer DataBuffer0
567         SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
568         cm_avs_sampler(
569             sampler_temp,
570             CM_R_ENABLE,
571             Src_Surface,
572             Src_Sampler,
573             StartX,
574             StartY,
575             DeltaX,
576             DeltaY,
577             0,
578             0,
579             Vertical_Block_Num,
580             CM_16_FULL,
581             0,
582             CM_AVS_16x4,
583             IefBypass);
584 
585 #endif
586 #ifdef BUFFER_1
587 #define WriteBackBuffer DataBuffer1
588         SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
589         cm_avs_sampler(
590             sampler_temp,
591             CM_R_ENABLE,
592             Src_Surface,
593             Src_Sampler,
594             StartX,
595             StartY,
596             DeltaX,
597             DeltaY,
598             0,
599             0,
600             Vertical_Block_Num,
601             CM_16_FULL,
602             0,
603             CM_AVS_16x4,
604             IefBypass);
605 
606 #endif
607 #ifdef BUFFER_2
608 #define WriteBackBuffer DataBuffer2
609         SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
610         cm_avs_sampler(
611             sampler_temp,
612             CM_R_ENABLE,
613             Src_Surface,
614             Src_Sampler,
615             StartX,
616             StartY,
617             DeltaX,
618             DeltaY,
619             0,
620             0,
621             Vertical_Block_Num,
622             CM_16_FULL,
623             0,
624             CM_AVS_16x4,
625             IefBypass);
626 
627 #endif
628 #ifdef BUFFER_3
629 #define WriteBackBuffer DataBuffer3
630         SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
631         cm_avs_sampler(
632             sampler_temp,
633             CM_R_ENABLE,
634             Src_Surface,
635             Src_Sampler,
636             StartX,
637             StartY,
638             DeltaX,
639             DeltaY,
640             0,
641             0,
642             Vertical_Block_Num,
643             CM_16_FULL,
644             0,
645             CM_AVS_16x4,
646             IefBypass);
647 
648 #endif
649 #ifdef BUFFER_4
650 #define WriteBackBuffer DataBuffer4
651         SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45);
652 
653         cm_avs_sampler(
654             sampler_temp,
655             CM_R_ENABLE,
656             Src_Surface,
657             Src_Sampler,
658             StartX,
659             StartY,
660             DeltaX,
661             DeltaY,
662             0,
663             0,
664             Vertical_Block_Num,
665             CM_16_FULL,
666             0,
667             CM_AVS_16x4,
668             IefBypass);
669 
670 #endif
671 #ifdef BUFFER_5
672 #define WriteBackBuffer DataBuffer5
673         SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45);
674 
675         cm_avs_sampler(
676             sampler_temp,
677             CM_R_ENABLE,
678             Src_Surface,
679             Src_Sampler,
680             StartX,
681             StartY,
682             DeltaX,
683             DeltaY,
684             0,
685             0,
686             Vertical_Block_Num,
687             CM_16_FULL,
688             0,
689             CM_AVS_16x4,
690             IefBypass);
691 
692 #endif
693 
694         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(2, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
695         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(10, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
696     }
697 
698     // sampler unorm uv
699     {
700         float StartX;
701         float StartY;
702         float StartX1;
703         float StartY1;
704         float DeltaX;
705         float DeltaY;
706         uchar RotationFlag;
707         matrix<ushort, 4, 16> sampler_temp;
708 
709         /*
710         AVS Sampler 16x4 write back buffer layout for R/V, G/Y, B/U channel, each box stands for 8x1 ushort write back pixel
711         16x4 pixle deviding to 8 8x1 pixel block
712         _________________________________________________
713         |_______Block0__________|_______Block1__________|
714         |_______Block2__________|_______Block3__________|
715         |_______Block4__________|_______Block5__________|
716         |_______Block6__________|_______Block7__________|
717 
718         Write back buffer layout correlate to the block number#, each box stands for 1 GRF
719         _______________________________________________
720         |____R0_________R2_____|____R4_________R6_____|
721         |____G0_________G2_____|____G4_________G6_____|
722         |____B0_________B2_____|____B4_________B6_____|
723         |____A0_________A2_____|____A4_________A6_____|
724         |____R1_________R3_____|____R5_________R7_____|
725         |____G1_________G3_____|____G5_________G7_____|
726         |____B1_________B3_____|____B5_________B7_____|
727         |____A1_________A3_____|____A5_________A7_____|
728         */
729         matrix <float, 2, 8> mesg;
730         mesg.select<1, 1, 8, 1>(0, 0).format<uint>() = cm_get_r0<uint>();
731         mesg.select<1, 1, 8, 1>(1, 0).format<uint>() = cm_get_r0<uint>();
732         uint desc_y;
733         uchar Layer_Index_45;
734 
735 #ifdef BUFFER_0
736 #ifdef ROTATE_90
737         StartX = Start_X(0);
738         StartY = Start_Y(0);
739         DeltaX = Delta_X(0);
740         DeltaY = Delta_Y(0);
741         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
742 
743         StartX = StartX + DstY * DeltaX;
744 
745         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
746         {
747             StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
748         }
749         else
750         {
751             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
752         }
753 
754         StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
755 
756         //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
757 
758         StartX1 = StartX;
759 #elif defined ROTATE_180
760         StartX = Start_X(0);
761         StartY = Start_Y(0);
762         DeltaX = Delta_X(0);
763         DeltaY = Delta_Y(0);
764 
765         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
766         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
767         {
768             StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
769             StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
770         }
771         else
772         {
773             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
774             StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
775         }
776 
777         //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
778         StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) * DeltaY;
779 
780         StartY1 = StartY;
781 #elif defined ROTATE_270
782         StartX = Start_X(0);
783         StartY = Start_Y(0);
784         DeltaX = Delta_X(0);
785         DeltaY = Delta_Y(0);
786 
787         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
788 
789         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) * DeltaX;
790         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
791         {
792             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
793         }
794         else
795         {
796             StartY = StartY + DstX * DeltaY;
797         }
798 
799         StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
800         //StartY = StartY + DstX * DeltaY;
801         StartX1 = StartX;
802 #else
803         StartX = Start_X(0);
804         StartY = Start_Y(0);
805         DeltaX = Delta_X(0);
806         DeltaY = Delta_Y(0);
807 
808         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
809         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
810         {
811             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
812         }
813         else
814         {
815             StartX += DstX * DeltaX;
816         }
817 
818         StartX1 = StartX + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
819 
820         StartY += DstY * DeltaY;
821         StartY1 = StartY;
822 #endif
823 #endif
824 
825 #ifdef BUFFER_1
826 #ifdef ROTATE_90
827         StartX = Start_X(0);
828         StartY = Start_Y(0);
829         DeltaX = Delta_X(0);
830         DeltaY = Delta_Y(0);
831 
832         StartX = StartX + (DstY + 4) * DeltaX;
833         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
834 
835         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
836         {
837             StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
838         }
839         else
840         {
841             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
842         }
843 
844         //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
845 
846         StartX1 = StartX;
847         StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
848 
849 #elif defined ROTATE_180
850         StartX = Start_X(0);
851         StartY = Start_Y(0);
852         DeltaX = Delta_X(0);
853         DeltaY = Delta_Y(0);
854 
855         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
856         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
857         {
858             StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
859             StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
860         }
861         else
862         {
863             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
864             StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
865         }
866 
867         //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
868         StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) * DeltaY;
869 
870         //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
871         StartY1 = StartY;
872 
873 #elif defined ROTATE_270
874         StartX = Start_X(0);
875         StartY = Start_Y(0);
876         DeltaX = Delta_X(0);
877         DeltaY = Delta_Y(0);
878 
879         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
880 
881         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) * DeltaX;
882 
883         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
884         {
885             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
886         }
887         else
888         {
889             StartY = StartY + DstX * DeltaY;
890         }
891 
892         //StartY = StartY + DstX * DeltaY;
893 
894         StartX1 = StartX;
895         StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
896 #else
897         StartX = Start_X(0);
898         StartY = Start_Y(0);
899         DeltaX = Delta_X(0);
900         DeltaY = Delta_Y(0);
901         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
902         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
903         {
904             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
905         }
906         else
907         {
908             StartX += DstX * DeltaX;
909         }
910         //StartX += DstX * DeltaX;
911         StartY += (DstY + MDF_FC_SAMPLER_UNORM_HEIGHT)* DeltaY;
912 
913         StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
914         StartY1 = StartY;
915 #endif
916 #endif
917 
918 #ifdef BUFFER_2
919 #ifdef ROTATE_90
920         StartX = Start_X(0);
921         StartY = Start_Y(0);
922         DeltaX = Delta_X(0);
923         DeltaY = Delta_Y(0);
924 
925         StartX = StartX + (DstY + 8) * DeltaX;
926         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
927 
928         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
929         {
930             StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
931         }
932         else
933         {
934             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
935         }
936 
937         //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
938 
939         StartX1 = StartX;
940         StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
941 
942 #elif defined ROTATE_180
943         StartX = Start_X(0);
944         StartY = Start_Y(0);
945         DeltaX = Delta_X(0);
946         DeltaY = Delta_Y(0);
947 
948         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
949         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
950         {
951             StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
952             StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
953         }
954         else
955         {
956             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
957             StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
958         }
959 
960         //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
961         StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) * DeltaY;
962 
963         //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
964         StartY1 = StartY;
965 #elif defined ROTATE_270
966         StartX = Start_X(0);
967         StartY = Start_Y(0);
968         DeltaX = Delta_X(0);
969         DeltaY = Delta_Y(0);
970 
971         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
972 
973         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) * DeltaX;
974         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
975         {
976             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
977         }
978         else
979         {
980             StartY = StartY + DstX * DeltaY;
981         }
982 
983         //StartY = StartY + DstX * DeltaY;
984 
985         StartX1 = StartX;
986         StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
987 #else
988         StartX = Start_X(0);
989         StartY = Start_Y(0);
990         DeltaX = Delta_X(0);
991         DeltaY = Delta_Y(0);
992         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
993         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
994         {
995             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
996         }
997         else
998         {
999             StartX += DstX * DeltaX;
1000         }
1001         //StartX += DstX * DeltaX;
1002         StartY += (DstY + 2 * MDF_FC_SAMPLER_UNORM_HEIGHT)* DeltaY;
1003         StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1004         StartY1 = StartY;
1005 #endif
1006 #endif
1007 
1008 #ifdef BUFFER_3
1009 #ifdef ROTATE_90
1010         StartX = Start_X(0);
1011         StartY = Start_Y(0);
1012         DeltaX = Delta_X(0);
1013         DeltaY = Delta_Y(0);
1014 
1015         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
1016         StartX = StartX + (DstY + 12) * DeltaX;
1017 
1018         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
1019         {
1020             StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
1021         }
1022         else
1023         {
1024             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
1025         }
1026 
1027         //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
1028 
1029         StartX1 = StartX;
1030         StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
1031 
1032 #elif defined ROTATE_180
1033         StartX = Start_X(0);
1034         StartY = Start_Y(0);
1035         DeltaX = Delta_X(0);
1036         DeltaY = Delta_Y(0);
1037 
1038         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
1039         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
1040         {
1041             StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
1042             StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
1043         }
1044         else
1045         {
1046             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
1047             StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1048         }
1049         //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
1050         StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) * DeltaY;
1051 
1052         //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1053         StartY1 = StartY;
1054 #elif defined ROTATE_270
1055         StartX = Start_X(0);
1056         StartY = Start_Y(0);
1057         DeltaX = Delta_X(0);
1058         DeltaY = Delta_Y(0);
1059 
1060         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
1061 
1062         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) * DeltaX;
1063         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
1064         {
1065             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
1066         }
1067         else
1068         {
1069             StartY = StartY + DstX * DeltaY;
1070         }
1071 
1072         //StartY = StartY + DstX * DeltaY;
1073 
1074         StartX1 = StartX;
1075         StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
1076 #else
1077         StartX = Start_X(0);
1078         StartY = Start_Y(0);
1079         DeltaX = Delta_X(0);
1080         DeltaY = Delta_Y(0);
1081 
1082         RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
1083 
1084         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
1085         {
1086             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
1087         }
1088         else
1089         {
1090             StartX += DstX * DeltaX;
1091         }
1092         //StartX += DstX * DeltaX;
1093         StartY += (DstY + 3 * MDF_FC_SAMPLER_UNORM_HEIGHT)* DeltaY;
1094         StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1095         StartY1 = StartY;
1096 #endif
1097 #endif
1098 
1099 #ifdef BUFFER_4
1100 #ifdef ROTATE_90
1101         Layer_Index_45 = Layer_Index & 0x7f;
1102         StartX = Start_X(Layer_Index_45);
1103         StartY = Start_Y(Layer_Index_45);
1104         DeltaX = Delta_X(Layer_Index_45);
1105         DeltaY = Delta_Y(Layer_Index_45);
1106 
1107         StartX = StartX + (DstY + 8 * (Layer_Index >> 7)) * DeltaX;
1108         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1109 
1110         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
1111         {
1112             StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
1113         }
1114         else
1115         {
1116             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
1117         }
1118 
1119         //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_HEIGHT - DstX) * DeltaY;
1120 
1121         StartX1 = StartX;
1122         StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
1123 
1124 #elif defined ROTATE_180
1125         Layer_Index_45 = Layer_Index & 0x7f;
1126         StartX = Start_X(Layer_Index_45);
1127         StartY = Start_Y(Layer_Index_45);
1128         DeltaX = Delta_X(Layer_Index_45);
1129         DeltaY = Delta_Y(Layer_Index_45);
1130 
1131         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1132         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
1133         {
1134             StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
1135             StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
1136         }
1137         else
1138         {
1139             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
1140             StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1141         }
1142 
1143         //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
1144         StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) * DeltaY;
1145 
1146         //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1147         StartY1 = StartY;
1148 #elif defined ROTATE_270
1149         Layer_Index_45 = Layer_Index & 0x7f;
1150 
1151         StartX = Start_X(Layer_Index_45);
1152         StartY = Start_Y(Layer_Index_45);
1153         DeltaX = Delta_X(Layer_Index_45);
1154         DeltaY = Delta_Y(Layer_Index_45);
1155 
1156         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1157 
1158         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) * DeltaX;
1159         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
1160         {
1161             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
1162         }
1163         else
1164         {
1165             StartY = StartY + DstX * DeltaY;
1166         }
1167         //StartY = StartY + DstX * DeltaY;
1168 
1169         StartX1 = StartX;
1170         StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
1171 #else
1172         Layer_Index_45 = Layer_Index & 0x7f;
1173         StartX = Start_X(Layer_Index_45);
1174         StartY = Start_Y(Layer_Index_45);
1175         DeltaX = Delta_X(Layer_Index_45);
1176         DeltaY = Delta_Y(Layer_Index_45);
1177         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1178         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
1179         {
1180             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
1181         }
1182         else
1183         {
1184             StartX += DstX * DeltaX;
1185         }
1186 
1187         //StartX += DstX * DeltaX;
1188         StartY = StartY + (DstY + 2 * (Layer_Index >> 7) * MDF_FC_SAMPLER_UNORM_HEIGHT) * DeltaY;
1189         StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1190         StartY1 = StartY;
1191 #endif
1192 #endif
1193 
1194 #ifdef BUFFER_5
1195 #ifdef ROTATE_90
1196         Layer_Index_45 = Layer_Index & 0x7f;
1197         StartX = Start_X(Layer_Index_45);
1198         StartY = Start_Y(Layer_Index_45);
1199         DeltaX = Delta_X(Layer_Index_45);
1200         DeltaY = Delta_Y(Layer_Index_45);
1201 
1202         StartX = StartX + (DstY + 8 * (Layer_Index >> 7) + 4) * DeltaX;
1203         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1204 
1205         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
1206         {
1207             StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
1208         }
1209         else
1210         {
1211             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
1212         }
1213 
1214         //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_HEIGHT - DstX) * DeltaY;
1215 
1216         StartX1 = StartX;
1217         StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
1218 
1219 #elif defined ROTATE_180
1220         Layer_Index_45 = Layer_Index & 0x7f;
1221         StartX = Start_X(Layer_Index_45);
1222         StartY = Start_Y(Layer_Index_45);
1223         DeltaX = Delta_X(Layer_Index_45);
1224         DeltaY = Delta_Y(Layer_Index_45);
1225 
1226         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1227         if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
1228         {
1229             StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
1230             StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
1231         }
1232         else
1233         {
1234             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
1235             StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1236         }
1237 
1238         //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
1239         StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - 8 * (Layer_Index >> 7)) * DeltaY;
1240 
1241         //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1242         StartY1 = StartY;
1243 #elif defined ROTATE_270
1244         Layer_Index_45 = Layer_Index & 0x7f;
1245 
1246         StartX = Start_X(Layer_Index_45);
1247         StartY = Start_Y(Layer_Index_45);
1248         DeltaX = Delta_X(Layer_Index_45);
1249         DeltaY = Delta_Y(Layer_Index_45);
1250 
1251         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1252 
1253         StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - 8 * (Layer_Index >> 7)) * DeltaX;
1254         if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
1255         {
1256             StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
1257         }
1258         else
1259         {
1260             StartY = StartY + DstX * DeltaY;
1261         }
1262         //StartY = StartY + DstX * DeltaY;
1263 
1264         StartX1 = StartX;
1265         StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
1266 #else
1267         Layer_Index_45 = Layer_Index & 0x7f;
1268         StartX = Start_X(Layer_Index_45);
1269         StartY = Start_Y(Layer_Index_45);
1270         DeltaX = Delta_X(Layer_Index_45);
1271         DeltaY = Delta_Y(Layer_Index_45);
1272         RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
1273         if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
1274         {
1275             StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
1276         }
1277         else
1278         {
1279             StartX += DstX * DeltaX;
1280         }
1281         //StartX += DstX * DeltaX;
1282         StartY = StartY + (DstY + (2 * (Layer_Index >> 7) + 1) * MDF_FC_SAMPLER_UNORM_HEIGHT) * DeltaY;
1283         StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
1284         StartY1 = StartY;
1285 #endif
1286 #endif
1287         // GA channel
1288         mesg.format<uint, 2, 8>().select<1, 1, 1, 1>(0, 2) = nSMPL_UNORM_ALPHA_GREEN_CHANNEL_444_16;
1289 
1290 #ifdef BUFFER_0
1291 #define WriteBackBuffer DataBuffer0
1292         mesg.select<1, 1, 1, 1>(1, 2) = StartX;
1293         mesg.select<1, 1, 1, 1>(1, 3) = StartY;
1294         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1295         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1296 
1297         desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_2CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_UV_PLANE_BTI_OFFSET;
1298         cm_send(sampler_temp,
1299             mesg.format<ushort, 2, 16>(),
1300             nSMPL_ENGINE,
1301             desc_y,
1302             0);
1303 
1304         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(0, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1305         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(4, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1306 
1307         mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
1308         mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
1309         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1310         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1311 
1312         cm_send(sampler_temp,
1313             mesg.format<ushort, 2, 16>(),
1314             nSMPL_ENGINE,
1315             desc_y,
1316             0);
1317 
1318         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(8, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1319         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(12, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1320 
1321 #endif
1322 #ifdef BUFFER_1
1323 #define WriteBackBuffer DataBuffer1
1324         mesg.select<1, 1, 1, 1>(1, 2) = StartX;
1325         mesg.select<1, 1, 1, 1>(1, 3) = StartY;
1326         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1327         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1328 
1329         desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_2CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_UV_PLANE_BTI_OFFSET;
1330         cm_send(sampler_temp,
1331             mesg.format<ushort, 2, 16>(),
1332             nSMPL_ENGINE,
1333             desc_y,
1334             0);
1335 
1336         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(0, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1337         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(4, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1338 
1339         mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
1340         mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
1341         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1342         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1343         cm_send(sampler_temp,
1344             mesg.format<ushort, 2, 16>(),
1345             nSMPL_ENGINE,
1346             desc_y,
1347             0);
1348 
1349         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(8, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1350         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(12, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1351 
1352 #endif
1353 #ifdef BUFFER_2
1354 #define WriteBackBuffer DataBuffer2
1355         mesg.select<1, 1, 1, 1>(1, 2) = StartX;
1356         mesg.select<1, 1, 1, 1>(1, 3) = StartY;
1357         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1358         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1359 
1360         desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_2CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_UV_PLANE_BTI_OFFSET;
1361         cm_send(sampler_temp,
1362             mesg.format<ushort, 2, 16>(),
1363             nSMPL_ENGINE,
1364             desc_y,
1365             0);
1366 
1367         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(0, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1368         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(4, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1369 
1370         mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
1371         mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
1372         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1373         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1374         cm_send(sampler_temp,
1375             mesg.format<ushort, 2, 16>(),
1376             nSMPL_ENGINE,
1377             desc_y,
1378             0);
1379 
1380         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(8, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1381         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(12, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1382 
1383 #endif
1384 #ifdef BUFFER_3
1385 #define WriteBackBuffer DataBuffer3
1386         mesg.select<1, 1, 1, 1>(1, 2) = StartX;
1387         mesg.select<1, 1, 1, 1>(1, 3) = StartY;
1388         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1389         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1390 
1391         desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_2CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_UV_PLANE_BTI_OFFSET;
1392         cm_send(sampler_temp,
1393             mesg.format<ushort, 2, 16>(),
1394             nSMPL_ENGINE,
1395             desc_y,
1396             0);
1397 
1398         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(0, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1399         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(4, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1400 
1401         mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
1402         mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
1403         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1404         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1405         cm_send(sampler_temp,
1406             mesg.format<ushort, 2, 16>(),
1407             nSMPL_ENGINE,
1408             desc_y,
1409             0);
1410 
1411         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(8, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1412         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(12, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1413 
1414 #endif
1415 #ifdef BUFFER_4
1416 #define WriteBackBuffer DataBuffer4
1417         mesg.select<1, 1, 1, 1>(1, 2) = StartX;
1418         mesg.select<1, 1, 1, 1>(1, 3) = StartY;
1419         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1420         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1421 
1422         desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_2CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45 + MDF_FC_UV_PLANE_BTI_OFFSET;
1423         cm_send(sampler_temp,
1424             mesg.format<ushort, 2, 16>(),
1425             nSMPL_ENGINE,
1426             desc_y,
1427             0);
1428 
1429         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(0, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1430         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(4, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1431 
1432         mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
1433         mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
1434         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1435         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1436         cm_send(sampler_temp,
1437             mesg.format<ushort, 2, 16>(),
1438             nSMPL_ENGINE,
1439             desc_y,
1440             0);
1441 
1442         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(8, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1443         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(12, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);;
1444 
1445 #endif
1446 #ifdef BUFFER_5
1447 #define WriteBackBuffer DataBuffer5
1448         mesg.select<1, 1, 1, 1>(1, 2) = StartX;
1449         mesg.select<1, 1, 1, 1>(1, 3) = StartY;
1450         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1451         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1452 
1453         desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_2CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45 + MDF_FC_UV_PLANE_BTI_OFFSET;
1454         cm_send(sampler_temp,
1455             mesg.format<ushort, 2, 16>(),
1456             nSMPL_ENGINE,
1457             desc_y,
1458             0);
1459 
1460         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(0, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1461         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(4, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1462 
1463         mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
1464         mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
1465         mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
1466         mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
1467         cm_send(sampler_temp,
1468             mesg.format<ushort, 2, 16>(),
1469             nSMPL_ENGINE,
1470             desc_y,
1471             0);
1472 
1473         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(8, 0) = sampler_temp.select<2, 1, 16, 1>(2, 0);
1474         WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(12, 0) = sampler_temp.select<2, 1, 16, 1>(0, 0);
1475 
1476 #endif
1477     }
1478 
1479     WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(6, 0) = 0xffff;
1480     WriteBackBuffer.format<ushort, 16, 16>().select<2, 1, 16, 1>(14, 0) = 0xffff;
1481 
1482     // Shuffle the write back of sampler
1483     /*
1484     Buffer layout after shuffle
1485     _________________________________________________
1486     |_______Block0__________|_______Block1__________|
1487     |_______Block2__________|_______Block3__________|
1488     |_______Block4__________|_______Block5__________|
1489     |_______Block6__________|_______Block7__________|
1490 
1491     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
1492     _______________________________________________
1493     |____R0_________R1_____|____R2_________R3_____|
1494     |____G0_________G1_____|____G2_________G3_____|
1495     |____B0_________B1_____|____B2_________B3_____|
1496     |____A0_________A1_____|____A2_________A3_____|
1497     |____R4_________R5_____|____R6_________R7_____|
1498     |____G4_________G5_____|____G6_________G7_____|
1499     |____B4_________B5_____|____B6_________B7_____|
1500     |____A4_________A5_____|____A6_________A7_____|
1501     */
1502 
1503 #undef WriteBackBuffer
1504 }