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 ¶m) override; 147 148 void SetMfxPipeModeSelectParams( 149 const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS &genericParam, 150 MHW_VDBOX_PIPE_MODE_SELECT_PARAMS ¶m) override; 151 152 MOS_STATUS SetMfxPipeBufAddrStateParams( 153 CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam, 154 MHW_VDBOX_PIPE_BUF_ADDR_PARAMS ¶m) 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