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.h
26 //! \brief    This file defines the base C++ class/interface for Xe_HPM AVC VDENC
27 //!           encoding to be used across CODECHAL components.
28 //!
29 
30 #ifndef __CODECHAL_VDENC_AVC_XE_HPM_H__
31 #define __CODECHAL_VDENC_AVC_XE_HPM_H__
32 
33 #include "mhw_vdbox_xe_xpm.h"
34 #include "codechal_vdenc_avc_g12.h"
35 
36 typedef struct _AVCVdencBRCCostantDataXe_Hpm
37 {
38     uint8_t     UPD_GlobalRateQPAdjTabI_U8[64];
39     uint8_t     UPD_GlobalRateQPAdjTabP_U8[64];
40     uint8_t     UPD_GlobalRateQPAdjTabB_U8[64];
41     uint8_t     UPD_DistThreshldI_U8[10];
42     uint8_t     UPD_DistThreshldP_U8[10];
43     uint8_t     UPD_DistThreshldB_U8[10];
44     uint8_t     UPD_DistQPAdjTabI_U8[81];
45     uint8_t     UPD_DistQPAdjTabP_U8[81];
46     uint8_t     UPD_DistQPAdjTabB_U8[81];
47     int8_t      UPD_BufRateAdjTabI_S8[72];
48     int8_t      UPD_BufRateAdjTabP_S8[72];
49     int8_t      UPD_BufRateAdjTabB_S8[72];
50     uint8_t     UPD_FrmSzMinTabP_U8[9];
51     uint8_t     UPD_FrmSzMinTabB_U8[9];
52     uint8_t     UPD_FrmSzMinTabI_U8[9];
53     uint8_t     UPD_FrmSzMaxTabP_U8[9];
54     uint8_t     UPD_FrmSzMaxTabB_U8[9];
55     uint8_t     UPD_FrmSzMaxTabI_U8[9];
56     uint8_t     UPD_FrmSzSCGTabP_U8[9];
57     uint8_t     UPD_FrmSzSCGTabB_U8[9];
58     uint8_t     UPD_FrmSzSCGTabI_U8[9];
59     // Cost Table 14*42 = 588 bytes
60     uint8_t     UPD_I_IntraNonPred[42];
61     uint8_t     UPD_I_Intra16x16[42];
62     uint8_t     UPD_I_Intra8x8[42];
63     uint8_t     UPD_I_Intra4x4[42];
64     uint8_t     UPD_I_IntraChroma[42];
65     uint8_t     UPD_P_IntraNonPred[42];
66     uint8_t     UPD_P_Intra16x16[42];
67     uint8_t     UPD_P_Intra8x8[42];
68     uint8_t     UPD_P_Intra4x4[42];
69     uint8_t     UPD_P_IntraChroma[42];
70     uint8_t     UPD_P_Inter16x8[42];
71     uint8_t     UPD_P_Inter8x8[42];
72     uint8_t     UPD_P_Inter16x16[42];
73     uint8_t     UPD_P_RefId[42];
74     uint8_t     Reserved[630];
75 } AVCVdencBRCCostantDataXe_Hpm, *PAVCVdencBRCCostantDataXe_Hpm;
76 
77 class CodechalVdencAvcStateXe_Hpm : public CodechalVdencAvcStateG12
78 {
79 public:
80     //!
81     //! \brief    Constructor
82     //!
CodechalVdencAvcStateXe_Hpm(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface,PCODECHAL_STANDARD_INFO standardInfo)83     CodechalVdencAvcStateXe_Hpm(
84         CodechalHwInterface    *hwInterface,
85         CodechalDebugInterface *debugInterface,
86         PCODECHAL_STANDARD_INFO standardInfo) : CodechalVdencAvcStateG12(hwInterface, debugInterface, standardInfo)
87     {
88         m_oneOnOneMapping = false;
89         m_computeContextEnabled = true;
90         m_nonNativeBrcRoiSupported = true;
91 
92         // Override pointers to slice size thresholds tables with new ones to align with HW improvements
93         m_vdencSSCThrsTblI = SliceSizeThrsholdsI_Xe_Hpm;
94         m_vdencSSCThrsTblP = SliceSizeThrsholdsP_Xe_Hpm;
95 
96 #if USE_CODECHAL_DEBUG_TOOL
97         m_populateTargetUsage = true;
98 #endif
99     };
100 
101     //!
102     //! \brief    Destructor
103     //!
104     virtual ~CodechalVdencAvcStateXe_Hpm();
105 
106     virtual MOS_STATUS AllocateResources() override;
107     virtual MOS_STATUS AllocateMDFResources() override;
108 
109     virtual MOS_STATUS Initialize(CodechalSetting * settings) override;
110 
111     virtual MOS_STATUS InitializeState() override;
112 
113     virtual MOS_STATUS InitMmcState() override;
114 
115     virtual MOS_STATUS DeltaQPUpdate(uint8_t QpModulationStrength) override;
116 
117     virtual void MotionEstimationDisableCheck() override;
118 
119     virtual bool CheckSupportedFormat(PMOS_SURFACE surface) override;
120 
121     virtual MOS_STATUS SetPictureStructs() override;
122 
123     virtual MOS_STATUS ValidateNumReferences(PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params) override;
124 
125     virtual uint32_t GetCurrConstDataBufIdx() override;
126 
127     virtual MOS_STATUS HuCBrcInitReset() override;
128 
129     virtual MOS_STATUS AddMfxAvcSlice(
130         PMOS_COMMAND_BUFFER        cmdBuffer,
131         PMHW_BATCH_BUFFER          batchBuffer,
132         PMHW_VDBOX_AVC_SLICE_STATE avcSliceState) override;
133 
134     virtual MOS_STATUS AddVdencSliceStateCmd(
135         PMOS_COMMAND_BUFFER        cmdBuffer,
136         PMHW_VDBOX_AVC_SLICE_STATE params) override;
137 
138     MOS_STATUS Execute(void *params) override;
139 
140 protected:
141     struct BrcInitDmem;
142     struct BrcUpdateDmem;
143 
144     PMHW_VDBOX_AVC_IMG_PARAMS CreateMhwVdboxAvcImgParams() override;
145 
146     void SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS &param) override;
147 
148     void SetMfxPipeModeSelectParams(
149         const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS &genericParam,
150         MHW_VDBOX_PIPE_MODE_SELECT_PARAMS &param) override;
151 
152     MOS_STATUS SetMfxPipeBufAddrStateParams(
153         CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam,
154         MHW_VDBOX_PIPE_BUF_ADDR_PARAMS &param) override;
155 
156     MOS_STATUS GetTrellisQuantization(
157         PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params,
158         PCODECHAL_ENCODE_AVC_TQ_PARAMS       trellisQuantParams) override;
159 
160     MOS_STATUS LoadHmeMvCostTable(
161         PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,
162         uint8_t                           hmeMvCostTable[8][42]) override;
163 
GetBRCCostantDataSize()164     uint32_t GetBRCCostantDataSize() override { return sizeof(AVCVdencBRCCostantDataXe_Hpm); }
165 
166     MOS_STATUS FillHucConstData(uint8_t *data, uint8_t picType) override;
167 
168     MOS_STATUS SetRounding(PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS param, PMHW_VDBOX_AVC_SLICE_STATE sliceState) override;
169 
170     MOS_STATUS SetupWalkerContext(
171         MOS_COMMAND_BUFFER* cmdBuffer,
172         SendKernelCmdsParams* params) override;
173 
174     void CopyMBQPDataToStreamIn(CODECHAL_VDENC_STREAMIN_STATE* pData, uint8_t* pInputData) override;
175 
176 #if USE_CODECHAL_DEBUG_TOOL
177     MOS_STATUS PopulateEncParam(
178         uint8_t meMethod,
179         void    *cmd) override;
180 
181     uint32_t GetPakVDEncPassDumpSize() override;
182 #endif
183 
184     virtual uint32_t GetVdencBRCImgStateBufferSize() override;
185 
186     virtual uint16_t GetAdaptiveRoundingNumSlices() override;
187 
188     MOS_STATUS AddVdencBrcImgBuffer(
189         PMOS_RESOURCE             vdencBrcImgBuffer,
190         PMHW_VDBOX_AVC_IMG_PARAMS params) override;
191 
192     MOS_STATUS SetupThirdRef(PMOS_RESOURCE vdencStreamIn);
193 
194     // Switch GPU context at execute stage
195     MOS_STATUS SwitchContext();
196 
197     MOS_STATUS ChangeContext();
198 
199     MOS_STATUS CheckHucLoadStatus();
200 
201     MOS_STATUS PackHucAuthCmds(MOS_COMMAND_BUFFER &cmdBuffer);
202 
203     uint32_t m_mfxAvcImgStateSize    = 0;
204     uint32_t m_vdencCmd3Size         = 0;
205     uint32_t m_vdencAvcImgStateSize  = 0;
206     uint32_t m_mfxAvcSlcStateSize    = 0;
207     uint32_t m_vdencAvcSlcStateSize  = 0;
208     uint32_t m_miBatchBufferEndSize  = 0;
209 
210     bool m_isContextSwitched         = false;  // used to change virtual node association at execute stage only once
211 
212     static const uint8_t G0_P_InterRounding[52];
213     static const uint8_t G0_P_IntraRounding[52];
214     static const uint8_t G3_P_InterRounding[52];
215     static const uint8_t G3_P_IntraRounding[52];
216     static const uint8_t G3_rB_InterRounding[52];
217     static const uint8_t G3_rB_IntraRounding[52];
218     static const uint8_t G3_B_InterRounding[52];
219     static const uint8_t G3_B_IntraRounding[52];
220 
221     //Resources
222     MOS_RESOURCE      m_hucAuthBuf                                      = {};  //!< Huc authentication buffer
223     MHW_BATCH_BUFFER  m_2ndLevelBB[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {};  //!< 2nd level batch buffer
224     PMHW_BATCH_BUFFER m_batchBuf = nullptr;
225 
226 private:
227     static const uint16_t SliceSizeThrsholdsI_Xe_Hpm[52];
228     static const uint16_t SliceSizeThrsholdsP_Xe_Hpm[52];
229 };
230 
231 #endif  // __CODECHAL_VDENC_AVC_XE_HPM_H__
232