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 }