1 /* 2 * Copyright (c) 2018, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 //! 23 //! \file codechal_huc_cmd_initializer_g11.h 24 //! \brief Defines class for G11 HUC cmd initializer encoder. 25 //! 26 27 #ifndef __CODECHAL_CMD_INITIALIZER_G11_H__ 28 #define __CODECHAL_CMD_INITIALIZER_G11_H__ 29 30 #include "codechal_huc_cmd_initializer.h" 31 32 #if defined (_HEVC_ENCODE_VME_SUPPORTED) || defined (_HEVC_ENCODE_VDENC_SUPPORTED) 33 #include "codechal_encode_hevc_base.h" 34 #endif 35 #include "codechal_encoder_base.h" 36 37 //! 38 //! \struct HucInputCmd1 39 //! \brief The struct of Huc input command 1 40 //! 41 struct HucInputCmd1G11 42 { 43 // Shared 44 uint32_t FrameWidthInMinCbMinus1; 45 46 uint32_t FrameHeightInMinCbMinus1; 47 48 uint32_t log2_min_coding_block_size_minus3; 49 50 uint8_t VdencStreamInEnabled; 51 uint8_t PakOnlyMultipassEnable; 52 uint16_t num_ref_idx_l0_active_minus1; 53 54 uint16_t SADQPLambda; 55 uint16_t RDQPLambda; 56 57 // HEVC 58 uint16_t num_ref_idx_l1_active_minus1; 59 uint8_t tiles_enabled_flag; 60 uint8_t ROIStreamInEnabled; 61 62 int8_t ROIDeltaQp[8]; // [-3..3] or [-51..51] 63 64 uint8_t FwdPocNumForRefId0inL0; 65 uint8_t FwdPocNumForRefId0inL1; 66 uint8_t FwdPocNumForRefId1inL0; 67 uint8_t FwdPocNumForRefId1inL1; 68 69 uint8_t FwdPocNumForRefId2inL0; 70 uint8_t FwdPocNumForRefId2inL1; 71 uint8_t FwdPocNumForRefId3inL0; 72 uint8_t FwdPocNumForRefId3inL1; 73 74 uint8_t EnableRollingIntraRefresh; 75 int8_t QpDeltaForInsertedIntra; 76 uint16_t IntraInsertionSize; 77 78 uint32_t IntraInsertionReferenceLocation[3]; 79 80 uint16_t IntraInsertionLocation; 81 int8_t QpY; 82 uint8_t RoundingEnabled; 83 84 uint8_t UseDefaultQpDeltas; 85 uint8_t PanicEnabled; 86 uint8_t TemporalMvpEnableFlag; 87 uint8_t TransformSkip; 88 uint32_t Intra32X32ModeMask; 89 90 // VP9 91 uint16_t SrcFrameWidth; 92 uint16_t SrcFrameHeight; 93 94 uint8_t SegmentationEnabled; 95 uint8_t PrevFrameSegEnabled; 96 uint8_t SegMapStreamInEnabled; 97 uint8_t LumaACQIndex; 98 99 int8_t LumaDCQIndexDelta; 100 uint8_t log2_tile_columns; 101 uint8_t log2_tile_rows; 102 uint8_t DynamicScalingEnabled; 103 104 int16_t SegmentQIndexDelta[8]; 105 106 // for hevc max/min qp 107 uint8_t BRCMaxQp; 108 uint8_t BRCMinQp; 109 110 // for VP9 VDEnc Gen11 111 uint8_t dysVdencMultiPassEnabled; 112 113 uint8_t Rsvd[1]; 114 }; 115 116 //! 117 //! \struct HucInputCmd3G11 118 //! \brief The struct of Huc input command 3 119 //! 120 struct HucInputCmd3G11 121 { 122 uint8_t SelectionForIndData = 0; 123 uint8_t CmdMode = 0; 124 uint16_t LengthOfTable = 0; 125 126 uint32_t SrcBaseOffset = 0; 127 uint32_t DestBaseOffset = 0; 128 129 uint32_t Reserved[3] = { 0 }; 130 131 uint32_t CopySize = 0; // use this as indicator of size for copy base addr cmd. Since encode will not implement CopySize for copy cmd 132 133 uint32_t ReservedCounter[4] = {0}; 134 135 uint32_t SrcAddrBottom = 0; 136 uint32_t SrcAddrTop = 0; 137 uint32_t DestAddrBottom = 0; 138 uint32_t DestAddrTop = 0; 139 }; 140 141 //! 142 //! \struct HucCopyParams 143 //! \brief The struct of params used for huc copy 144 //! 145 struct HucCopyParams 146 { 147 PMOS_RESOURCE presSrc = nullptr; 148 PMOS_RESOURCE presDst = nullptr; 149 uint32_t size = 0; 150 uint16_t lengthOfTable = 0; 151 }; 152 153 //! 154 //! \class CodechalCmdInitializer 155 //! \brief Command Initializer class 156 //! 157 class CodechalCmdInitializerG11 : public CodechalCmdInitializer 158 { 159 public: 160 //! 161 //! \brief Constructor 162 //! 163 164 CodechalCmdInitializerG11(CodechalEncoderState *encoder); 165 166 //! 167 //! \brief Default Constructor 168 //! CodechalCmdInitializerG11()169 CodechalCmdInitializerG11() {}; 170 171 //! 172 //! \brief Destructor 173 //! ~CodechalCmdInitializerG11()174 virtual ~CodechalCmdInitializerG11() {}; 175 176 //! Inherited virtual functions 177 virtual MOS_STATUS CmdInitializerAllocateResources( 178 CodechalHwInterface* m_hwInterface) override; 179 180 //! 181 //! \brief Free Resources 182 //! 183 virtual void CmdInitializerFreeResources() override; 184 185 //! 186 //! \brief Add copy commands of command initializer HuC FW 187 //! 188 //! \param [in] cmdBuffer 189 //! Command Buffer 190 //! \param [in] params 191 //! Params used to add copy commands 192 //! 193 //! \return MOS_STATUS 194 //! MOS_STATUS_SUCCESS if success, else fail reason 195 //! 196 virtual MOS_STATUS AddCopyCmds( 197 PMOS_COMMAND_BUFFER cmdBuffer, 198 HucCopyParams* params); 199 200 #if defined (_HEVC_ENCODE_VME_SUPPORTED) || defined (_HEVC_ENCODE_VDENC_SUPPORTED) 201 virtual MOS_STATUS CmdInitializerSetDmem(bool brcEnabled) override; 202 203 //! 204 //! \brief Add command of initializer HuC FW 205 //! 206 //! \param [in] cmdId 207 //! id of the command 208 //! \param [in] data 209 //! content of the command 210 //! \param [in] size 211 //! size of the command 212 //! \param [in] startOffset 213 //! start offset of the command in slb 214 //! 215 //! \return MOS_STATUS 216 //! MOS_STATUS_SUCCESS if success, else fail reason 217 //! 218 virtual MOS_STATUS AddCmdConstData( 219 uint16_t cmdId, 220 uint32_t* data, 221 uint16_t size, 222 uint32_t startOffset 223 ); 224 #endif 225 226 #ifdef _VP9_ENCODE_VDENC_SUPPORTED 227 //! 228 //! \brief Set DMEM of command initializer HuC FW for VP9 229 //! \return MOS_STATUS 230 //! MOS_STATUS_SUCCESS if success, else fail reason 231 //! 232 MOS_STATUS CmdInitializerVp9SetDmem() override; 233 234 //! 235 //! \brief Executes VP9 command initializer HuC FW 236 //! 237 //! \param [in] cmdBuffer 238 //! Command buffer 239 //! \param [in] picStateBuffer 240 //! Picture state buffer 241 //! 242 //! \return MOS_STATUS 243 //! MOS_STATUS_SUCCESS if success, else fail reason 244 //! 245 MOS_STATUS CmdInitializerVp9Execute(PMOS_COMMAND_BUFFER cmdBuffer, PMOS_RESOURCE picStateBuffer) override; 246 #endif 247 248 bool m_hevcVisualQualityImprovement = false; //!< VQI enable flag 249 250 protected: 251 #if defined (_HEVC_ENCODE_VME_SUPPORTED) || defined (_HEVC_ENCODE_VDENC_SUPPORTED) 252 MOS_STATUS ConstructHevcHucCmd1ConstData( 253 PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS seqParams, 254 PCODEC_HEVC_ENCODE_PICTURE_PARAMS picParams, 255 PCODEC_HEVC_ENCODE_SLICE_PARAMS sliceParams, 256 struct HucComData * hucConstData) override; 257 258 MOS_STATUS ConstructHevcHucCmd2ConstData( 259 PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS seqParams, 260 PCODEC_HEVC_ENCODE_PICTURE_PARAMS picParams, 261 PCODEC_HEVC_ENCODE_SLICE_PARAMS sliceParams, 262 struct HucComData * hucConstData) override; 263 264 uint16_t GetCmd2StartOffset(bool brcEnabled) override; 265 uint16_t GetCmd1StartOffset(bool brcEnabled) override; 266 virtual uint16_t GetCmd5StartOffset(bool brcEnabled); 267 #endif 268 269 MOS_RESOURCE m_cmdInitializerCopyDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES]; //!< Dmem buffer for huc cmd initialization copy 270 MOS_RESOURCE m_cmdInitializerCopyDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES]; //!< Data buffer for huc cmd initialization copy 271 MHW_BATCH_BUFFER m_vdencCopyBatchBuffer = {}; //!< SLB for huc cmd initialization copy 272 273 //! 274 //! \brief Set dmem buffer for huc cmd initialization copy 275 //! 276 //! \return MOS_STATUS 277 //! MOS_STATUS_SUCCESS if success, else fail reason 278 //! 279 MOS_STATUS SetCopyDmem(); 280 281 //! 282 //! \brief Set data buffer for huc cmd initialization copy 283 //! 284 //! \return MOS_STATUS 285 //! MOS_STATUS_SUCCESS if success, else fail reason 286 //! 287 MOS_STATUS SetCopyData( 288 HucCopyParams* params); 289 }; 290 using PCODECHAL_CMD_INITIALIZER_G11 = class CodechalCmdInitializerG11*; 291 292 #endif //__CODECHAL_CMD_INITIALIZER_G11_H__ 293