1 /* 2 # Copyright (c) 2024, 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 mhw_vdbox_avp_impl_xe2_lpm_base.h 24 //! \brief MHW VDBOX AVP interface common base for Xe2_LPM+ platforms 25 //! \details 26 //! 27 28 #ifndef __MHW_VDBOX_AVP_IMPL_XE2_LPM_BASE_H__ 29 #define __MHW_VDBOX_AVP_IMPL_XE2_LPM_BASE_H__ 30 31 #include "mhw_vdbox_avp_impl.h" 32 #include "mhw_sfc_hwcmd_xe2_lpm_base_next.h" 33 #include "mhw_mi_hwcmd_xe2_lpm_base_next.h" 34 #include "mhw_mi_itf.h" 35 36 namespace mhw 37 { 38 namespace vdbox 39 { 40 namespace avp 41 { 42 namespace xe2_lpm_base 43 { 44 template <typename cmd_t> 45 class BaseImpl : public avp::Impl<cmd_t> 46 { 47 public: GetAvpStateCmdSize(uint32_t * commandsSize,uint32_t * patchListSize,PMHW_VDBOX_STATE_CMDSIZE_PARAMS params)48 MOS_STATUS GetAvpStateCmdSize(uint32_t* commandsSize, uint32_t* patchListSize, PMHW_VDBOX_STATE_CMDSIZE_PARAMS params) override 49 { 50 MHW_FUNCTION_ENTER; 51 52 MHW_MI_CHK_NULL(commandsSize); 53 MHW_MI_CHK_NULL(patchListSize); 54 55 uint32_t maxSize = 0; 56 uint32_t patchListMaxSize = 0; 57 58 maxSize = 59 8 + 60 mhw::mi::xe2_lpm_base_next::Cmd::MI_FLUSH_DW_CMD::byteSize + 61 cmd_t::AVP_PIPE_MODE_SELECT_CMD::byteSize + 62 cmd_t::AVP_SURFACE_STATE_CMD::byteSize * 11 + 63 cmd_t::AVP_PIPE_BUF_ADDR_STATE_CMD::byteSize + 64 cmd_t::AVP_IND_OBJ_BASE_ADDR_STATE_CMD::byteSize + 65 cmd_t::AVP_SEGMENT_STATE_CMD::byteSize * 8 + 66 cmd_t::AVP_INLOOP_FILTER_STATE_CMD::byteSize + 67 cmd_t::AVP_INTER_PRED_STATE_CMD::byteSize + 68 cmd_t::AVP_FILM_GRAIN_STATE_CMD::byteSize; 69 70 patchListMaxSize = 71 PATCH_LIST_COMMAND(avp::Itf::VD_PIPELINE_FLUSH_CMD) + 72 PATCH_LIST_COMMAND(mi::Itf::MI_FLUSH_DW_CMD) + 73 PATCH_LIST_COMMAND(avp::Itf::AVP_PIPE_MODE_SELECT_CMD) + 74 PATCH_LIST_COMMAND(avp::Itf::AVP_SURFACE_STATE_CMD) * 11 + 75 PATCH_LIST_COMMAND(avp::Itf::AVP_PIPE_BUF_ADDR_STATE_CMD) + 76 PATCH_LIST_COMMAND(avp::Itf::AVP_IND_OBJ_BASE_ADDR_STATE_CMD) + 77 PATCH_LIST_COMMAND(avp::Itf::AVP_SEGMENT_STATE_CMD) * 8 + 78 PATCH_LIST_COMMAND(avp::Itf::AVP_INTER_PRED_STATE_CMD) + 79 PATCH_LIST_COMMAND(avp::Itf::AVP_INLOOP_FILTER_STATE_CMD) + 80 PATCH_LIST_COMMAND(avp::Itf::AVP_FILM_GRAIN_STATE_CMD); 81 82 if (params->bDecodeInUse) 83 { 84 maxSize += 85 cmd_t::AVP_PIC_STATE_CMD::byteSize + 86 mhw::mi::xe2_lpm_base_next::Cmd::VD_CONTROL_STATE_CMD::byteSize * 2; 87 88 patchListMaxSize += PATCH_LIST_COMMAND(avp::Itf::AVP_PIC_STATE_CMD); 89 } 90 if (params->bSfcInUse) 91 { 92 maxSize += 93 mhw::sfc::xe2_lpm_base_next::Cmd::SFC_LOCK_CMD::byteSize + 94 2 * mhw::mi::xe2_lpm_base_next::Cmd::VD_CONTROL_STATE_CMD::byteSize + 95 mhw::sfc::xe2_lpm_base_next::Cmd::SFC_STATE_CMD::byteSize + 96 mhw::sfc::xe2_lpm_base_next::Cmd::SFC_AVS_STATE_CMD::byteSize + 97 mhw::sfc::xe2_lpm_base_next::Cmd::SFC_AVS_LUMA_Coeff_Table_CMD::byteSize + 98 mhw::sfc::xe2_lpm_base_next::Cmd::SFC_AVS_CHROMA_Coeff_Table_CMD::byteSize + 99 mhw::sfc::xe2_lpm_base_next::Cmd::SFC_IEF_STATE_CMD::byteSize + 100 mhw::sfc::xe2_lpm_base_next::Cmd::SFC_FRAME_START_CMD::byteSize; 101 } 102 *commandsSize = maxSize; 103 *patchListSize = patchListMaxSize; 104 105 return MOS_STATUS_SUCCESS; 106 } 107 108 GetAvpPrimitiveCmdSize(uint32_t * commandsSize,uint32_t * patchListSize,PMHW_VDBOX_STATE_CMDSIZE_PARAMS params)109 MOS_STATUS GetAvpPrimitiveCmdSize(uint32_t* commandsSize, uint32_t* patchListSize, PMHW_VDBOX_STATE_CMDSIZE_PARAMS params) override 110 { 111 MHW_FUNCTION_ENTER; 112 113 MHW_MI_CHK_NULL(commandsSize); 114 MHW_MI_CHK_NULL(patchListSize); 115 116 uint32_t maxSize = 0; 117 uint32_t patchListMaxSize = 0; 118 119 if (params->bDecodeInUse) 120 { 121 maxSize = 122 cmd_t::AVP_TILE_CODING_CMD::byteSize + 123 cmd_t::AVP_BSD_OBJECT_CMD::byteSize + 124 mhw::mi::xe2_lpm_base_next::Cmd::MI_BATCH_BUFFER_END_CMD::byteSize; 125 126 patchListMaxSize = 127 PATCH_LIST_COMMAND(avp::Itf::AVP_TILE_CODING_CMD) + 128 PATCH_LIST_COMMAND(avp::Itf::AVP_BSD_OBJECT_CMD); 129 } 130 131 *commandsSize = maxSize; 132 *patchListSize = patchListMaxSize; 133 134 return MOS_STATUS_SUCCESS; 135 } 136 137 protected: 138 using base_t = avp::Impl<cmd_t>; 139 BaseImpl(PMOS_INTERFACE osItf)140 BaseImpl(PMOS_INTERFACE osItf) : base_t(osItf){}; 141 _MHW_SETCMD_OVERRIDE_DECL(AVP_PIPE_MODE_SELECT)142 _MHW_SETCMD_OVERRIDE_DECL(AVP_PIPE_MODE_SELECT) 143 { 144 _MHW_SETCMD_CALLBASE(AVP_PIPE_MODE_SELECT); 145 146 #define DO_FIELDS() \ 147 DO_FIELD(DW1, TileStatisticsStreamoutEnable, params.tileStatsStreamoutEnable ? 1 : 0); \ 148 DO_FIELD(DW6, DownscaledSourcePixelPrefetchLength, params.srcPixelPrefetchLen); \ 149 DO_FIELD(DW6, DownscaledSourcePixelPrefetchEnable, params.srcPixelPrefetchEnable ? 1 : 0); \ 150 DO_FIELD(DW6, OriginalSourcePixelPrefetchLength, params.srcPixelPrefetchLen); \ 151 DO_FIELD(DW6, OriginalSourcePixelPrefetchEnable, params.srcPixelPrefetchEnable ? 1 : 0) 152 153 #include "mhw_hwcmd_process_cmdfields.h" 154 } 155 _MHW_SETCMD_OVERRIDE_DECL(AVP_FILM_GRAIN_STATE)156 _MHW_SETCMD_OVERRIDE_DECL(AVP_FILM_GRAIN_STATE) 157 { 158 _MHW_SETCMD_CALLBASE(AVP_FILM_GRAIN_STATE); 159 160 MOS_SecureMemcpy(cmd.PointLumaValueI0To13, 161 sizeof(params.pointYValue), 162 params.pointYValue, 163 sizeof(params.pointYValue)); 164 165 MOS_SecureMemcpy(cmd.PointLumaScalingI0To13, 166 sizeof(params.pointYScaling), 167 params.pointYScaling, 168 sizeof(params.pointYScaling)); 169 170 MOS_SecureMemcpy(cmd.PointCbValueI0To9, 171 sizeof(params.pointCbValue), 172 params.pointCbValue, 173 sizeof(params.pointCbValue)); 174 175 MOS_SecureMemcpy(cmd.PointCbScalingI0To9, 176 sizeof(params.pointCbScaling), 177 params.pointCbScaling, 178 sizeof(params.pointCbScaling)); 179 180 MOS_SecureMemcpy(cmd.PointCrValueI0To9, 181 sizeof(params.pointCrValue), 182 params.pointCrValue, 183 sizeof(params.pointCrValue)); 184 185 MOS_SecureMemcpy(cmd.PointCrScalingI0To9, 186 sizeof(params.pointCrScaling), 187 params.pointCrScaling, 188 sizeof(params.pointCrScaling)); 189 190 MOS_SecureMemcpy(cmd.ArCoeffLumaPlus128I023, 191 sizeof(params.arCoeffsY), 192 params.arCoeffsY, 193 sizeof(params.arCoeffsY)); 194 195 MOS_SecureMemcpy(cmd.ArCoeffChromaCbPlus128I024, 196 sizeof(params.arCoeffsCb), 197 params.arCoeffsCb, 198 sizeof(params.arCoeffsCb)); 199 200 MOS_SecureMemcpy(cmd.ArCoeffChromaCrPlus128I024, 201 sizeof(params.arCoeffsCr), 202 params.arCoeffsCr, 203 sizeof(params.arCoeffsCr)); 204 205 #define DO_FIELDS() \ 206 DO_FIELD(DW1, GrainRandomSeed, params.grainRandomSeed); \ 207 DO_FIELD(DW1, ClipToRestrictedRangeFlag, params.clipToRestrictedRange); \ 208 DO_FIELD(DW1, NumberOfLumaPoints, params.numOfYPoints); \ 209 DO_FIELD(DW1, NumberOfChromaCbPoints, params.numOfCbPoints); \ 210 DO_FIELD(DW1, NumberOfChromaCrPoints, params.numOfCrPoints); \ 211 DO_FIELD(DW1, McIdentityFlag, params.matrixCoefficients); \ 212 DO_FIELD(DW2, GrainScalingMinus8, params.grainScalingMinus8); \ 213 DO_FIELD(DW2, ArCoeffLag, params.arCoeffLag); \ 214 DO_FIELD(DW2, ArCoeffShiftMinus6, params.arCoeffShiftMinus6); \ 215 DO_FIELD(DW2, GrainScaleShift, params.grainScaleShift); \ 216 DO_FIELD(DW2, ChromaScalingFromLumaFlag, params.chromaScalingFromLuma); \ 217 DO_FIELD(DW2, GrainNoiseOverlapFlag, params.grainNoiseOverlap); \ 218 \ 219 DO_FIELD(DW43, CbMult, params.cbMult); \ 220 DO_FIELD(DW43, CbLumaMult, params.cbLumaMult); \ 221 DO_FIELD(DW43, CbOffset, params.cbOffset); \ 222 DO_FIELD(DW44, CrMult, params.crMult); \ 223 DO_FIELD(DW44, CrLumaMult, params.crLumaMult); \ 224 DO_FIELD(DW44, CrOffset, params.crOffset) 225 226 #include "mhw_hwcmd_process_cmdfields.h" 227 } 228 _MHW_SETCMD_OVERRIDE_DECL(AVP_TILE_CODING)229 _MHW_SETCMD_OVERRIDE_DECL(AVP_TILE_CODING) 230 { 231 _MHW_SETCMD_CALLBASE(AVP_TILE_CODING); 232 233 #if (_DEBUG || _RELEASE_INTERNAL) 234 #define DO_FIELDS() \ 235 DO_FIELD(DW1, FrameTileId, params.tileId); \ 236 DO_FIELD(DW1, TgTileNum, params.tgTileNum); \ 237 DO_FIELD(DW1, TileGroupId, params.tileGroupId); \ 238 \ 239 DO_FIELD(DW2, TileColumnPositionInSbUnit, params.tileColPositionInSb); \ 240 DO_FIELD(DW2, TileRowPositionInSbUnit, params.tileRowPositionInSb); \ 241 \ 242 DO_FIELD(DW3, TileWidthInSuperblockUnitMinus1, params.tileWidthInSbMinus1); \ 243 DO_FIELD(DW3, TileHeightInSuperblockUnitMinus1, params.tileHeightInSbMinus1); \ 244 DO_FIELD(DW4, FirstTileInAFrame, params.firstTileInAFrame ? 1 : 0); \ 245 DO_FIELD(DW4, AvpCrcEnable, params.enableAvpDebugMode ? 1 : 0); \ 246 DO_FIELD(DW4, IslasttileofcolumnFlag, params.lastTileOfColumn ? 1 : 0); \ 247 DO_FIELD(DW4, IslasttileofrowFlag, params.lastTileOfRow ? 1 : 0); \ 248 DO_FIELD(DW4, IsstarttileoftilegroupFlag, params.firstTileOfTileGroup ? 1 : 0); \ 249 DO_FIELD(DW4, IsendtileoftilegroupFlag, params.lastTileOfTileGroup ? 1 : 0); \ 250 DO_FIELD(DW4, IslasttileofframeFlag, params.lastTileOfFrame ? 1 : 0); \ 251 DO_FIELD(DW4, DisableCdfUpdateFlag, params.disableCdfUpdateFlag ? 1 : 0); \ 252 DO_FIELD(DW4, DisableFrameContextUpdateFlag, params.disableFrameContextUpdateFlag ? 1 : 0); \ 253 \ 254 DO_FIELD(DW5, NumberOfActiveBePipes, params.numOfActiveBePipes); \ 255 DO_FIELD(DW5, NumOfTileColumnsMinus1InAFrame, params.numOfTileColumnsInFrame - 1); \ 256 DO_FIELD(DW5, NumOfTileRowsMinus1InAFrame, params.numOfTileRowsInFrame - 1); \ 257 \ 258 DO_FIELD(DW6, OutputDecodedTileColumnPositionInSbUnit, params.outputDecodedTileColPos); \ 259 DO_FIELD(DW6, OutputDecodedTileRowPositionInSbUnit, params.outputDecodedTileRowPos) 260 #else 261 #define DO_FIELDS() \ 262 DO_FIELD(DW1, FrameTileId, params.tileId); \ 263 DO_FIELD(DW1, TgTileNum, params.tgTileNum); \ 264 DO_FIELD(DW1, TileGroupId, params.tileGroupId); \ 265 \ 266 DO_FIELD(DW2, TileColumnPositionInSbUnit, params.tileColPositionInSb); \ 267 DO_FIELD(DW2, TileRowPositionInSbUnit, params.tileRowPositionInSb); \ 268 \ 269 DO_FIELD(DW3, TileWidthInSuperblockUnitMinus1, params.tileWidthInSbMinus1); \ 270 DO_FIELD(DW3, TileHeightInSuperblockUnitMinus1, params.tileHeightInSbMinus1); \ 271 DO_FIELD(DW4, FirstTileInAFrame, params.firstTileInAFrame ? 1 : 0); \ 272 DO_FIELD(DW4, IslasttileofcolumnFlag, params.lastTileOfColumn ? 1 : 0); \ 273 DO_FIELD(DW4, IslasttileofrowFlag, params.lastTileOfRow ? 1 : 0); \ 274 DO_FIELD(DW4, IsstarttileoftilegroupFlag, params.firstTileOfTileGroup ? 1 : 0); \ 275 DO_FIELD(DW4, IsendtileoftilegroupFlag, params.lastTileOfTileGroup ? 1 : 0); \ 276 DO_FIELD(DW4, IslasttileofframeFlag, params.lastTileOfFrame ? 1 : 0); \ 277 DO_FIELD(DW4, DisableCdfUpdateFlag, params.disableCdfUpdateFlag ? 1 : 0); \ 278 DO_FIELD(DW4, DisableFrameContextUpdateFlag, params.disableFrameContextUpdateFlag ? 1 : 0); \ 279 \ 280 DO_FIELD(DW5, NumberOfActiveBePipes, params.numOfActiveBePipes); \ 281 DO_FIELD(DW5, NumOfTileColumnsMinus1InAFrame, params.numOfTileColumnsInFrame - 1); \ 282 DO_FIELD(DW5, NumOfTileRowsMinus1InAFrame, params.numOfTileRowsInFrame - 1); \ 283 \ 284 DO_FIELD(DW6, OutputDecodedTileColumnPositionInSbUnit, params.outputDecodedTileColPos); \ 285 DO_FIELD(DW6, OutputDecodedTileRowPositionInSbUnit, params.outputDecodedTileRowPos) 286 #endif 287 288 #include "mhw_hwcmd_process_cmdfields.h" 289 } 290 _MHW_SETCMD_OVERRIDE_DECL(AVP_PIPE_BUF_ADDR_STATE)291 _MHW_SETCMD_OVERRIDE_DECL(AVP_PIPE_BUF_ADDR_STATE) 292 { 293 _MHW_SETCMD_CALLBASE(AVP_PIPE_BUF_ADDR_STATE); 294 295 MHW_RESOURCE_PARAMS resourceParams = {}; 296 297 resourceParams.dwLsbNum = MHW_VDBOX_HCP_GENERAL_STATE_SHIFT; 298 resourceParams.HwCommandType = MOS_MFX_PIPE_BUF_ADDR; 299 300 // Film grain related 301 if (!Mos_ResourceIsNull(params.filmGrainOutputSurface)) 302 { 303 MOS_SURFACE details = {}; 304 MOS_ZeroMemory(&details, sizeof(details)); 305 details.Format = Format_Invalid; 306 MHW_MI_CHK_STATUS(this->m_osItf->pfnGetResourceInfo(this->m_osItf, params.filmGrainOutputSurface, &details)); 307 308 cmd.FilmGrainInjectedOutputFrameBufferAddressAttributes.DW0.BaseAddressIndexToMemoryObjectControlStateMocsTables = 0; 309 cmd.FilmGrainInjectedOutputFrameBufferAddressAttributes.DW0.TileMode = this->GetHwTileType(params.filmGrainOutputSurface->TileType, 310 params.filmGrainOutputSurface->TileModeGMM, 311 params.filmGrainOutputSurface->bGMMTileEnabled); 312 313 MOS_MEMCOMP_STATE mmcState = MOS_MEMCOMP_DISABLED; 314 MHW_MI_CHK_STATUS(this->m_osItf->pfnGetMemoryCompressionMode(this->m_osItf, 315 params.filmGrainOutputSurface, 316 &mmcState)); 317 cmd.FilmGrainInjectedOutputFrameBufferAddressAttributes.DW0.BaseAddressMemoryCompressionEnable = this->MmcEnabled(mmcState); 318 cmd.FilmGrainInjectedOutputFrameBufferAddressAttributes.DW0.CompressionType = this->MmcRcEnabled(mmcState); 319 320 resourceParams.presResource = params.filmGrainOutputSurface; 321 resourceParams.dwOffset = details.RenderOffset.YUV.Y.BaseOffset; 322 resourceParams.pdwCmd = (cmd.FilmGrainInjectedOutputFrameBufferAddress.DW0_1.Value); 323 resourceParams.dwLocationInCmd = _MHW_CMD_DW_LOCATION(FilmGrainInjectedOutputFrameBufferAddress); // 21; 324 resourceParams.bIsWritable = true; 325 326 MHW_MI_CHK_STATUS(this->AddResourceToCmd( 327 this->m_osItf, 328 this->m_currentCmdBuf, 329 &resourceParams)); 330 } 331 332 if (!Mos_ResourceIsNull(params.filmGrainSampleTemplateBuffer)) 333 { 334 cmd.FilmGrainSampleTemplateAddressAttributes.DW0.BaseAddressIndexToMemoryObjectControlStateMocsTables = 0; 335 336 resourceParams.presResource = params.filmGrainSampleTemplateBuffer; 337 resourceParams.dwOffset = 0; 338 resourceParams.pdwCmd = (cmd.FilmGrainSampleTemplateAddress.DW0_1.Value); 339 resourceParams.dwLocationInCmd = _MHW_CMD_DW_LOCATION(FilmGrainSampleTemplateAddress); // 59; 340 resourceParams.bIsWritable = true; 341 342 MHW_MI_CHK_STATUS(this->AddResourceToCmd( 343 this->m_osItf, 344 this->m_currentCmdBuf, 345 &resourceParams)); 346 } 347 348 if (!Mos_ResourceIsNull(params.lrTileColumnAlignBuffer)) 349 { 350 cmd.LoopRestorationFilterTileColumnAlignmentReadWriteBufferAddressAttributes.DW0.BaseAddressIndexToMemoryObjectControlStateMocsTables = 0; 351 352 resourceParams.presResource = params.lrTileColumnAlignBuffer; 353 resourceParams.dwOffset = 0; 354 resourceParams.pdwCmd = (cmd.LoopRestorationFilterTileColumnAlignmentReadWriteBufferAddress.DW0_1.Value); 355 resourceParams.dwLocationInCmd = _MHW_CMD_DW_LOCATION(LoopRestorationFilterTileColumnAlignmentReadWriteBufferAddress); // 170; 356 resourceParams.bIsWritable = true; 357 358 MHW_MI_CHK_STATUS(this->AddResourceToCmd( 359 this->m_osItf, 360 this->m_currentCmdBuf, 361 &resourceParams)); 362 } 363 364 if (!Mos_ResourceIsNull(params.filmGrainTileColumnDataBuffer)) 365 { 366 cmd.FilmGrainTileColumnDataReadWriteBufferAddressAttributes.DW0.BaseAddressIndexToMemoryObjectControlStateMocsTables = 0; 367 368 resourceParams.presResource = params.filmGrainTileColumnDataBuffer; 369 resourceParams.dwOffset = 0; 370 resourceParams.pdwCmd = (cmd.FilmGrainTileColumnDataReadWriteBufferAddress.DW0_1.Value); 371 resourceParams.dwLocationInCmd = _MHW_CMD_DW_LOCATION(FilmGrainTileColumnDataReadWriteBufferAddress); // 173; 372 resourceParams.bIsWritable = true; 373 374 MHW_MI_CHK_STATUS(this->AddResourceToCmd( 375 this->m_osItf, 376 this->m_currentCmdBuf, 377 &resourceParams)); 378 } 379 380 return MOS_STATUS_SUCCESS; 381 } 382 MEDIA_CLASS_DEFINE_END(mhw__vdbox__avp__xe2_lpm_base__BaseImpl) 383 }; 384 } // namespace xe2_lpm_base 385 } // namespace avp 386 } // namespace vdbox 387 } // namespace mhw 388 389 #endif // __MHW_VDBOX_AVP_IMPL_XE2_LPM_BASE_H__ 390