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 StartX1;
54     float StartY1;
55     float DeltaX;
56     float DeltaY;
57     uchar RotationFlag;
58 
59     /*
60     AVS Sampler 16x4 write back buffer layout for R/V, G/Y, B/U channel, each box stands for 8x1 ushort write back pixel
61     16x4 pixle deviding to 8 8x1 pixel block
62     _________________________________________________
63     |_______Block0__________|_______Block1__________|
64     |_______Block2__________|_______Block3__________|
65     |_______Block4__________|_______Block5__________|
66     |_______Block6__________|_______Block7__________|
67 
68     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
69     _______________________________________________
70     |____R0_________R2_____|____R4_________R6_____|
71     |____G0_________G2_____|____G4_________G6_____|
72     |____B0_________B2_____|____B4_________B6_____|
73     |____A0_________A2_____|____A4_________A6_____|
74     |____R1_________R3_____|____R5_________R7_____|
75     |____G1_________G3_____|____G5_________G7_____|
76     |____B1_________B3_____|____B5_________B7_____|
77     |____A1_________A3_____|____A5_________A7_____|
78     */
79     matrix <float, 2, 8> mesg;
80     mesg.select<1, 1, 8, 1>(0, 0).format<uint>() = cm_get_r0<uint>();
81     mesg.select<1, 1, 8, 1>(1, 0).format<uint>() = cm_get_r0<uint>();
82     uint desc_y;
83     uchar Layer_Index_45;
84 
85 #ifdef BUFFER_0
86 #ifdef ROTATE_90
87     StartX = Start_X(0);
88     StartY = Start_Y(0);
89     DeltaX = Delta_X(0);
90     DeltaY = Delta_Y(0);
91     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
92 
93     StartX = StartX + DstY * DeltaX;
94 
95     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
96     {
97         StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
98     }
99     else
100     {
101         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
102     }
103 
104     StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
105 
106     //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
107 
108     StartX1 = StartX;
109 #elif defined ROTATE_180
110     StartX = Start_X(0);
111     StartY = Start_Y(0);
112     DeltaX = Delta_X(0);
113     DeltaY = Delta_Y(0);
114 
115     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
116     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
117     {
118         StartX  = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
119         StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
120     }
121     else
122     {
123         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
124         StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
125     }
126 
127     //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
128     StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) * DeltaY;
129 
130     StartY1 = StartY;
131 #elif defined ROTATE_270
132     StartX = Start_X(0);
133     StartY = Start_Y(0);
134     DeltaX = Delta_X(0);
135     DeltaY = Delta_Y(0);
136 
137     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
138 
139     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12) * DeltaX;
140     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
141     {
142         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
143     }
144     else
145     {
146         StartY = StartY + DstX * DeltaY;
147     }
148 
149     StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
150     //StartY = StartY + DstX * DeltaY;
151     StartX1 = StartX;
152 #else
153     StartX = Start_X(0);
154     StartY = Start_Y(0);
155     DeltaX = Delta_X(0);
156     DeltaY = Delta_Y(0);
157 
158     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
159     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
160     {
161         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
162     }
163     else
164     {
165         StartX += DstX * DeltaX;
166     }
167 
168     StartX1 = StartX + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
169 
170     StartY += DstY * DeltaY;
171     StartY1 = StartY;
172 #endif
173 #endif
174 
175 #ifdef BUFFER_1
176 #ifdef ROTATE_90
177     StartX = Start_X(0);
178     StartY = Start_Y(0);
179     DeltaX = Delta_X(0);
180     DeltaY = Delta_Y(0);
181 
182     StartX = StartX + (DstY + 4) * DeltaX;
183     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
184 
185     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
186     {
187         StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
188     }
189     else
190     {
191         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
192     }
193 
194     //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
195 
196     StartX1 = StartX;
197     StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
198 
199 #elif defined ROTATE_180
200     StartX = Start_X(0);
201     StartY = Start_Y(0);
202     DeltaX = Delta_X(0);
203     DeltaY = Delta_Y(0);
204 
205     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
206     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
207     {
208         StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
209         StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
210     }
211     else
212     {
213         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
214         StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
215     }
216 
217     //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
218     StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) * DeltaY;
219 
220     //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
221     StartY1 = StartY;
222 
223 #elif defined ROTATE_270
224     StartX = Start_X(0);
225     StartY = Start_Y(0);
226     DeltaX = Delta_X(0);
227     DeltaY = Delta_Y(0);
228 
229     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
230 
231     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8) * DeltaX;
232 
233     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
234     {
235         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
236     }
237     else
238     {
239         StartY = StartY + DstX * DeltaY;
240     }
241 
242     //StartY = StartY + DstX * DeltaY;
243 
244     StartX1 = StartX;
245     StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
246 #else
247     StartX = Start_X(0);
248     StartY = Start_Y(0);
249     DeltaX = Delta_X(0);
250     DeltaY = Delta_Y(0);
251     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
252     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
253     {
254         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
255     }
256     else
257     {
258         StartX += DstX * DeltaX;
259     }
260     //StartX += DstX * DeltaX;
261     StartY += (DstY + MDF_FC_SAMPLER_UNORM_HEIGHT)* DeltaY;
262 
263     StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
264     StartY1 = StartY;
265 #endif
266 #endif
267 
268 #ifdef BUFFER_2
269 #ifdef ROTATE_90
270     StartX = Start_X(0);
271     StartY = Start_Y(0);
272     DeltaX = Delta_X(0);
273     DeltaY = Delta_Y(0);
274 
275     StartX = StartX + (DstY + 8) * DeltaX;
276     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
277 
278     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
279     {
280         StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
281     }
282     else
283     {
284         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
285     }
286 
287     //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
288 
289     StartX1 = StartX;
290     StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
291 
292 #elif defined ROTATE_180
293     StartX = Start_X(0);
294     StartY = Start_Y(0);
295     DeltaX = Delta_X(0);
296     DeltaY = Delta_Y(0);
297 
298     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
299     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
300     {
301         StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
302         StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
303     }
304     else
305     {
306         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
307         StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
308     }
309 
310     //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
311     StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) * DeltaY;
312 
313     //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
314     StartY1 = StartY;
315 #elif defined ROTATE_270
316     StartX = Start_X(0);
317     StartY = Start_Y(0);
318     DeltaX = Delta_X(0);
319     DeltaY = Delta_Y(0);
320 
321     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
322 
323     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 4) * DeltaX;
324     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
325     {
326         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
327     }
328     else
329     {
330         StartY = StartY + DstX * DeltaY;
331     }
332 
333     //StartY = StartY + DstX * DeltaY;
334 
335     StartX1 = StartX;
336     StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
337 #else
338     StartX = Start_X(0);
339     StartY = Start_Y(0);
340     DeltaX = Delta_X(0);
341     DeltaY = Delta_Y(0);
342     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
343     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
344     {
345         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
346     }
347     else
348     {
349         StartX += DstX * DeltaX;
350     }
351     //StartX += DstX * DeltaX;
352     StartY += (DstY + 2 * MDF_FC_SAMPLER_UNORM_HEIGHT)* DeltaY;
353     StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
354     StartY1 = StartY;
355 #endif
356 #endif
357 
358 #ifdef BUFFER_3
359 #ifdef ROTATE_90
360     StartX = Start_X(0);
361     StartY = Start_Y(0);
362     DeltaX = Delta_X(0);
363     DeltaY = Delta_Y(0);
364 
365     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
366     StartX = StartX + (DstY + 12) * DeltaX;
367 
368     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
369     {
370         StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
371     }
372     else
373     {
374         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
375     }
376 
377     //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
378 
379     StartX1 = StartX;
380     StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
381 
382 #elif defined ROTATE_180
383     StartX = Start_X(0);
384     StartY = Start_Y(0);
385     DeltaX = Delta_X(0);
386     DeltaY = Delta_Y(0);
387 
388     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
389     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
390     {
391         StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
392         StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
393     }
394     else
395     {
396         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
397         StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
398     }
399     //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
400     StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) * DeltaY;
401 
402     //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
403     StartY1 = StartY;
404 #elif defined ROTATE_270
405     StartX = Start_X(0);
406     StartY = Start_Y(0);
407     DeltaX = Delta_X(0);
408     DeltaY = Delta_Y(0);
409 
410     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
411 
412     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY) * DeltaX;
413     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
414     {
415         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
416     }
417     else
418     {
419         StartY = StartY + DstX * DeltaY;
420     }
421 
422     //StartY = StartY + DstX * DeltaY;
423 
424     StartX1 = StartX;
425     StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
426 #else
427     StartX = Start_X(0);
428     StartY = Start_Y(0);
429     DeltaX = Delta_X(0);
430     DeltaY = Delta_Y(0);
431 
432     RotationFlag = (uchar)(RotationChromaSitingFlag & 0x07);
433 
434     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
435     {
436         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
437     }
438     else
439     {
440         StartX += DstX * DeltaX;
441     }
442     //StartX += DstX * DeltaX;
443     StartY += (DstY + 3 * MDF_FC_SAMPLER_UNORM_HEIGHT)* DeltaY;
444     StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
445     StartY1 = StartY;
446 #endif
447 #endif
448 
449 #ifdef BUFFER_4
450 #ifdef ROTATE_90
451     Layer_Index_45 = Layer_Index & 0x7f;
452     StartX = Start_X(Layer_Index_45);
453     StartY = Start_Y(Layer_Index_45);
454     DeltaX = Delta_X(Layer_Index_45);
455     DeltaY = Delta_Y(Layer_Index_45);
456 
457     StartX = StartX + (DstY + 8 * (Layer_Index >> 7)) * DeltaX;
458     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
459 
460     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
461     {
462         StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
463     }
464     else
465     {
466         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
467     }
468 
469     //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_HEIGHT - DstX) * DeltaY;
470 
471     StartX1 = StartX;
472     StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
473 
474 #elif defined ROTATE_180
475     Layer_Index_45 = Layer_Index & 0x7f;
476     StartX = Start_X(Layer_Index_45);
477     StartY = Start_Y(Layer_Index_45);
478     DeltaX = Delta_X(Layer_Index_45);
479     DeltaY = Delta_Y(Layer_Index_45);
480 
481     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
482     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
483     {
484         StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
485         StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
486     }
487     else
488     {
489         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
490         StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
491     }
492 
493     //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
494     StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) * DeltaY;
495 
496     //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
497     StartY1 = StartY;
498 #elif defined ROTATE_270
499     Layer_Index_45 = Layer_Index & 0x7f;
500 
501     StartX = Start_X(Layer_Index_45);
502     StartY = Start_Y(Layer_Index_45);
503     DeltaX = Delta_X(Layer_Index_45);
504     DeltaY = Delta_Y(Layer_Index_45);
505 
506     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
507 
508     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 12 - 8 * (Layer_Index >> 7)) * DeltaX;
509     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
510     {
511         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
512     }
513     else
514     {
515         StartY = StartY + DstX * DeltaY;
516     }
517     //StartY = StartY + DstX * DeltaY;
518 
519     StartX1 = StartX;
520     StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
521 #else
522     Layer_Index_45 = Layer_Index & 0x7f;
523     StartX = Start_X(Layer_Index_45);
524     StartY = Start_Y(Layer_Index_45);
525     DeltaX = Delta_X(Layer_Index_45);
526     DeltaY = Delta_Y(Layer_Index_45);
527     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
528     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
529     {
530         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
531     }
532     else
533     {
534         StartX += DstX * DeltaX;
535     }
536 
537     //StartX += DstX * DeltaX;
538     StartY  = StartY + (DstY + 2 * (Layer_Index >> 7) * MDF_FC_SAMPLER_UNORM_HEIGHT) * DeltaY;
539     StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
540     StartY1 = StartY;
541 #endif
542 #endif
543 
544 #ifdef BUFFER_5
545 #ifdef ROTATE_90
546     Layer_Index_45 = Layer_Index & 0x7f;
547     StartX = Start_X(Layer_Index_45);
548     StartY = Start_Y(Layer_Index_45);
549     DeltaX = Delta_X(Layer_Index_45);
550     DeltaY = Delta_Y(Layer_Index_45);
551 
552     StartX = StartX + (DstY + 8 * (Layer_Index >> 7) + 4) * DeltaX;
553     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
554 
555     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_HORIZONTAL)
556     {
557         StartY = StartY + (DstX + MDF_FC_SAMPLER_UNORM_WIDTH)* DeltaY;
558     }
559     else
560     {
561         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaY;
562     }
563 
564     //StartY = StartY + (Dst_Width - MDF_FC_BLOCK_HEIGHT - DstX) * DeltaY;
565 
566     StartX1 = StartX;
567     StartY1 = StartY - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
568 
569 #elif defined ROTATE_180
570     Layer_Index_45 = Layer_Index & 0x7f;
571     StartX = Start_X(Layer_Index_45);
572     StartY = Start_Y(Layer_Index_45);
573     DeltaX = Delta_X(Layer_Index_45);
574     DeltaY = Delta_Y(Layer_Index_45);
575 
576     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
577     if (RotationFlag == MDF_FC_MIRROR_VERTICAL)
578     {
579         StartX = StartX + DeltaX * (MDF_FC_SAMPLER_UNORM_WIDTH + DstX);
580         StartX1 = StartX - MDF_FC_SAMPLER_UNORM_WIDTH * DeltaX;
581     }
582     else
583     {
584         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX + MDF_FC_SAMPLER_UNORM_WIDTH) * DeltaX;
585         StartX1 = StartX - DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
586     }
587 
588     //StartX = StartX + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
589     StartY = StartY + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - 8 * (Layer_Index >> 7)) * DeltaY;
590 
591     //StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
592     StartY1 = StartY;
593 #elif defined ROTATE_270
594     Layer_Index_45 = Layer_Index & 0x7f;
595 
596     StartX = Start_X(Layer_Index_45);
597     StartY = Start_Y(Layer_Index_45);
598     DeltaX = Delta_X(Layer_Index_45);
599     DeltaY = Delta_Y(Layer_Index_45);
600 
601     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
602 
603     StartX = StartX + (Dst_Height - MDF_FC_BLOCK_HEIGHT - DstY + 8 - 8 * (Layer_Index >> 7)) * DeltaX;
604     if (RotationFlag == MDF_FC_ROTATE_90_MIRROR_VERTICAL)
605     {
606         StartY = StartY + (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaY;
607     }
608     else
609     {
610         StartY = StartY + DstX * DeltaY;
611     }
612     //StartY = StartY + DstX * DeltaY;
613 
614     StartX1 = StartX;
615     StartY1 = StartY + MDF_FC_SAMPLER_UNORM_WIDTH * DeltaY;
616 #else
617     Layer_Index_45 = Layer_Index & 0x7f;
618     StartX = Start_X(Layer_Index_45);
619     StartY = Start_Y(Layer_Index_45);
620     DeltaX = Delta_X(Layer_Index_45);
621     DeltaY = Delta_Y(Layer_Index_45);
622     RotationFlag = (uchar)((RotationChromaSitingFlag >> (3 * Layer_Index_45)) & 0x07);
623     if (RotationFlag == MDF_FC_MIRROR_HORIZONTAL)
624     {
625         StartX += (Dst_Width - MDF_FC_BLOCK_WIDTH - DstX) * DeltaX;
626     }
627     else
628     {
629         StartX += DstX * DeltaX;
630     }
631     //StartX += DstX * DeltaX;
632     StartY = StartY + (DstY + (2 * (Layer_Index >> 7) + 1) * MDF_FC_SAMPLER_UNORM_HEIGHT) * DeltaY;
633     StartX1 = StartX + DeltaX * MDF_FC_SAMPLER_UNORM_WIDTH;
634     StartY1 = StartY;
635 #endif
636 #endif
637 
638 #ifdef BUFFER_0
639 #define WriteBackBuffer DataBuffer0
640     mesg.select<1, 1, 1, 1>(1, 2) = StartX;
641     mesg.select<1, 1, 1, 1>(1, 3) = StartY;
642     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
643     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
644 
645     desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_4CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START;
646     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(0, 0),
647             mesg.format<ushort, 2, 16>(),
648             nSMPL_ENGINE,
649             desc_y,
650             0);
651 
652     mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
653     mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
654     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
655     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
656 
657     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(8, 0),
658         mesg.format<ushort, 2, 16>(),
659         nSMPL_ENGINE,
660         desc_y,
661         0);
662 
663 #endif
664 #ifdef BUFFER_1
665 #define WriteBackBuffer DataBuffer1
666     mesg.select<1, 1, 1, 1>(1, 2) = StartX;
667     mesg.select<1, 1, 1, 1>(1, 3) = StartY;
668     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
669     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
670 
671     desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_4CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START;
672     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(0, 0),
673         mesg.format<ushort, 2, 16>(),
674         nSMPL_ENGINE,
675         desc_y,
676         0);
677 
678     mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
679     mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
680     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
681     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
682     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(8, 0),
683         mesg.format<ushort, 2, 16>(),
684         nSMPL_ENGINE,
685         desc_y,
686         0);
687 
688 #endif
689 #ifdef BUFFER_2
690 #define WriteBackBuffer DataBuffer2
691     mesg.select<1, 1, 1, 1>(1, 2) = StartX;
692     mesg.select<1, 1, 1, 1>(1, 3) = StartY;
693     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
694     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
695 
696     desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_4CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START;
697     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(0, 0),
698         mesg.format<ushort, 2, 16>(),
699         nSMPL_ENGINE,
700         desc_y,
701         0);
702 
703     mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
704     mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
705     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
706     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
707     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(8, 0),
708         mesg.format<ushort, 2, 16>(),
709         nSMPL_ENGINE,
710         desc_y,
711         0);
712 
713 #endif
714 #ifdef BUFFER_3
715 #define WriteBackBuffer DataBuffer3
716     mesg.select<1, 1, 1, 1>(1, 2) = StartX;
717     mesg.select<1, 1, 1, 1>(1, 3) = StartY;
718     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
719     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
720 
721     desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_4CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START;
722     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(0, 0),
723         mesg.format<ushort, 2, 16>(),
724         nSMPL_ENGINE,
725         desc_y,
726         0);
727 
728     mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
729     mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
730     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
731     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
732     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(8, 0),
733         mesg.format<ushort, 2, 16>(),
734         nSMPL_ENGINE,
735         desc_y,
736         0);
737 
738 #endif
739 #ifdef BUFFER_4
740 #define WriteBackBuffer DataBuffer4
741     mesg.select<1, 1, 1, 1>(1, 2) = StartX;
742     mesg.select<1, 1, 1, 1>(1, 3) = StartY;
743     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
744     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
745 
746     desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_4CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45;
747     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(0, 0),
748         mesg.format<ushort, 2, 16>(),
749         nSMPL_ENGINE,
750         desc_y,
751         0);
752 
753     mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
754     mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
755     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
756     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
757     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(8, 0),
758         mesg.format<ushort, 2, 16>(),
759         nSMPL_ENGINE,
760         desc_y,
761         0);
762 
763 #endif
764 #ifdef BUFFER_5
765 #define WriteBackBuffer DataBuffer5
766     mesg.select<1, 1, 1, 1>(1, 2) = StartX;
767     mesg.select<1, 1, 1, 1>(1, 3) = StartY;
768     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
769     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
770 
771     desc_y = nSMPL_UNORM_444_16BITS_MSGDSC_4CH + (MDF_FC_3D_SAMPLER_SI_Y << 8) + MDF_FC_INPUT_BTI_START + MDF_FC_INPUT_BTI_PER_LAYER * Layer_Index_45;
772     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(0, 0),
773         mesg.format<ushort, 2, 16>(),
774         nSMPL_ENGINE,
775         desc_y,
776         0);
777 
778     mesg.select<1, 1, 1, 1>(1, 2) = StartX1;
779     mesg.select<1, 1, 1, 1>(1, 3) = StartY1;
780     mesg.select<1, 1, 1, 1>(1, 4) = DeltaX;
781     mesg.select<1, 1, 1, 1>(1, 5) = DeltaY;
782     cm_send(WriteBackBuffer.format<ushort, 16, 16>().select<8, 1, 16, 1>(8, 0),
783         mesg.format<ushort, 2, 16>(),
784         nSMPL_ENGINE,
785         desc_y,
786         0);
787 
788 #endif
789 
790 
791     // Shuffle the write back of sampler
792     /*
793     Buffer layout after shuffle
794     _________________________________________________
795     |_______Block0__________|_______Block1__________|
796     |_______Block2__________|_______Block3__________|
797     |_______Block4__________|_______Block5__________|
798     |_______Block6__________|_______Block7__________|
799 
800     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
801     _______________________________________________
802     |____R0_________R1_____|____R2_________R3_____|
803     |____G0_________G1_____|____G2_________G3_____|
804     |____B0_________B1_____|____B2_________B3_____|
805     |____A0_________A1_____|____A2_________A3_____|
806     |____R4_________R5_____|____R6_________R7_____|
807     |____G4_________G5_____|____G6_________G7_____|
808     |____B4_________B5_____|____B6_________B7_____|
809     |____A4_________A5_____|____A6_________A7_____|
810     */
811 #ifdef Y410_SUPPORT
812     {
813         matrix<ushort, 1, 16> shuffle_temp;
814         shuffle_temp = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(0, 0);
815         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(0, 0) = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(4, 0);
816         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(4, 0) = shuffle_temp;
817 
818         shuffle_temp = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(1, 0);
819         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(1, 0) = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(5, 0);
820         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(5, 0) = shuffle_temp;
821 
822         shuffle_temp = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(8, 0);
823         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(8, 0) = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(12, 0);
824         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(12, 0) = shuffle_temp;
825 
826         shuffle_temp = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(9, 0);
827         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(9, 0) = WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(13, 0);
828         WriteBackBuffer.format<ushort, 16, 16>().select<1, 1, 16, 1>(13, 0) = shuffle_temp;
829     }
830 #endif
831 
832 #undef WriteBackBuffer
833 }