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>(¶m);
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 ¶m)
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 *)¶m);
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