1 #pragma once 2 /* 3 * Copyright (c) 2017-2019, Intel Corporation 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included 13 * in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 */ 23 //! 24 //! \file codechal_encode_wp_mdf_g12.h 25 //! \brief Gen12 class for weighted prediction. 26 //! 27 28 #ifndef __CODECHAL_ENCODE_WP_MDF_G12_H__ 29 #define __CODECHAL_ENCODE_WP_MDF_G12_H__ 30 31 #include "codechal_encode_wp.h" 32 33 class CodechalEncodeWPMdfG12 : public CodechalEncodeWP 34 { 35 public: 36 //! 37 //! \brief Constructor 38 //! CodechalEncodeWPMdfG12(CodechalEncoderState * encoder)39 CodechalEncodeWPMdfG12(CodechalEncoderState* encoder): 40 CodechalEncodeWP(encoder) {} 41 42 //! 43 //! \brief Destructor 44 //! ~CodechalEncodeWPMdfG12()45 virtual ~CodechalEncodeWPMdfG12() { ReleaseResources(); }; 46 47 //! 48 //! \brief Initialize weighted prediction kernel state 49 //! 50 //! \return MOS_STATUS 51 //! MOS_STATUS_SUCCESS if success, else fail reason 52 //! 53 virtual MOS_STATUS InitKernelStateIsa(void *kernelIsa, uint32_t kernelIsaSize); 54 55 //! 56 //! \brief SW scoreboard init kernel function 57 //! 58 //! \param [in] params 59 //! Pointer to KernelParams 60 //! 61 //! \return MOS_STATUS 62 //! MOS_STATUS_SUCCESS if success, else fail reason 63 //! 64 virtual MOS_STATUS Execute(KernelParams *params)override; 65 66 protected: 67 //! 68 //! \brief SW scoreboard init kernel Curbe data 69 //! 70 struct CurbeData 71 { 72 // DW0 73 union 74 { 75 struct 76 { 77 uint32_t defaultWeight : MOS_BITFIELD_RANGE(0, 15); 78 uint32_t defaultOffset : MOS_BITFIELD_RANGE(16, 31); 79 }; 80 struct 81 { 82 uint32_t value; 83 }; 84 } DW0; 85 86 // DW1 87 union 88 { 89 struct 90 { 91 uint32_t roi0XLeft : MOS_BITFIELD_RANGE(0, 15); 92 uint32_t roi0YTop : MOS_BITFIELD_RANGE(16, 31); 93 }; 94 struct 95 { 96 uint32_t value; 97 }; 98 } DW1; 99 100 // DW2 101 union 102 { 103 struct 104 { 105 uint32_t roi0XRight : MOS_BITFIELD_RANGE(0, 15); 106 uint32_t roi0YBottom : MOS_BITFIELD_RANGE(16, 31); 107 }; 108 struct 109 { 110 uint32_t value; 111 }; 112 } DW2; 113 114 // DW3 115 union 116 { 117 struct 118 { 119 uint32_t roi0Weight : MOS_BITFIELD_RANGE(0, 15); 120 uint32_t roi0Offset : MOS_BITFIELD_RANGE(16, 31); 121 }; 122 struct 123 { 124 uint32_t value; 125 }; 126 } DW3; 127 128 // DW4 129 union 130 { 131 struct 132 { 133 uint32_t roi1XLeft : MOS_BITFIELD_RANGE(0, 15); 134 uint32_t roi1YTop : MOS_BITFIELD_RANGE(16, 31); 135 }; 136 struct 137 { 138 uint32_t value; 139 }; 140 } DW4; 141 142 // DW5 143 union 144 { 145 struct 146 { 147 uint32_t roi1XRight : MOS_BITFIELD_RANGE(0, 15); 148 uint32_t roi1YBottom : MOS_BITFIELD_RANGE(16, 31); 149 }; 150 struct 151 { 152 uint32_t value; 153 }; 154 } DW5; 155 156 // DW6 157 union 158 { 159 struct 160 { 161 uint32_t roi1Weight : MOS_BITFIELD_RANGE(0, 15); 162 uint32_t roi1Offset : MOS_BITFIELD_RANGE(16, 31); 163 }; 164 struct 165 { 166 uint32_t value; 167 }; 168 } DW6; 169 170 // DW7 171 union 172 { 173 struct 174 { 175 uint32_t roi2XLeft : MOS_BITFIELD_RANGE(0, 15); 176 uint32_t roi2YTop : MOS_BITFIELD_RANGE(16, 31); 177 }; 178 struct 179 { 180 uint32_t value; 181 }; 182 } DW7; 183 184 // DW8 185 union 186 { 187 struct 188 { 189 uint32_t roi2XRight : MOS_BITFIELD_RANGE(0, 15); 190 uint32_t roi2YBottom : MOS_BITFIELD_RANGE(16, 31); 191 }; 192 struct 193 { 194 uint32_t value; 195 }; 196 } DW8; 197 198 // DW9 199 union 200 { 201 struct 202 { 203 uint32_t roi2Weight : MOS_BITFIELD_RANGE(0, 15); 204 uint32_t roi2Offset : MOS_BITFIELD_RANGE(16, 31); 205 }; 206 struct 207 { 208 uint32_t value; 209 }; 210 } DW9; 211 212 // DW10 213 union 214 { 215 struct 216 { 217 uint32_t roi3XLeft : MOS_BITFIELD_RANGE(0, 15); 218 uint32_t roi3YTop : MOS_BITFIELD_RANGE(16, 31); 219 }; 220 struct 221 { 222 uint32_t value; 223 }; 224 } DW10; 225 226 // DW11 227 union 228 { 229 struct 230 { 231 uint32_t roi3XRight : MOS_BITFIELD_RANGE(0, 15); 232 uint32_t roi3YBottom : MOS_BITFIELD_RANGE(16, 31); 233 }; 234 struct 235 { 236 uint32_t value; 237 }; 238 } DW11; 239 240 // DW12 241 union 242 { 243 struct 244 { 245 uint32_t roi3Weight : MOS_BITFIELD_RANGE(0, 15); 246 uint32_t roi3Offset : MOS_BITFIELD_RANGE(16, 31); 247 }; 248 struct 249 { 250 uint32_t value; 251 }; 252 } DW12; 253 254 // DW13 255 union 256 { 257 struct 258 { 259 uint32_t roi4XLeft : MOS_BITFIELD_RANGE(0, 15); 260 uint32_t roi4YTop : MOS_BITFIELD_RANGE(16, 31); 261 }; 262 struct 263 { 264 uint32_t value; 265 }; 266 } DW13; 267 268 // DW14 269 union 270 { 271 struct 272 { 273 uint32_t roi4XRight : MOS_BITFIELD_RANGE(0, 15); 274 uint32_t roi4YBottom : MOS_BITFIELD_RANGE(16, 31); 275 }; 276 struct 277 { 278 uint32_t value; 279 }; 280 } DW14; 281 282 // DW15 283 union 284 { 285 struct 286 { 287 uint32_t roi4Weight : MOS_BITFIELD_RANGE(0, 15); 288 uint32_t roi4Offset : MOS_BITFIELD_RANGE(16, 31); 289 }; 290 struct 291 { 292 uint32_t value; 293 }; 294 } DW15; 295 296 // DW16 297 union 298 { 299 struct 300 { 301 uint32_t roi5XLeft : MOS_BITFIELD_RANGE(0, 15); 302 uint32_t roi5YTop : MOS_BITFIELD_RANGE(16, 31); 303 }; 304 struct 305 { 306 uint32_t value; 307 }; 308 } DW16; 309 310 // DW17 311 union 312 { 313 struct 314 { 315 uint32_t roi5XRight : MOS_BITFIELD_RANGE(0, 15); 316 uint32_t roi5YBottom : MOS_BITFIELD_RANGE(16, 31); 317 }; 318 struct 319 { 320 uint32_t value; 321 }; 322 } DW17; 323 324 // DW18 325 union 326 { 327 struct 328 { 329 uint32_t roi5Weight : MOS_BITFIELD_RANGE(0, 15); 330 uint32_t roi5Offset : MOS_BITFIELD_RANGE(16, 31); 331 }; 332 struct 333 { 334 uint32_t value; 335 }; 336 } DW18; 337 338 // DW19 339 union 340 { 341 struct 342 { 343 uint32_t roi6XLeft : MOS_BITFIELD_RANGE(0, 15); 344 uint32_t roi6YTop : MOS_BITFIELD_RANGE(16, 31); 345 }; 346 struct 347 { 348 uint32_t value; 349 }; 350 } DW19; 351 352 // DW20 353 union 354 { 355 struct 356 { 357 uint32_t roi6XRight : MOS_BITFIELD_RANGE(0, 15); 358 uint32_t roi6YBottom : MOS_BITFIELD_RANGE(16, 31); 359 }; 360 struct 361 { 362 uint32_t value; 363 }; 364 } DW20; 365 366 // DW21 367 union 368 { 369 struct 370 { 371 uint32_t roi6Weight : MOS_BITFIELD_RANGE(0, 15); 372 uint32_t roi6Offset : MOS_BITFIELD_RANGE(16, 31); 373 }; 374 struct 375 { 376 uint32_t value; 377 }; 378 } DW21; 379 380 // DW22 381 union 382 { 383 struct 384 { 385 uint32_t roi7XLeft : MOS_BITFIELD_RANGE(0, 15); 386 uint32_t roi7YTop : MOS_BITFIELD_RANGE(16, 31); 387 }; 388 struct 389 { 390 uint32_t value; 391 }; 392 } DW22; 393 394 // DW23 395 union 396 { 397 struct 398 { 399 uint32_t roi7XRight : MOS_BITFIELD_RANGE(0, 15); 400 uint32_t roi7YBottom : MOS_BITFIELD_RANGE(16, 31); 401 }; 402 struct 403 { 404 uint32_t value; 405 }; 406 } DW23; 407 408 // DW24 409 union 410 { 411 struct 412 { 413 uint32_t roi7Weight : MOS_BITFIELD_RANGE(0, 15); 414 uint32_t roi7Offset : MOS_BITFIELD_RANGE(16, 31); 415 }; 416 struct 417 { 418 uint32_t value; 419 }; 420 } DW24; 421 422 // DW25 423 union 424 { 425 struct 426 { 427 uint32_t roi8XLeft : MOS_BITFIELD_RANGE(0, 15); 428 uint32_t roi8YTop : MOS_BITFIELD_RANGE(16, 31); 429 }; 430 struct 431 { 432 uint32_t value; 433 }; 434 } DW25; 435 436 // DW26 437 union 438 { 439 struct 440 { 441 uint32_t roi8XRight : MOS_BITFIELD_RANGE(0, 15); 442 uint32_t roi8YBottom : MOS_BITFIELD_RANGE(16, 31); 443 }; 444 struct 445 { 446 uint32_t value; 447 }; 448 } DW26; 449 450 // DW27 451 union 452 { 453 struct 454 { 455 uint32_t roi8Weight : MOS_BITFIELD_RANGE(0, 15); 456 uint32_t roi8Offset : MOS_BITFIELD_RANGE(16, 31); 457 }; 458 struct 459 { 460 uint32_t value; 461 }; 462 } DW27; 463 464 // DW28 465 union 466 { 467 struct 468 { 469 uint32_t roi9XLeft : MOS_BITFIELD_RANGE(0, 15); 470 uint32_t roi9YTop : MOS_BITFIELD_RANGE(16, 31); 471 }; 472 struct 473 { 474 uint32_t value; 475 }; 476 } DW28; 477 478 // DW29 479 union 480 { 481 struct 482 { 483 uint32_t roi9XRight : MOS_BITFIELD_RANGE(0, 15); 484 uint32_t roi9YBottom : MOS_BITFIELD_RANGE(16, 31); 485 }; 486 struct 487 { 488 uint32_t value; 489 }; 490 } DW29; 491 492 // DW30 493 union 494 { 495 struct 496 { 497 uint32_t roi9Weight : MOS_BITFIELD_RANGE(0, 15); 498 uint32_t roi9Offset : MOS_BITFIELD_RANGE(16, 31); 499 }; 500 struct 501 { 502 uint32_t value; 503 }; 504 } DW30; 505 506 // DW31 507 union 508 { 509 struct 510 { 511 uint32_t roi10XLeft : MOS_BITFIELD_RANGE(0, 15); 512 uint32_t roi10YTop : MOS_BITFIELD_RANGE(16, 31); 513 }; 514 struct 515 { 516 uint32_t value; 517 }; 518 } DW31; 519 520 // DW32 521 union 522 { 523 struct 524 { 525 uint32_t roi10XRight : MOS_BITFIELD_RANGE(0, 15); 526 uint32_t roi10YBottom : MOS_BITFIELD_RANGE(16, 31); 527 }; 528 struct 529 { 530 uint32_t value; 531 }; 532 } DW32; 533 534 // DW33 535 union 536 { 537 struct 538 { 539 uint32_t roi10Weight : MOS_BITFIELD_RANGE(0, 15); 540 uint32_t roi10Offset : MOS_BITFIELD_RANGE(16, 31); 541 }; 542 struct 543 { 544 uint32_t value; 545 }; 546 } DW33; 547 548 // DW34 549 union 550 { 551 struct 552 { 553 uint32_t roi11XLeft : MOS_BITFIELD_RANGE(0, 15); 554 uint32_t roi11YTop : MOS_BITFIELD_RANGE(16, 31); 555 }; 556 struct 557 { 558 uint32_t value; 559 }; 560 } DW34; 561 562 // DW35 563 union 564 { 565 struct 566 { 567 uint32_t roi11XRight : MOS_BITFIELD_RANGE(0, 15); 568 uint32_t roi11YBottom : MOS_BITFIELD_RANGE(16, 31); 569 }; 570 struct 571 { 572 uint32_t value; 573 }; 574 } DW35; 575 576 // DW36 577 union 578 { 579 struct 580 { 581 uint32_t roi11Weight : MOS_BITFIELD_RANGE(0, 15); 582 uint32_t roi11Offset : MOS_BITFIELD_RANGE(16, 31); 583 }; 584 struct 585 { 586 uint32_t value; 587 }; 588 } DW36; 589 590 // DW37 591 union 592 { 593 struct 594 { 595 uint32_t roi12XLeft : MOS_BITFIELD_RANGE(0, 15); 596 uint32_t roi12YTop : MOS_BITFIELD_RANGE(16, 31); 597 }; 598 struct 599 { 600 uint32_t value; 601 }; 602 } DW37; 603 604 // DW38 605 union 606 { 607 struct 608 { 609 uint32_t roi12XRight : MOS_BITFIELD_RANGE(0, 15); 610 uint32_t roi12YBottom : MOS_BITFIELD_RANGE(16, 31); 611 }; 612 struct 613 { 614 uint32_t value; 615 }; 616 } DW38; 617 618 // DW39 619 union 620 { 621 struct 622 { 623 uint32_t roi12Weight : MOS_BITFIELD_RANGE(0, 15); 624 uint32_t roi12Offset : MOS_BITFIELD_RANGE(16, 31); 625 }; 626 struct 627 { 628 uint32_t value; 629 }; 630 } DW39; 631 632 // DW40 633 union 634 { 635 struct 636 { 637 uint32_t roi13XLeft : MOS_BITFIELD_RANGE(0, 15); 638 uint32_t roi13YTop : MOS_BITFIELD_RANGE(16, 31); 639 }; 640 struct 641 { 642 uint32_t value; 643 }; 644 } DW40; 645 646 // DW41 647 union 648 { 649 struct 650 { 651 uint32_t roi13XRight : MOS_BITFIELD_RANGE(0, 15); 652 uint32_t roi13YBottom : MOS_BITFIELD_RANGE(16, 31); 653 }; 654 struct 655 { 656 uint32_t value; 657 }; 658 } DW41; 659 660 // DW42 661 union 662 { 663 struct 664 { 665 uint32_t roi13Weight : MOS_BITFIELD_RANGE(0, 15); 666 uint32_t roi13Offset : MOS_BITFIELD_RANGE(16, 31); 667 }; 668 struct 669 { 670 uint32_t value; 671 }; 672 } DW42; 673 674 // DW43 675 union 676 { 677 struct 678 { 679 uint32_t roi14XLeft : MOS_BITFIELD_RANGE(0, 15); 680 uint32_t roi14YTop : MOS_BITFIELD_RANGE(16, 31); 681 }; 682 struct 683 { 684 uint32_t value; 685 }; 686 } DW43; 687 688 // DW44 689 union 690 { 691 struct 692 { 693 uint32_t roi14XRight : MOS_BITFIELD_RANGE(0, 15); 694 uint32_t roi14YBottom : MOS_BITFIELD_RANGE(16, 31); 695 }; 696 struct 697 { 698 uint32_t value; 699 }; 700 } DW44; 701 702 // DW45 703 union 704 { 705 struct 706 { 707 uint32_t roi14Weight : MOS_BITFIELD_RANGE(0, 15); 708 uint32_t roi14Offset : MOS_BITFIELD_RANGE(16, 31); 709 }; 710 struct 711 { 712 uint32_t value; 713 }; 714 } DW45; 715 716 // DW46 717 union 718 { 719 struct 720 { 721 uint32_t roi15XLeft : MOS_BITFIELD_RANGE(0, 15); 722 uint32_t roi15YTop : MOS_BITFIELD_RANGE(16, 31); 723 }; 724 struct 725 { 726 uint32_t value; 727 }; 728 } DW46; 729 730 // DW47 731 union 732 { 733 struct 734 { 735 uint32_t roi15XRight : MOS_BITFIELD_RANGE(0, 15); 736 uint32_t roi15YBottom : MOS_BITFIELD_RANGE(16, 31); 737 }; 738 struct 739 { 740 uint32_t value; 741 }; 742 } DW47; 743 744 // DW48 745 union 746 { 747 struct 748 { 749 uint32_t roi15Weight : MOS_BITFIELD_RANGE(0, 15); 750 uint32_t roi15Offset : MOS_BITFIELD_RANGE(16, 31); 751 }; 752 struct 753 { 754 uint32_t value; 755 }; 756 } DW48; 757 758 // DW49 759 union 760 { 761 struct 762 { 763 uint32_t lumaLog2WeightDenom : MOS_BITFIELD_RANGE(0, 2); 764 uint32_t reserved1 : MOS_BITFIELD_RANGE(3, 7); 765 uint32_t roiEnableFlag : MOS_BITFIELD_RANGE(8, 8); 766 uint32_t reserved2 : MOS_BITFIELD_RANGE(9, 31); 767 }; 768 struct 769 { 770 uint32_t value; 771 }; 772 } DW49; 773 774 }; 775 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CurbeData)) == 50); 776 777 CmThreadSpace *m_threadSpace = nullptr; 778 CmProgram *m_cmProgram = nullptr; 779 // every reference frame has own CmKernel and input/output surfaces 780 // for L0 references - [0, CODEC_WP_OUTPUT_L1_START - 1], for L1 references - [CODEC_WP_OUTPUT_L1_START, CODEC_NUM_WP_FRAME - 1] 781 CmKernel *m_cmKrn[CODEC_NUM_WP_FRAME] = { nullptr }; 782 CmSurface2D *m_wpInputSurface[CODEC_NUM_WP_FRAME] = { nullptr }; 783 CmSurface2D *m_wpOutputSurface[CODEC_NUM_WP_FRAME] = { nullptr }; 784 785 //! 786 //! \brief Set Curbe 787 //! 788 //! \return MOS_STATUS 789 //! MOS_STATUS_SUCCESS if success, else fail reason 790 //! 791 MOS_STATUS SetCurbe(CurbeData& curbe); 792 793 MOS_STATUS SetupSurfaces(uint8_t wpKrnIdx); 794 virtual MOS_STATUS SetupKernelArgs(uint8_t wpKrnIdx); 795 MOS_STATUS ReleaseResources(); 796 797 }; 798 799 #endif // __CODECHAL_ENCODE_WP_MDF_G12_H__ 800