1 /*===================== begin_copyright_notice ==================================
2 
3 # Copyright (c) 2020-2022, 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 ======================= end_copyright_notice ==================================*/
24 //!
25 //! \file     codechal_vdenc_avc_xe_hpm.cpp
26 //! \brief    This file implements the C++ class/interface for Xe_HPM platform's AVC
27 //!           VDEnc encoding to be used CODECHAL components.
28 //!
29 
30 #include "codechal_vdenc_avc_xe_hpm.h"
31 #include "codechal_mmc_encode_avc_xe_hpm.h"
32 #include "mos_solo_generic.h"
33 #include "mhw_mmio_g12.h"
34 #include "mhw_mi_g12_X.h"
35 #include "codechal_hw_g12_X.h"
36 
37 static const uint32_t TrellisQuantizationRoundingXe_Hpm[NUM_VDENC_TARGET_USAGE_MODES] =
38     {
39         0, 3, 3, 3, 3, 3, 3, 3};
40 
41 static const bool TrellisQuantizationEnableXe_Hpm[NUM_VDENC_TARGET_USAGE_MODES] =
42     {
43         0, 1, 1, 0, 0, 0, 0, 0};
44 
45 const uint16_t CodechalVdencAvcStateXe_Hpm::SliceSizeThrsholdsP_Xe_Hpm[52] =  // slice size threshold delta for P frame targeted for 99% compliance
46 {
47     850, 850, 850, 850, 850, 850, 850, 850, 850, 850,  //[ 0- 9]
48     525, 525, 325, 325, 325, 325, 325, 325, 325, 325,  //[10-19]
49     250, 250, 250, 250, 250, 250, 250, 250, 250, 250,  //[20-29]
50     250, 250, 250, 250, 250, 125, 125, 125, 125, 125,  //[30-39]
51     125, 125, 125, 125, 125, 125, 125, 125, 125, 125,  //[40-49]
52     125, 125  //[50-51]
53 };
54 
55 const uint16_t CodechalVdencAvcStateXe_Hpm::SliceSizeThrsholdsI_Xe_Hpm[52] =  // slice size threshold delta for I frame targeted for 99% compliance
56 {
57     850, 850, 850, 850, 850, 850, 850, 850, 850, 850,  //[ 0- 9]
58     525, 525, 325, 325, 325, 325, 325, 325, 325, 325,  //[10-19]
59     250, 250, 250, 250, 250, 250, 250, 250, 250, 250,  //[20-29]
60     250, 250, 250, 250, 250, 125, 125, 125, 125, 125,  //[30-39]
61     125, 125, 125, 125, 125, 125, 125, 125, 125, 125,  //[40-49]
62     125, 125  //[50-51]
63 };
64 
65 const uint8_t CodechalVdencAvcStateXe_Hpm::G0_P_InterRounding[] =
66 {
67     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[0~12]
68     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[13~25]
69     3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,  //QP=[26~38]
70     1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0   //QP=[39~51]
71 };
72 
73 const uint8_t CodechalVdencAvcStateXe_Hpm::G0_P_IntraRounding[] =
74 {
75     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[0~12]
76     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[13~25]
77     4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3,  //QP=[26~38]
78     2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0   //QP=[39~51]
79 };
80 
81 const uint8_t CodechalVdencAvcStateXe_Hpm::G3_P_InterRounding[] =
82 {
83     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[0~12]
84     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3,  //QP=[13~25]
85     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[26~38]
86     3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2   //QP=[39~51]
87 };
88 
89 const uint8_t CodechalVdencAvcStateXe_Hpm::G3_P_IntraRounding[] =
90 {
91     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[0~12]
92     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[13~25]
93     4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3,  //QP=[26~38]
94     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3   //QP=[39~51]
95 };
96 
97 const uint8_t CodechalVdencAvcStateXe_Hpm::G3_rB_InterRounding[] =
98 {
99     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[0~12]
100     3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,  //QP=[13~25]
101     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  //QP=[26~38]
102     1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0   //QP=[39~51]
103 };
104 
105 const uint8_t CodechalVdencAvcStateXe_Hpm::G3_rB_IntraRounding[] =
106 {
107     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[0~12]
108     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[13~25]
109     4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3,  //QP=[26~38]
110     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3   //QP=[39~51]
111 };
112 
113 const uint8_t CodechalVdencAvcStateXe_Hpm::G3_B_InterRounding[] =
114 {
115     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[0~12]
116     3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1,  //QP=[13~25]
117     1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //QP=[26~38]
118     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0   //QP=[39~51]
119 };
120 
121 const uint8_t CodechalVdencAvcStateXe_Hpm::G3_B_IntraRounding[] =
122 {
123     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  //QP=[0~12]
124     4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3,  //QP=[13~25]
125     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  //QP=[26~38]
126     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2   //QP=[39~51]
127 };
128 
129 static const uint8_t tableHucConstData[5][630] = {
130       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
131       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
132       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
133       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
134       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
135       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
136       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
137       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
138      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
139      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
140      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
141      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
142      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
143      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  31,  31,  31,  31,  31,
144      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
145      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  42,  45,  45,  45,  45,  45,  45,  45,  45,
146      28,  28,  28,  32,  36,  44,  48,  26,  30,  32,  36,  26,  30,  30,  24,  28,  24,  24,  20,  20,  22,
147      20,  20,  20,  18,  18,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  14,  14,  14,  14,  14,
148       2,   0,   2,   0,   2,   0,   3,   0,   4,   0,   5,   0,   6,   0,   8,   0,  10,   0,  13,   0,  16,
149       0,  20,   0,  26,   0,  33,   0,  41,   0,  52,   0,  66,   0,  83,   0, 104,   0, 132,   0, 166,   0,
150     209,   0,   8,   1,  76,   1, 163,   1,  16,   2, 153,   2,  70,   3,  32,   4,  51,   5, 141,   6,  65,
151       8, 102,  10,  26,  13, 130,  16, 204,  20,  52,  26,   4,  33, 153,  41, 105,  52,   9,  66,  51,  83,
152       2,   0,   2,   0,   2,   0,   2,   0,   3,   0,   3,   0,   4,   0,   4,   0,   5,   0,   5,   0,   6,
153       0,   7,   0,   8,   0,   9,   0,  10,   0,  11,   0,  13,   0,  14,   0,  16,   0,  18,   0,  20,   0,
154      23,   0,  26,   0,  29,   0,  33,   0,  37,   0,  41,   0,  46,   0,  52,   0,  58,   0,  66,   0,  74,
155       0,  83,   0,  93,   0, 104,   0, 117,   0, 132,   0, 148,   0, 166,   0, 186,   0, 209,   0, 235,   0,
156       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
157       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
158       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
159       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
160       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
161       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
162       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
163       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
164       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
165       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
166       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
167       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
168      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
169      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
170      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
171      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
172      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
173      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  31,  31,  31,  31,  31,
174      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
175      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  42,  45,  45,  45,  45,  45,  45,  45,  45,
176      12,  12,  12,  14,  16,  18,  20,  10,  12,  14,  16,  12,  14,  14,  14,  14,  12,  14,  14,  12,  14,
177      14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
178       2,   0,   2,   0,   2,   0,   2,   0,   3,   0,   4,   0,   5,   0,   6,   0,   8,   0,  10,   0,  12,
179       0,  16,   0,  20,   0,  25,   0,  32,   0,  40,   0,  50,   0,  64,   0,  80,   0, 101,   0, 128,   0,
180     161,   0, 203,   0,   0,   1,  66,   1, 150,   1,   0,   2, 133,   2,  44,   3,   0,   4,  10,   5,  89,
181       6,   0,   8,  20,  10, 178,  12,   0,  16,  40,  20, 101,  25,   0,  32,  81,  40, 203,  50,   0,  64,
182       3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   4,   0,   4,   0,   5,   0,   6,   0,   6,   0,   7,
183       0,   8,   0,   9,   0,  10,   0,  12,   0,  13,   0,  15,   0,  16,   0,  19,   0,  21,   0,  24,   0,
184      26,   0,  30,   0,  33,   0,  38,   0,  42,   0,  48,   0,  53,   0,  60,   0,  67,   0,  76,   0,  85,
185       0,  96,   0, 107,   0, 120,   0, 135,   0, 152,   0, 171,   0, 192,   0, 215,   0, 241,   0,  15,   1,
186       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   3,   3,   3,   3,   3,   3,
187       3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   2,   2,   2,   2,   2,   2,
188       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
189       4,   4,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
190       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
191       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
192       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
193       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
194       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
195       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
196       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
197       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
198      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
199      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
200      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
201      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
202      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
203      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  31,  31,  31,  31,  31,
204      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
205      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  42,  45,  45,  45,  45,  45,  45,  45,  45,
206      12,  12,  12,  14,  16,  18,  20,  10,  12,  14,  16,  12,  14,  14,  14,  14,  12,  14,  14,  12,  14,
207      14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
208       3,   0,   3,   0,   3,   0,   4,   0,   5,   0,   6,   0,   8,   0,  10,   0,  12,   0,  16,   0,  20,
209       0,  25,   0,  32,   0,  40,   0,  51,   0,  64,   0,  81,   0, 102,   0, 129,   0, 162,   0, 204,   0,
210       2,   1,  69,   1, 153,   1,   4,   2, 138,   2,  51,   3,   8,   4,  20,   5, 102,   6,  16,   8,  40,
211      10, 204,  12,  32,  16,  81,  20, 153,  25,  65,  32, 163,  40,  51,  51, 130,  64,  70,  81, 102, 102,
212       3,   0,   3,   0,   3,   0,   4,   0,   4,   0,   5,   0,   5,   0,   6,   0,   7,   0,   8,   0,   9,
213       0,  10,   0,  11,   0,  12,   0,  14,   0,  16,   0,  18,   0,  20,   0,  22,   0,  25,   0,  28,   0,
214      32,   0,  36,   0,  40,   0,  45,   0,  51,   0,  57,   0,  64,   0,  72,   0,  81,   0,  91,   0, 102,
215       0, 115,   0, 129,   0, 145,   0, 162,   0, 182,   0, 205,   0, 230,   0,   2,   1,  34,   1,  69,   1,
216       3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
217       2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
218       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
219       4,   4,   4,   4,   3,   3,   3,   3,   2,   2,   2,   2,   1,   1,   1,   1,   0,   0,   0,   0,   0,
220       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
221       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
222       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
223       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
224       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
225       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
226       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
227       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
228      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
229      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
230      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
231      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
232      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
233      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  31,  31,  31,  31,  31,
234      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
235      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  42,  45,  45,  45,  45,  45,  45,  45,  45,
236      14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
237      14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
238       4,   0,   4,   0,   4,   0,   6,   0,   7,   0,   9,   0,  12,   0,  15,   0,  19,   0,  24,   0,  30,
239       0,  38,   0,  48,   0,  60,   0,  76,   0,  96,   0, 121,   0, 153,   0, 193,   0, 243,   0,  51,   1,
240     131,   1, 231,   1, 102,   2,   6,   3, 207,   3, 204,   4,  12,   6, 158,   7, 153,   9,  24,  12,  61,
241      15,  51,  19,  48,  24, 122,  30, 102,  38,  97,  48, 244,  60, 204,  76, 195,  96, 233, 121, 153, 153,
242       4,   0,   4,   0,   4,   0,   4,   0,   5,   0,   6,   0,   6,   0,   7,   0,   8,   0,   9,   0,  11,
243       0,  12,   0,  13,   0,  15,   0,  17,   0,  19,   0,  22,   0,  24,   0,  27,   0,  31,   0,  35,   0,
244      39,   0,  44,   0,  49,   0,  55,   0,  62,   0,  70,   0,  79,   0,  88,   0,  99,   0, 111,   0, 125,
245       0, 140,   0, 158,   0, 177,   0, 199,   0, 223,   0, 250,   0,  25,   1,  60,   1,  98,   1, 142,   1,
246       3,   3,   3,   3,   3,   3,   3,   3,   3,   2,   2,   2,   2,   1,   1,   1,   1,   0,   0,   0,   0,
247       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
248       4,   4,   4,   4,   4,   4,   4,   4,   4,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
249       3,   3,   3,   3,   3,   3,   3,   3,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
250       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
251       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
252       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
253       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
254       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
255       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
256       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
257       5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
258      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
259      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
260      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
261      10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
262      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
263      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  31,  31,  31,  31,  31,
264      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
265      26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  42,  45,  45,  45,  45,  45,  45,  45,  45,
266      14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
267      14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
268       3,   0,   3,   0,   3,   0,   4,   0,   5,   0,   7,   0,   9,   0,  11,   0,  14,   0,  18,   0,  22,
269       0,  28,   0,  36,   0,  45,   0,  57,   0,  72,   0,  91,   0, 115,   0, 145,   0, 182,   0, 230,   0,
270      34,   1, 109,   1, 204,   1,  68,   2, 219,   2, 153,   3, 137,   4, 182,   5,  51,   7,  18,   9, 109,
271      11, 102,  14,  36,  18, 219,  22, 204,  28,  73,  36, 183,  45, 153,  57, 146,  72, 111,  91,  51, 115,
272       3,   0,   3,   0,   3,   0,   4,   0,   4,   0,   5,   0,   5,   0,   6,   0,   7,   0,   8,   0,   9,
273       0,  10,   0,  11,   0,  12,   0,  14,   0,  16,   0,  18,   0,  20,   0,  22,   0,  25,   0,  28,   0,
274      32,   0,  36,   0,  40,   0,  45,   0,  51,   0,  57,   0,  64,   0,  72,   0,  81,   0,  91,   0, 102,
275       0, 115,   0, 129,   0, 145,   0, 162,   0, 182,   0, 205,   0, 230,   0,   2,   1,  34,   1,  69,   1,
276       3,   3,   3,   3,   3,   3,   3,   3,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
277       1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
278       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
279       4,   4,   4,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3
280 };
281 
Initialize(CodechalSetting * settings)282 MOS_STATUS CodechalVdencAvcStateXe_Hpm::Initialize(CodechalSetting *settings)
283 {
284     CODECHAL_ENCODE_FUNCTION_ENTER;
285 
286     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalVdencAvcStateG12::Initialize(settings));
287 
288     m_staticFrameDetectionEnable = false;
289 
290     // for brc 2nd level BB usage
291     m_mfxAvcImgStateSize    = m_mfxInterface->GetAvcImgStateSize();
292     m_vdencCmd3Size         = m_vdencInterface->GetVdencCmd3Size();
293     m_vdencAvcImgStateSize  = m_vdencInterface->GetVdencAvcImgStateSize();
294     m_mfxAvcSlcStateSize    = m_mfxInterface->GetAvcSlcStateSize();
295     m_vdencAvcSlcStateSize  = m_vdencInterface->GetVdencAvcSlcStateSize();
296     m_miBatchBufferEndSize  = m_miInterface->GetMiBatchBufferEndCmdSize();
297 
298     return MOS_STATUS_SUCCESS;
299 }
300 
InitializeState()301 MOS_STATUS CodechalVdencAvcStateXe_Hpm::InitializeState()
302 {
303     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
304 
305     CODECHAL_ENCODE_FUNCTION_ENTER;
306 
307     // common initilization
308     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalVdencAvcStateG12::InitializeState());
309     // disable HME after reg key reading, but before HME allocation
310     m_hmeSupported = false;  // Xe_HPM don't support HME
311 
312     // disable CSC since only VDEnc natively supported formats are permitted
313     if (m_cscDsState)
314     {
315         m_cscDsState->DisableCsc();
316         m_cscDsState->EnableCopy();
317         m_cscDsState->EnableMediaCopy();
318     }
319 
320     return eStatus;
321 }
322 
~CodechalVdencAvcStateXe_Hpm()323 CodechalVdencAvcStateXe_Hpm::~CodechalVdencAvcStateXe_Hpm()
324 {
325     CODECHAL_ENCODE_FUNCTION_ENTER;
326 
327     m_osInterface->pfnFreeResource(m_osInterface, &m_hucAuthBuf);
328 
329     for (auto j = 0; j < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; j++)
330     {
331         MOS_STATUS eStatus = Mhw_FreeBb(m_hwInterface->GetOsInterface(), &m_2ndLevelBB[j], nullptr);
332         ENCODE_ASSERT(eStatus == MOS_STATUS_SUCCESS);
333     }
334 }
335 
GetAdaptiveRoundingNumSlices()336 uint16_t CodechalVdencAvcStateXe_Hpm::GetAdaptiveRoundingNumSlices()
337 {
338     return static_cast<uint16_t>(m_numSlices);
339 }
340 
InitMmcState()341 MOS_STATUS CodechalVdencAvcStateXe_Hpm::InitMmcState()
342 {
343     CODECHAL_ENCODE_FUNCTION_ENTER;
344 #ifdef _MMC_SUPPORTED
345     m_mmcState = MOS_New(CodechalMmcEncodeAvcXe_Hpm, m_hwInterface, this);
346     CODECHAL_ENCODE_CHK_NULL_RETURN(m_mmcState);
347 #endif
348     return MOS_STATUS_SUCCESS;
349 }
350 
DeltaQPUpdate(uint8_t QpModulationStrength)351 MOS_STATUS CodechalVdencAvcStateXe_Hpm::DeltaQPUpdate(uint8_t QpModulationStrength)
352 {
353     CODECHAL_ENCODE_FUNCTION_ENTER;
354     uint8_t QpStrength = (uint8_t)(QpModulationStrength + (QpModulationStrength >> 1));
355     if (!m_isFirstDeltaQP)
356     {
357         if (QpModulationStrength == 0)
358         {
359             m_qpModulationStrength = 0;
360         }
361         else
362         {
363             m_qpModulationStrength = (m_qpModulationStrength + QpStrength + 1) >> 1;
364         }
365     }
366     else
367     {
368         m_qpModulationStrength = QpStrength;
369         if (m_currPass == m_numPasses)
370         {
371             m_isFirstDeltaQP = false;
372         }
373     }
374 
375     return MOS_STATUS_SUCCESS;
376 }
377 
MotionEstimationDisableCheck()378 void CodechalVdencAvcStateXe_Hpm::MotionEstimationDisableCheck()
379 {
380     m_16xMeSupported = false;
381     m_32xMeSupported = false;
382 }
383 
AllocateResources()384 MOS_STATUS CodechalVdencAvcStateXe_Hpm::AllocateResources()
385 {
386     CODECHAL_ENCODE_FUNCTION_ENTER;
387 
388     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalVdencAvcStateG12::AllocateResources());
389 
390     if (!MEDIA_IS_WA(m_waTable, WaEnableOnlyASteppingFeatures))
391     {
392         // VDEnc colocated MV buffer size
393         m_vdencMvTemporalBufferSize = (((uint32_t)m_picHeightInMb * m_picWidthInMb + 1) >> 1) * CODECHAL_CACHELINE_SIZE;
394 
395         // Allocate and initialize pre-generated colocated MV buffer for I frame
396         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_trackedBuf->AllocateMvTemporalBuffer(CODEC_NUM_REF_BUFFERS));
397 
398         PMOS_RESOURCE iBuf = m_trackedBuf->GetMvTemporalBuffer(CODEC_NUM_REF_BUFFERS);
399         CODECHAL_ENCODE_CHK_NULL_RETURN(iBuf);
400 
401         MOS_LOCK_PARAMS lockFlags;
402         MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
403         lockFlags.WriteOnly = 1;
404 
405         uint8_t *pData = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, iBuf, &lockFlags);
406         CODECHAL_ENCODE_CHK_NULL_RETURN(pData);
407         uint32_t *pT = (uint32_t *)(pData) + 7;
408         for (uint32_t j = 0; j < m_picHeightInMb; j++)
409         {
410             for (uint32_t i = 0; i < m_picWidthInMb; i++)
411             {
412                 *pT = 0x4000;
413                 pT += 8;
414             }
415         }
416 
417         m_osInterface->pfnUnlockResource(m_osInterface, iBuf);
418     }
419 
420     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
421 
422     MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferLinear;
423     MOS_ZeroMemory(&allocParamsForBufferLinear, sizeof(MOS_ALLOC_GFXRES_PARAMS));
424     allocParamsForBufferLinear.Type = MOS_GFXRES_BUFFER;
425     allocParamsForBufferLinear.TileType = MOS_TILE_LINEAR;
426     allocParamsForBufferLinear.Format = Format_Buffer;
427 
428     // HUC STATUS 2 Buffer for HuC status check in COND_BB_END
429     allocParamsForBufferLinear.dwBytes = sizeof(uint64_t);
430     allocParamsForBufferLinear.pBufName = "Huc authentication status Buffer";
431     allocParamsForBufferLinear.ResUsageType = MOS_HW_RESOURCE_USAGE_ENCODE_INTERNAL_READ_WRITE_NOCACHE;
432     eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
433         m_osInterface,
434         &allocParamsForBufferLinear,
435         &m_hucAuthBuf);
436 
437     if (eStatus != MOS_STATUS_SUCCESS)
438     {
439         CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate Huc authentication status Buffer.");
440         return eStatus;
441     }
442 
443     for (auto j = 0; j < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; j++)
444     {
445         // second level batch buffer
446         MOS_ZeroMemory(&m_2ndLevelBB[j], sizeof(MHW_BATCH_BUFFER));
447         m_2ndLevelBB[j].bSecondLevel = true;
448         ENCODE_CHK_STATUS_RETURN(Mhw_AllocateBb(
449             m_hwInterface->GetOsInterface(),
450             &m_2ndLevelBB[j],
451             nullptr,
452             CODECHAL_CACHELINE_SIZE));
453     }
454 
455     return MOS_STATUS_SUCCESS;
456 }
457 
AllocateMDFResources()458 MOS_STATUS CodechalVdencAvcStateXe_Hpm::AllocateMDFResources()
459 {
460     //There is no VME on Xe_HPM and there is no needed to allocate MDF resource.
461     return MOS_STATUS_SUCCESS;
462 }
463 
CreateMhwVdboxAvcImgParams()464 PMHW_VDBOX_AVC_IMG_PARAMS CodechalVdencAvcStateXe_Hpm::CreateMhwVdboxAvcImgParams()
465 {
466     CODECHAL_ENCODE_FUNCTION_ENTER;
467     PMHW_VDBOX_AVC_IMG_PARAMS avcImgParams = MOS_New(MHW_VDBOX_AVC_IMG_PARAMS_XE_XPM);
468 
469     return avcImgParams;
470 }
471 
SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS & param)472 void CodechalVdencAvcStateXe_Hpm::SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS& param)
473 {
474     CODECHAL_ENCODE_FUNCTION_ENTER;
475     CodechalVdencAvcStateG12::SetMfxAvcImgStateParams(param);
476     param.biWeight        = m_biWeight;
477 
478     auto paramsXe_Xpm = static_cast<PMHW_VDBOX_AVC_IMG_PARAMS_XE_XPM>(&param);
479 
480     if (!MEDIA_IS_WA(m_waTable, WaEnableOnlyASteppingFeatures)) {
481         if (m_currRefList && m_currRefList->bUsedAsRef && m_pictureCodingType != I_TYPE)
482             paramsXe_Xpm->colMVWriteEnable = true;
483 
484         if (m_pictureCodingType == B_TYPE) {
485             auto TopRefL1 = m_avcSliceParams->RefPicList[LIST_1][0];
486             if (!CodecHal_PictureIsInvalid(TopRefL1) && m_picIdx[TopRefL1.FrameIdx].bValid)
487                 paramsXe_Xpm->colMVReadEnable = true;
488         }
489         paramsXe_Xpm->tuSettingsRevision = 1;
490     }
491 }
492 
SetMfxPipeModeSelectParams(const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS & genericParam,MHW_VDBOX_PIPE_MODE_SELECT_PARAMS & param)493 void CodechalVdencAvcStateXe_Hpm::SetMfxPipeModeSelectParams(
494     const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS &genericParam,
495     MHW_VDBOX_PIPE_MODE_SELECT_PARAMS &param)
496 {
497     CODECHAL_ENCODE_FUNCTION_ENTER;
498     CodechalVdencAvcStateG12::SetMfxPipeModeSelectParams(genericParam, param);
499 
500     auto avcPicParams = m_avcPicParams[m_avcSliceParams->pic_parameter_set_id];
501     auto avcSeqParams = m_avcSeqParams[avcPicParams->seq_parameter_set_id];
502     auto paramGen12   = ((MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12 *)&param);
503 
504     paramGen12->bIsRandomAccess = (avcPicParams->CodingType == B_TYPE);
505     paramGen12->bBRCEnabled     = m_vdencBrcEnabled;
506 
507     if (!MEDIA_IS_WA(m_waTable, WaEnableOnlyASteppingFeatures)) {
508         paramGen12->tuSettingsRevision = 1;
509         paramGen12->tuMinus1 = avcSeqParams->TargetUsage - 1;
510         paramGen12->ucQuantizationPrecision = 1;
511     }
512 }
513 
SetMfxPipeBufAddrStateParams(CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam,MHW_VDBOX_PIPE_BUF_ADDR_PARAMS & param)514 MOS_STATUS CodechalVdencAvcStateXe_Hpm::SetMfxPipeBufAddrStateParams(
515     CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam,
516     MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& param)
517 {
518     CODECHAL_ENCODE_FUNCTION_ENTER;
519     CodechalVdencAvcState::SetMfxPipeBufAddrStateParams(genericParam, param);
520 
521     auto l1RefFrameList = m_avcSliceParams->RefPicList[LIST_1];
522     auto l0RefNum = m_avcSliceParams->num_ref_idx_l0_active_minus1 + 1;
523     for (uint8_t refIdx = 0; refIdx <= m_avcSliceParams->num_ref_idx_l1_active_minus1; refIdx++)
524     {
525         auto refPic = l1RefFrameList[refIdx];
526 
527         if (!CodecHal_PictureIsInvalid(refPic) && m_picIdx[refPic.FrameIdx].bValid)
528         {
529             // L1 references
530             auto refPicIdx = m_picIdx[refPic.FrameIdx].ucPicIdx;
531             param.presVdencReferences[l0RefNum + refIdx] = &m_refList[refPicIdx]->sRefReconBuffer.OsResource;
532             param.presVdenc4xDsSurface[l0RefNum + refIdx] =
533                 &(m_trackedBuf->Get4xDsReconSurface(m_refList[refPicIdx]->ucScalingIdx))->OsResource;
534         }
535     }
536 
537     if (m_currRefList && m_currRefList->bUsedAsRef) {
538         m_currRefList->bIsIntra = (m_pictureCodingType == I_TYPE);
539         param.presVdencColocatedMVWriteBuffer = (m_currRefList->bIsIntra) ? nullptr : m_trackedBuf->GetMvTemporalBuffer(CODEC_CURR_TRACKED_BUFFER);
540     } else {
541         param.presVdencColocatedMVWriteBuffer = nullptr;
542     }
543 
544     if (m_pictureCodingType == B_TYPE) {
545         auto TopRefL1 = l1RefFrameList[0];
546         if (!CodecHal_PictureIsInvalid(TopRefL1) && m_picIdx[TopRefL1.FrameIdx].bValid) {
547             auto refList = m_refList[m_picIdx[TopRefL1.FrameIdx].ucPicIdx];
548             param.presVdencColocatedMVReadBuffer = m_trackedBuf->GetMvTemporalBuffer((refList->bIsIntra) ? CODEC_NUM_REF_BUFFERS : refList->ucScalingIdx);
549         } else
550             param.presVdencColocatedMVReadBuffer = nullptr;
551     }
552 
553 #ifdef _MMC_SUPPORTED
554     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mmcState->SetSurfaceState(param.pDecodedReconParam));
555     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mmcState->SetSurfaceState(param.pRawSurfParam));
556 #endif
557     return MOS_STATUS_SUCCESS;
558 }
559 
GetTrellisQuantization(PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params,PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams)560 MOS_STATUS CodechalVdencAvcStateXe_Hpm::GetTrellisQuantization(PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params, PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams)
561 {
562     CODECHAL_ENCODE_FUNCTION_ENTER;
563 
564     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
565     CODECHAL_ENCODE_CHK_NULL_RETURN(trellisQuantParams);
566 
567     trellisQuantParams->dwTqEnabled  = TrellisQuantizationEnableXe_Hpm[params->ucTargetUsage];
568     trellisQuantParams->dwTqRounding = trellisQuantParams->dwTqEnabled ? TrellisQuantizationRoundingXe_Hpm[params->ucTargetUsage] : 0;
569 
570     return MOS_STATUS_SUCCESS;
571 }
572 
LoadHmeMvCostTable(PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,uint8_t hmeMvCostTable[8][42])573 MOS_STATUS CodechalVdencAvcStateXe_Hpm::LoadHmeMvCostTable(PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams, uint8_t hmeMvCostTable[8][42])
574 {
575     CODECHAL_ENCODE_FUNCTION_ENTER;
576 
577     return MOS_STATUS_SUCCESS;
578 }
579 
FillHucConstData(uint8_t * data,uint8_t picType)580 MOS_STATUS CodechalVdencAvcStateXe_Hpm::FillHucConstData(uint8_t *data, uint8_t picType)
581 {
582     CODECHAL_ENCODE_FUNCTION_ENTER;
583     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalVdencAvcState::FillHucConstData(data, picType));
584 
585     auto codingType = picType + 1;
586     auto type = codingType == I_TYPE ? 0 :
587                 codingType == P_TYPE ? (m_avcSeqParam->GopRefDist == 1 ? 2 : 1) :
588                 codingType == B_TYPE ? 3 : 4;
589 
590     auto hucConstData = (PAVCVdencBRCCostantDataXe_Hpm)data;
591     MOS_SecureMemcpy(hucConstData->Reserved, sizeof(hucConstData->Reserved), tableHucConstData[type], 630);
592 
593     return MOS_STATUS_SUCCESS;
594 }
595 
SetRounding(PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS param,PMHW_VDBOX_AVC_SLICE_STATE sliceState)596 MOS_STATUS CodechalVdencAvcStateXe_Hpm::SetRounding(PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS param, PMHW_VDBOX_AVC_SLICE_STATE sliceState)
597 {
598     CODECHAL_ENCODE_FUNCTION_ENTER;
599 
600     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState);
601     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcSeqParams);
602     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcPicParams);
603     CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcSliceParams);
604 
605     auto    avcSeqParams   = sliceState->pEncodeAvcSeqParams;
606     auto    avcPicParams   = sliceState->pEncodeAvcPicParams;
607     auto    avcSliceParams = sliceState->pEncodeAvcSliceParams;
608     uint8_t sliceQP        = avcPicParams->pic_init_qp_minus26 + 26 + avcSliceParams->slice_qp_delta;
609 
610     sliceState->dwRoundingIntraValue = 5;
611     sliceState->bRoundingInterEnable = m_roundingInterEnable;
612 
613     switch (Slice_Type[avcSliceParams->slice_type])
614     {
615     case SLICE_P:
616         if (m_roundingInterP == CODECHAL_ENCODE_AVC_INVALID_ROUNDING)
617         {
618             if (m_adaptiveRoundingInterEnable && !m_vdencBrcEnabled)
619             {
620                 if (avcSeqParams->GopRefDist == 1)
621                 {
622                     sliceState->dwRoundingIntraValue = G0_P_IntraRounding[sliceQP];
623                     sliceState->dwRoundingValue      = G0_P_InterRounding[sliceQP];
624                 }
625                 else
626                 {
627                     sliceState->dwRoundingIntraValue = G3_P_IntraRounding[sliceQP];
628                     sliceState->dwRoundingValue      = G3_P_InterRounding[sliceQP];
629                 }
630             }
631             else
632                 sliceState->dwRoundingValue = CodechalVdencAvcState::InterRoundingP[avcSeqParams->TargetUsage];
633         }
634         else
635             sliceState->dwRoundingValue = m_roundingInterP;
636 
637         break;
638     case SLICE_B:
639         if (m_adaptiveRoundingInterEnable && !m_vdencBrcEnabled)
640         {
641             if (m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef)
642             {
643                 sliceState->dwRoundingIntraValue = G3_rB_IntraRounding[sliceQP];
644                 sliceState->dwRoundingValue      = G3_rB_InterRounding[sliceQP];
645             }
646             else
647             {
648                 sliceState->dwRoundingIntraValue = G3_B_IntraRounding[sliceQP];
649                 sliceState->dwRoundingValue      = G3_B_InterRounding[sliceQP];
650             }
651         }
652         else
653         {
654             if (m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef)
655                 sliceState->dwRoundingValue = InterRoundingBRef[avcSeqParams->TargetUsage];
656             else
657                 sliceState->dwRoundingValue = InterRoundingB[avcSeqParams->TargetUsage];
658         }
659         break;
660     default:
661         // do nothing
662         break;
663     }
664 
665     if (param != nullptr && param->bEnableCustomRoudingIntra)
666     {
667         sliceState->dwRoundingIntraValue = param->dwRoundingIntra;
668     }
669 
670     if (param != nullptr && param->bEnableCustomRoudingInter)
671     {
672         sliceState->bRoundingInterEnable = true;
673         sliceState->dwRoundingValue      = param->dwRoundingInter;
674     }
675 
676     return MOS_STATUS_SUCCESS;
677 }
678 
SetupWalkerContext(MOS_COMMAND_BUFFER * cmdBuffer,SendKernelCmdsParams * params)679 MOS_STATUS CodechalVdencAvcStateXe_Hpm::SetupWalkerContext(
680         MOS_COMMAND_BUFFER* cmdBuffer,
681         SendKernelCmdsParams* params)
682 {
683     //There is no VME on Xe_HPM
684 
685     return MOS_STATUS_SUCCESS;
686 }
687 
CopyMBQPDataToStreamIn(CODECHAL_VDENC_STREAMIN_STATE * pData,uint8_t * pInputData)688 void CodechalVdencAvcStateXe_Hpm::CopyMBQPDataToStreamIn(CODECHAL_VDENC_STREAMIN_STATE* pData, uint8_t* pInputData)
689 {
690     CODECHAL_ENCODE_FUNCTION_ENTER;
691     for (uint32_t curY = 0; curY < m_picHeightInMb; curY++)
692     {
693         for (uint32_t curX = 0; curX < m_picWidthInMb; curX++)
694         {
695             uint8_t qpData = *(pInputData + m_encodeParams.psMbQpDataSurface->dwPitch * curY + curX);
696 
697             pData->DW0.RegionOfInterestRoiSelection = 0;
698             pData->DW1.Qpprimey = m_avcPicParam->NumDeltaQpForNonRectROI == 0 ? qpData  // MBQP in ForceQP mode
699                 : (qpData == 0 ? 0 : m_avcPicParam->NonRectROIDeltaQpList[qpData - 1]); // MBQP in DeltaQP mode
700             pData++;
701         }
702     }
703 }
704 
CheckSupportedFormat(PMOS_SURFACE surface)705 bool CodechalVdencAvcStateXe_Hpm::CheckSupportedFormat(PMOS_SURFACE surface)
706 {
707     CODECHAL_ENCODE_FUNCTION_ENTER;
708 
709     bool colorFormatSupported = false;
710     if (IS_Y_MAJOR_TILE_FORMAT(surface->TileType) || (surface->TileType == MOS_TILE_LINEAR))
711     {
712         switch (surface->Format)
713         {
714         case Format_NV12:
715         case Format_YUY2:
716         case Format_AYUV:
717         case Format_A8R8G8B8:
718         case Format_A8B8G8R8:
719         case Format_YUYV:
720         case Format_YVYU:
721         case Format_UYVY:
722         case Format_VYUY:
723             colorFormatSupported = true;
724             break;
725         default:
726             break;
727         }
728     }
729 
730     return colorFormatSupported;
731 }
732 
SetPictureStructs()733 MOS_STATUS CodechalVdencAvcStateXe_Hpm::SetPictureStructs()
734 {
735     CODECHAL_ENCODE_FUNCTION_ENTER;
736 
737     m_vdencStreamInEnabled = false;  // will be set for each frame
738 
739     MOS_STATUS status = CodechalVdencAvcStateG12::SetPictureStructs();
740 
741     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupThirdRef(
742         &(m_resVdencStreamInBuffer[m_currRecycledBufIdx])));
743 
744     return status;
745 }
746 
SetupThirdRef(PMOS_RESOURCE vdencStreamIn)747 MOS_STATUS CodechalVdencAvcStateXe_Hpm::SetupThirdRef(
748     PMOS_RESOURCE vdencStreamIn)
749 {
750     CODECHAL_ENCODE_FUNCTION_ENTER;
751 
752     if (m_pictureCodingType == I_TYPE)
753         return MOS_STATUS_SUCCESS;
754 
755     CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcPicParam->RefFrameList);
756     CODECHAL_ENCODE_CHK_NULL_RETURN(vdencStreamIn);
757 
758     auto ppsIdx = m_avcSliceParams->pic_parameter_set_id;
759 
760     // Only reference frames with predictors are utilized. Only 2 for VDEnc. One more predictor is added below via StreamIn
761     constexpr int32_t numPredictorsVdenc = 2;
762     const int32_t     listedRefs         = m_avcSliceParams[ppsIdx].num_ref_idx_l0_active_minus1 + 1 + (m_pictureCodingType == B_TYPE);
763 
764     if (listedRefs <= numPredictorsVdenc)  // all reference frames are utilized
765         return MOS_STATUS_SUCCESS;
766 
767     int32_t toUtilizeIdx = numPredictorsVdenc - (m_pictureCodingType == B_TYPE);  // First from L0 to utilize: 3rd for P, 2nd for B
768 
769     MOS_LOCK_PARAMS lockFlags;
770     MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
771     lockFlags.WriteOnly = 1;
772 
773     auto pData = (CODECHAL_VDENC_STREAMIN_STATE *)m_osInterface->pfnLockResource(
774         m_osInterface,
775         vdencStreamIn,
776         &lockFlags);
777     CODECHAL_ENCODE_CHK_NULL_RETURN(pData);
778 
779     if (!m_vdencStreamInEnabled)  // check to allow streamIn sharing
780     {
781         uint32_t picSizeInMb = m_picHeightInMb * m_picWidthInMb;
782         MOS_ZeroMemory(pData, picSizeInMb * CODECHAL_VDENC_STREAMIN_STATE::byteSize);
783         m_vdencStreamInEnabled = true;
784     }
785 
786     for (int32_t curMB = 0; curMB < m_picHeightInMb * m_picWidthInMb; curMB++)
787     {
788         pData[curMB].DW2.FwdPredictorX = 0;
789         pData[curMB].DW2.FwdPredictorY = 0;
790         pData[curMB].DW4.FwdRefid0     = toUtilizeIdx;
791     }
792 
793     m_osInterface->pfnUnlockResource(
794         m_osInterface,
795         vdencStreamIn);
796 
797     CODECHAL_DEBUG_TOOL(
798         m_debugInterface->m_currPic            = m_avcPicParam->CurrOriginalPic;
799         m_debugInterface->m_bufferDumpFrameNum = m_storeData;
800         m_debugInterface->m_frameType          = m_pictureCodingType;
801 
802         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
803             &(m_resVdencStreamInBuffer[m_currRecycledBufIdx]),
804             CodechalDbgAttr::attrStreamIn,
805             "_3rdRef",
806             m_picWidthInMb * m_picHeightInMb * CODECHAL_CACHELINE_SIZE,
807             0,
808             CODECHAL_NUM_MEDIA_STATES));
809     )
810 
811     return MOS_STATUS_SUCCESS;
812 }
813 
ValidateNumReferences(PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params)814 MOS_STATUS CodechalVdencAvcStateXe_Hpm::ValidateNumReferences(PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params)
815 {
816     MOS_STATUS        eStatus             = MOS_STATUS_SUCCESS;
817     constexpr uint8_t MaxNumRefPMinusOne  = 2;  // caps.MaxNum_Reference0-1 for all TUs
818     constexpr uint8_t MaxNumRefB0MinusOne = 0;  // no corresponding caps
819     constexpr uint8_t MaxNumRefB1MinusOne = 0;  // caps.MaxNum_Reference1-1 for all TUs
820 
821     CODECHAL_ENCODE_FUNCTION_ENTER;
822 
823     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
824     CODECHAL_ENCODE_CHK_NULL_RETURN(params->pAvcSliceParams);
825 
826     uint8_t numRefIdx0MinusOne = params->pAvcSliceParams->num_ref_idx_l0_active_minus1;
827     uint8_t numRefIdx1MinusOne = params->pAvcSliceParams->num_ref_idx_l1_active_minus1;
828 
829     if (params->wPictureCodingType == P_TYPE)
830     {
831         if (numRefIdx0MinusOne > MaxNumRefPMinusOne)
832         {
833             CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size (P).");
834             numRefIdx0MinusOne = MaxNumRefPMinusOne;
835         }
836 
837         numRefIdx1MinusOne = 0;
838     }
839     else if (params->wPictureCodingType == B_TYPE)
840     {
841         if (numRefIdx0MinusOne > MaxNumRefB0MinusOne)
842         {
843             CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size (B0).");
844             numRefIdx0MinusOne = MaxNumRefB0MinusOne;
845         }
846 
847         if (numRefIdx1MinusOne > MaxNumRefB1MinusOne)
848         {
849             CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list1 size (B1).");
850             numRefIdx1MinusOne = MaxNumRefB1MinusOne;
851         }
852     }
853 
854     params->pAvcSliceParams->num_ref_idx_l0_active_minus1 = numRefIdx0MinusOne;
855     params->pAvcSliceParams->num_ref_idx_l1_active_minus1 = numRefIdx1MinusOne;
856 
857     return eStatus;
858 }
859 
GetCurrConstDataBufIdx()860 uint32_t CodechalVdencAvcStateXe_Hpm::GetCurrConstDataBufIdx()
861 {
862     return m_avcPicParam->CodingType == B_TYPE && m_avcPicParam->RefPicFlag ? m_avcPicParam->CodingType // refB
863                                                                             : m_avcPicParam->CodingType - 1;
864 }
865 
PackHucAuthCmds(MOS_COMMAND_BUFFER & cmdBuffer)866 MOS_STATUS CodechalVdencAvcStateXe_Hpm::PackHucAuthCmds(MOS_COMMAND_BUFFER &cmdBuffer)
867 {
868     CODECHAL_ENCODE_FUNCTION_ENTER;
869 
870     // Write HuC Load Info Mask
871     MHW_MI_STORE_DATA_PARAMS storeDataParams;
872     storeDataParams.pOsResource         = &m_hucAuthBuf;
873     storeDataParams.dwResourceOffset    = 0;
874     storeDataParams.dwValue             = HUC_LOAD_INFO_REG_MASK_G12;
875     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiStoreDataImmCmd(&cmdBuffer, &storeDataParams));
876 
877     // Store Huc Auth register
878     MHW_MI_STORE_REGISTER_MEM_PARAMS storeRegParams;
879     MOS_ZeroMemory(&storeRegParams, sizeof(storeRegParams));
880     storeRegParams.presStoreBuffer = &m_hucAuthBuf;
881     storeRegParams.dwOffset        = sizeof(uint32_t);
882     storeRegParams.dwRegister      = m_hucInterface->GetMmioRegisters(MHW_VDBOX_NODE_1)->hucLoadInfoOffset;
883     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiStoreRegisterMemCmd(&cmdBuffer, &storeRegParams));
884 
885     MHW_MI_FLUSH_DW_PARAMS flushDwParams;
886     MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
887     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(&cmdBuffer, &flushDwParams));
888 
889     // Check Huc auth: if equals to 0 continue chained BB until reset, otherwise send BB end cmd.
890     uint32_t compareOperation = mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADEQUALIDD;
891     auto hwInterface = dynamic_cast<CodechalHwInterfaceG12 *>(m_hwInterface);
892     CODECHAL_ENCODE_CHK_NULL_RETURN(hwInterface);
893     CODECHAL_ENCODE_CHK_STATUS_RETURN(hwInterface->SendCondBbEndCmd(
894         &m_hucAuthBuf, 0, 0, false, true, compareOperation, &cmdBuffer));
895 
896     // Chained BB loop
897     CODECHAL_ENCODE_CHK_STATUS_RETURN(static_cast<MhwMiInterfaceG12 *>(m_miInterface)->AddMiBatchBufferStartCmd(&cmdBuffer, m_batchBuf, true));
898 
899     return MOS_STATUS_SUCCESS;
900 }
901 
CheckHucLoadStatus()902 MOS_STATUS CodechalVdencAvcStateXe_Hpm::CheckHucLoadStatus()
903 {
904     CODECHAL_ENCODE_FUNCTION_ENTER;
905 
906     MOS_COMMAND_BUFFER cmdBuffer = {};
907     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
908 
909     // add media reset check 100ms, which equals to 1080p WDT threshold
910     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->SetWatchdogTimerThreshold(1920, 1080, true));
911     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddWatchdogTimerStopCmd(&cmdBuffer));
912     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddWatchdogTimerStartCmd(&cmdBuffer));
913 
914     // program 2nd level chained BB for Huc auth
915     m_batchBuf = &m_2ndLevelBB[m_currRecycledBufIdx];
916     CODECHAL_ENCODE_CHK_NULL_RETURN(m_batchBuf);
917 
918     MOS_LOCK_PARAMS lockFlags;
919     MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
920     lockFlags.WriteOnly = true;
921 
922     uint8_t *data = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &(m_batchBuf->OsResource), &lockFlags);
923     CODECHAL_ENCODE_CHK_NULL_RETURN(data);
924 
925     MOS_COMMAND_BUFFER hucAuthCmdBuffer;
926     MOS_ZeroMemory(&hucAuthCmdBuffer, sizeof(hucAuthCmdBuffer));
927     hucAuthCmdBuffer.pCmdBase   = (uint32_t *)data;
928     hucAuthCmdBuffer.pCmdPtr    = hucAuthCmdBuffer.pCmdBase;
929     hucAuthCmdBuffer.iRemaining = m_batchBuf->iSize;
930     hucAuthCmdBuffer.OsResource = m_batchBuf->OsResource;
931     hucAuthCmdBuffer.cmdBuf1stLvl = &cmdBuffer;
932 
933     //pak check huc status command
934     CODECHAL_ENCODE_CHK_STATUS_RETURN(PackHucAuthCmds(hucAuthCmdBuffer));
935 
936     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnUnlockResource(m_osInterface, &(m_batchBuf->OsResource)));
937 
938     // BB start for 2nd level BB
939     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferStartCmd(&cmdBuffer, m_batchBuf));
940 
941     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
942 
943     return MOS_STATUS_SUCCESS;
944 }
945 
HuCBrcInitReset()946 MOS_STATUS CodechalVdencAvcStateXe_Hpm::HuCBrcInitReset()
947 {
948     CODECHAL_ENCODE_FUNCTION_ENTER;
949 
950     if (MEDIA_IS_WA(m_waTable, WaCheckHucAuthenticationStatus))
951     {
952         CODECHAL_ENCODE_CHK_STATUS_RETURN(CheckHucLoadStatus());
953     }
954 
955     CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalVdencAvcStateG12::HuCBrcInitReset());
956 
957     return MOS_STATUS_SUCCESS;
958 }
959 
GetVdencBRCImgStateBufferSize()960 uint32_t CodechalVdencAvcStateXe_Hpm::GetVdencBRCImgStateBufferSize()
961 {
962     return MOS_ALIGN_CEIL(MOS_ALIGN_CEIL(m_hwInterface->m_vdencBrcImgStateBufferSize, CODECHAL_CACHELINE_SIZE) + ENCODE_AVC_MAX_SLICES_SUPPORTED * (m_mfxInterface->GetAvcSlcStateSize() + m_vdencInterface->GetVdencAvcSlcStateSize() + m_miInterface->GetMiBatchBufferEndCmdSize()), CODECHAL_PAGE_SIZE);
963 }
964 
AddVdencBrcImgBuffer(PMOS_RESOURCE vdencBrcImgBuffer,PMHW_VDBOX_AVC_IMG_PARAMS params)965 MOS_STATUS CodechalVdencAvcStateXe_Hpm::AddVdencBrcImgBuffer(
966     PMOS_RESOURCE             vdencBrcImgBuffer,
967     PMHW_VDBOX_AVC_IMG_PARAMS params)
968 {
969     CODECHAL_ENCODE_FUNCTION_ENTER;
970 
971     CODECHAL_ENCODE_CHK_NULL_RETURN(vdencBrcImgBuffer);
972     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
973     CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface);
974     CODECHAL_ENCODE_CHK_NULL_RETURN(m_mfxInterface);
975     CODECHAL_ENCODE_CHK_NULL_RETURN(m_vdencInterface);
976 
977     uint8_t *       data = nullptr;
978     MOS_LOCK_PARAMS lockFlags;
979     MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
980     lockFlags.WriteOnly = 1;
981 
982     data = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, vdencBrcImgBuffer, &lockFlags);
983     CODECHAL_ENCODE_CHK_NULL_RETURN(data);
984 
985     MOS_COMMAND_BUFFER constructedCmdBuf;
986     MOS_ZeroMemory(&constructedCmdBuf, sizeof(MOS_COMMAND_BUFFER));
987     constructedCmdBuf.pCmdBase   = (uint32_t *)data;
988     constructedCmdBuf.iRemaining = GetVdencBRCImgStateBufferSize();
989 
990     // Set MFX_IMAGE_STATE command
991     constructedCmdBuf.pCmdPtr = (uint32_t *)data;
992     constructedCmdBuf.iOffset = 0;
993     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcImgCmd(&constructedCmdBuf, nullptr, params));
994 
995     // Set VDENC_CMD3 command
996     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_vdencInterface->AddVdencCmd3Cmd(&constructedCmdBuf, nullptr, params));
997 
998     // Set VDENC_IMAGE_STATE command
999     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_vdencInterface->AddVdencImgStateCmd(&constructedCmdBuf, nullptr, params));
1000 
1001     m_miInterface->AddBatchBufferEndInsertionFlag(constructedCmdBuf);
1002 
1003     // AddBatchBufferEndInsertionFlag doesn't modify pCmdPtr + iOffset
1004     constructedCmdBuf.pCmdPtr += m_miBatchBufferEndSize / sizeof(uint32_t);
1005     constructedCmdBuf.iOffset += m_miBatchBufferEndSize;
1006     constructedCmdBuf.iRemaining -= m_miBatchBufferEndSize;
1007 
1008     // Add MI_NOOPs to align to CODECHAL_CACHELINE_SIZE
1009     uint32_t size = (MOS_ALIGN_CEIL(constructedCmdBuf.iOffset, CODECHAL_CACHELINE_SIZE) - constructedCmdBuf.iOffset) / sizeof(uint32_t);
1010     for (uint32_t i = 0; i < size; i++)
1011         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiNoop(&constructedCmdBuf, nullptr));
1012 
1013     CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS packSlcHeaderParams = {};
1014     MHW_VDBOX_AVC_SLICE_STATE                  sliceState          = {};
1015     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCommonSliceState(packSlcHeaderParams, sliceState));
1016 
1017     for (uint16_t slcCount = 0; slcCount < m_numSlices; slcCount++)
1018     {
1019         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetSliceState(packSlcHeaderParams, sliceState, slcCount));
1020 
1021         size = constructedCmdBuf.iOffset;
1022 
1023         // Set MFX_AVC_SLICE_STATE command
1024         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcSlice(&constructedCmdBuf, nullptr, &sliceState));
1025 
1026         // Set VDENC_AVC_SLICE_STATE command
1027         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_vdencInterface->AddVdencSliceStateCmd(&constructedCmdBuf, &sliceState));
1028 
1029         m_miInterface->AddBatchBufferEndInsertionFlag(constructedCmdBuf);
1030         constructedCmdBuf.pCmdPtr += m_miBatchBufferEndSize / sizeof(uint32_t);
1031         constructedCmdBuf.iOffset += m_miBatchBufferEndSize;
1032         constructedCmdBuf.iRemaining -= m_miBatchBufferEndSize;
1033 
1034         CODECHAL_ENCODE_ASSERT(constructedCmdBuf.iOffset - size < CODECHAL_CACHELINE_SIZE);
1035     }
1036 
1037     m_osInterface->pfnUnlockResource(
1038         m_osInterface,
1039         vdencBrcImgBuffer);
1040 
1041     return MOS_STATUS_SUCCESS;
1042 }
1043 
AddMfxAvcSlice(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_BATCH_BUFFER batchBuffer,PMHW_VDBOX_AVC_SLICE_STATE avcSliceState)1044 MOS_STATUS CodechalVdencAvcStateXe_Hpm::AddMfxAvcSlice(
1045     PMOS_COMMAND_BUFFER        cmdBuffer,
1046     PMHW_BATCH_BUFFER          batchBuffer,
1047     PMHW_VDBOX_AVC_SLICE_STATE avcSliceState)
1048 {
1049     CODECHAL_ENCODE_FUNCTION_ENTER;
1050 
1051     CODECHAL_ENCODE_CHK_NULL_RETURN(avcSliceState);
1052     CODECHAL_ENCODE_CHK_NULL_RETURN(m_mfxInterface);
1053 
1054     if (m_vdencBrcEnabled)
1055     {
1056         // current location to add cmds in 2nd level batch buffer
1057         m_batchBufferForVdencImgStat[0].iCurrent = 0;
1058         // reset starting location (offset) executing 2nd level batch buffer for each frame & each pass
1059         // base part of 2nd lvl BB must be aligned for CODECHAL_CACHELINE_SIZE
1060         m_batchBufferForVdencImgStat[0].dwOffset = MOS_ALIGN_CEIL(m_mfxAvcImgStateSize + m_vdencCmd3Size + m_vdencAvcImgStateSize + m_miBatchBufferEndSize, CODECHAL_CACHELINE_SIZE) +
1061                                                    avcSliceState->dwSliceIndex * (m_mfxAvcSlcStateSize + m_vdencAvcSlcStateSize + m_miBatchBufferEndSize);
1062 
1063         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferStartCmd(cmdBuffer, &m_batchBufferForVdencImgStat[0]));
1064     }
1065     else
1066     {
1067         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcSlice(cmdBuffer, batchBuffer, avcSliceState));
1068     }
1069 
1070     return MOS_STATUS_SUCCESS;
1071 }
1072 
AddVdencSliceStateCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_AVC_SLICE_STATE params)1073 MOS_STATUS CodechalVdencAvcStateXe_Hpm::AddVdencSliceStateCmd(
1074     PMOS_COMMAND_BUFFER        cmdBuffer,
1075     PMHW_VDBOX_AVC_SLICE_STATE params)
1076 {
1077     CODECHAL_ENCODE_FUNCTION_ENTER;
1078 
1079     CODECHAL_ENCODE_CHK_NULL_RETURN(params);
1080     CODECHAL_ENCODE_CHK_NULL_RETURN(m_vdencInterface);
1081 
1082     // VDENC_AVC_SLICE_STATE was added in AddVdencBrcImgBuffer
1083     // execution will be triggered in AddMfxAvcSlice in 2nd lvl BB through MI_BATCH_BUFFER_START cmd
1084     if (!m_vdencBrcEnabled)
1085     {
1086         CODECHAL_ENCODE_CHK_STATUS_RETURN(m_vdencInterface->AddVdencSliceStateCmd(cmdBuffer, params));
1087     }
1088 
1089     return MOS_STATUS_SUCCESS;
1090 }
1091 
Execute(void * params)1092 MOS_STATUS CodechalVdencAvcStateXe_Hpm::Execute(void *params)
1093 {
1094     CODECHAL_ENCODE_FUNCTION_ENTER;
1095 
1096     PERF_UTILITY_AUTO(__FUNCTION__, PERF_ENCODE, PERF_LEVEL_HAL);
1097 
1098     MOS_TraceEventExt(EVENT_CODECHAL_EXECUTE, EVENT_TYPE_START, &m_codecFunction, sizeof(m_codecFunction), nullptr, 0);
1099 
1100     CODECHAL_ENCODE_CHK_STATUS_RETURN(Codechal::Execute(params));
1101 
1102     EncoderParams *encodeParams = (EncoderParams *)params;
1103     // MSDK event handling
1104     CODECHAL_ENCODE_CHK_STATUS_RETURN(Mos_Solo_SetGpuAppTaskEvent(m_osInterface, encodeParams->gpuAppTaskEvent));
1105 
1106     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->SetWatchdogTimerThreshold(m_frameWidth, m_frameHeight));
1107 
1108     CODECHAL_ENCODE_CHK_STATUS_RETURN(SwitchContext());
1109 
1110     CODECHAL_ENCODE_CHK_STATUS_RETURN(ExecuteEnc(encodeParams));
1111 
1112     MOS_TraceEventExt(EVENT_CODECHAL_EXECUTE, EVENT_TYPE_END, nullptr, 0, nullptr, 0);
1113 
1114     return MOS_STATUS_SUCCESS;
1115 }
1116 
SwitchContext()1117 MOS_STATUS CodechalVdencAvcStateXe_Hpm::SwitchContext()
1118 {
1119     CODECHAL_ENCODE_FUNCTION_ENTER;
1120 
1121     if (CodecHalUsesVideoEngine(m_codecFunction) && !m_isContextSwitched)
1122     {
1123         if (MEDIA_IS_SKU(m_skuTable, FtrVcs2) ||
1124             (MOS_VE_MULTINODESCALING_SUPPORTED(m_osInterface) && m_numVdbox > 1))
1125         {
1126             MOS_GPU_NODE encoderNode = m_osInterface->pfnGetLatestVirtualNode(m_osInterface, COMPONENT_Encode);
1127             MOS_GPU_NODE decoderNode = m_osInterface->pfnGetLatestVirtualNode(m_osInterface, COMPONENT_Decode);
1128             // switch encoder to different virtual node
1129             if ((encoderNode == m_videoGpuNode) || (decoderNode == m_videoGpuNode))
1130             {
1131                 CODECHAL_ENCODE_CHK_STATUS_RETURN(ChangeContext());
1132             }
1133             m_osInterface->pfnSetLatestVirtualNode(m_osInterface, m_videoGpuNode);
1134         }
1135     }
1136     // switch only once
1137     m_isContextSwitched = true;
1138 
1139     return MOS_STATUS_SUCCESS;
1140 }
1141 
ChangeContext()1142 MOS_STATUS CodechalVdencAvcStateXe_Hpm::ChangeContext()
1143 {
1144     CODECHAL_ENCODE_FUNCTION_ENTER;
1145 
1146     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnDestroyVideoNodeAssociation(
1147         m_osInterface,
1148         m_videoGpuNode));
1149     MOS_GPU_NODE videoGpuNode = (m_videoGpuNode == MOS_GPU_NODE_VIDEO) ? MOS_GPU_NODE_VIDEO2 : MOS_GPU_NODE_VIDEO;
1150     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateVideoNodeAssociation(
1151         m_osInterface,
1152         true,
1153         &videoGpuNode));
1154     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnDestroyGpuContext(
1155         m_osInterface,
1156         m_videoContext));
1157     MOS_GPU_CONTEXT gpuContext = (videoGpuNode == MOS_GPU_NODE_VIDEO2) && !MOS_VE_MULTINODESCALING_SUPPORTED(m_osInterface) ? MOS_GPU_CONTEXT_VDBOX2_VIDEO3 : MOS_GPU_CONTEXT_VIDEO3;
1158     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
1159         m_osInterface,
1160         gpuContext,
1161         videoGpuNode,
1162         m_gpuCtxCreatOpt));
1163     m_videoGpuNode = videoGpuNode;
1164     m_videoContext = gpuContext;
1165     m_osInterface->pfnSetEncodePakContext(m_osInterface, m_videoContext);
1166     m_vdboxIndex = (m_videoGpuNode == MOS_GPU_NODE_VIDEO2) ? MHW_VDBOX_NODE_2 : MHW_VDBOX_NODE_1;
1167 
1168     return MOS_STATUS_SUCCESS;
1169 }
1170 
1171 #if USE_CODECHAL_DEBUG_TOOL
PopulateEncParam(uint8_t meMethod,void * cmd)1172 MOS_STATUS CodechalVdencAvcStateXe_Hpm::PopulateEncParam(uint8_t meMethod, void *cmd)
1173 {
1174     CODECHAL_DEBUG_FUNCTION_ENTER;
1175 
1176     return MOS_STATUS_SUCCESS;
1177 }
1178 
GetPakVDEncPassDumpSize()1179 uint32_t CodechalVdencAvcStateXe_Hpm::GetPakVDEncPassDumpSize()
1180 {
1181     return GetVdencBRCImgStateBufferSize();
1182 }
1183 #endif
1184