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