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 }