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 }