1 /* 2 * Copyright (c) 2018-2022, 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 vp_vebox_cmd_packet.h 24 //! \brief vebox packet which used in by mediapipline. 25 //! \details vebox packet provide the structures and generate the cmd buffer which mediapipline will used. 26 //! 27 28 #ifndef __VP_VEBOX_CMD_PACKET_H__ 29 #define __VP_VEBOX_CMD_PACKET_H__ 30 31 #include "vp_vebox_cmd_packet_base.h" 32 #include "vp_vebox_common.h" 33 #include "vp_filter.h" 34 #include "mhw_mi_itf.h" 35 #include "vp_render_sfc_base.h" 36 #include "hal_oca_interface_next.h" 37 38 #define VP_MAX_NUM_FFDI_SURFACES 4 //!< 2 for ADI plus additional 2 for parallel execution on HSW+ 39 #define VP_NUM_FFDN_SURFACES 2 //!< Number of FFDN surfaces 40 #define VP_NUM_STMM_SURFACES 2 //!< Number of STMM statistics surfaces 41 #define VP_DNDI_BUFFERS_MAX 4 //!< Max DNDI buffers 42 #define VP_NUM_KERNEL_VEBOX 8 //!< Max kernels called at Adv stage 43 44 #define VP_VEBOX_RGB_ACE_HISTOGRAM_SIZE_RESERVED (3072 * 4) 45 46 #define VP_VEBOX_LACE_HISTOGRAM_256_BIN_PER_BLOCK (256 * 2) 47 #define VP_NUM_RGB_CHANNEL 3 48 #define VP_NUM_FRAME_PREVIOUS_CURRENT 2 49 50 #define VP_VEBOX_MAX_SLICES_G12 4 51 52 #define VP_VEBOX_RGB_HISTOGRAM_SIZE_G12 (VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE * \ 53 VP_NUM_RGB_CHANNEL * \ 54 VP_VEBOX_MAX_SLICES_G12) 55 56 #ifndef VEBOX_AUTO_DENOISE_SUPPORTED 57 #define VEBOX_AUTO_DENOISE_SUPPORTED 1 58 #endif 59 60 //! 61 //! \brief Denoise Range 62 //! 63 #define NOISEFACTOR_MAX 64 //!< Max Slider value 64 #define NOISEFACTOR_MID 32 //!< Mid Slider value, SKL+ only 65 #define NOISEFACTOR_MIN 0 //!< Min Slider value 66 67 #define VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE (256 * 4) 68 #define VP_VEBOX_ACE_HISTOGRAM_SIZE_PER_FRAME_PER_SLICE (256 * 4) 69 70 //No matter how many vebox running, the histogram slice number is always 4. 71 //When there is only one VEBOX, 0 is written to the other histogram slices by HW. 72 #define VP_VEBOX_HISTOGRAM_SLICES_COUNT 4 73 74 #define VP_VEBOX_RGB_HISTOGRAM_SIZE (VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE * \ 75 VP_NUM_RGB_CHANNEL * \ 76 VP_VEBOX_HISTOGRAM_SLICES_COUNT) 77 #define VP_VEBOX_RGB_ACE_HISTOGRAM_SIZE_RESERVED (3072 * 4) 78 79 //! 80 //! \brief Vebox Statistics Surface definition for TGL 81 //! 82 #define VP_VEBOX_STATISTICS_SIZE (32 * 8) 83 #define VP_VEBOX_STATISTICS_PER_FRAME_SIZE (32 * sizeof(uint32_t)) 84 #define VP_VEBOX_STATISTICS_SURFACE_FMD_OFFSET 0 85 #define VP_VEBOX_STATISTICS_SURFACE_GNE_OFFSET 0x2C 86 #define VP_VEBOX_STATISTICS_SURFACE_TGNE_OFFSET 0x5C 87 #define VP_VEBOX_STATISTICS_SURFACE_STD_OFFSET 0x44 88 89 //! 90 //! \brief Spatial Denoise Definitions 91 //! 92 #define NOSIE_GNE_CHROMA_THRESHOLD 1850 93 #define NOSIE_GNE_LUMA_THRESHOLD 32000 94 #define NOSIE_GNE_RESOLUTION_THRESHOLD 2073600 // size of 1080P 95 //! 96 //! \brief Temporal Denoise Definitions 97 //! 98 //! 99 #define NOISE_HISTORY_DELTA_DEFAULT 8 100 #define NOISE_HISTORY_MAX_DEFAULT 192 101 #define NOISE_NUMMOTIONPIXELS_THRESHOLD_DEFAULT 0 102 #define NOISE_LOWTEMPORALPIXELDIFF_THRESHOLD_DEFAULT 6 103 #define NOISE_TEMPORALPIXELDIFF_THRESHOLD_DEFAULT 12 104 #define NOISE_SUMABSTEMPORALDIFF_THRESHOLD_DEFAULT 128 105 106 // Pixel Range Threshold Array Denoise Definitions for SKL+ 5x5 Bilateral Filter 107 #define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL 1 108 #define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL_MIN 65536 109 #define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL_MAX 393216 110 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI0 192 111 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI1 320 112 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI2 384 113 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI3 640 114 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI4 1024 115 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI5 1280 116 #define NOISE_BLF_RANGE_THRADPDYNR_MIN 512 117 #define NOISE_BLF_RANGE_THRADPDYNR_MAX 2048 118 #define NOISE_BLF_RANGE_THRDYNR_MIN 256 119 #define NOISE_BLF_RANGE_THRESHOLD_S0_MIN 32 120 #define NOISE_BLF_RANGE_THRESHOLD_S0_MID 192 121 #define NOISE_BLF_RANGE_THRESHOLD_S0_MAX 384 122 #define NOISE_BLF_RANGE_THRESHOLD_S1_MIN 64 123 #define NOISE_BLF_RANGE_THRESHOLD_S1_MID 256 124 #define NOISE_BLF_RANGE_THRESHOLD_S1_MAX 576 125 #define NOISE_BLF_RANGE_THRESHOLD_S2_MIN 128 126 #define NOISE_BLF_RANGE_THRESHOLD_S2_MID 512 127 #define NOISE_BLF_RANGE_THRESHOLD_S2_MAX 896 128 #define NOISE_BLF_RANGE_THRESHOLD_S3_MIN 128 129 #define NOISE_BLF_RANGE_THRESHOLD_S3_MID 640 130 #define NOISE_BLF_RANGE_THRESHOLD_S3_MAX 1280 131 #define NOISE_BLF_RANGE_THRESHOLD_S4_MIN 128 132 #define NOISE_BLF_RANGE_THRESHOLD_S4_MID 896 133 #define NOISE_BLF_RANGE_THRESHOLD_S4_MAX 1920 134 #define NOISE_BLF_RANGE_THRESHOLD_S5_MIN 128 135 #define NOISE_BLF_RANGE_THRESHOLD_S5_MID 1280 136 #define NOISE_BLF_RANGE_THRESHOLD_S5_MAX 2560 137 #define NOISE_BLF_RANGE_THRESHOLD_S0_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S0_MID 138 #define NOISE_BLF_RANGE_THRESHOLD_S1_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S1_MID 139 #define NOISE_BLF_RANGE_THRESHOLD_S2_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S2_MID 140 #define NOISE_BLF_RANGE_THRESHOLD_S3_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S3_MID 141 #define NOISE_BLF_RANGE_THRESHOLD_S4_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S4_MID 142 #define NOISE_BLF_RANGE_THRESHOLD_S5_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S5_MID 143 #define NOISE_BLF_RANGE_THRESHOLD_S0_AUTO_DEFAULT 192 144 #define NOISE_BLF_RANGE_THRESHOLD_S1_AUTO_DEFAULT 320 145 #define NOISE_BLF_RANGE_THRESHOLD_S2_AUTO_DEFAULT 384 146 #define NOISE_BLF_RANGE_THRESHOLD_S3_AUTO_DEFAULT 640 147 #define NOISE_BLF_RANGE_THRESHOLD_S4_AUTO_DEFAULT 1024 148 #define NOISE_BLF_RANGE_THRESHOLD_S5_AUTO_DEFAULT 1280 149 150 // Pixel Range Weight Array Denoise Definitions for SKL+ 5x5 Bilateral Filter 151 #define NOISE_BLF_RANGE_WGTS0_MIN 16 152 #define NOISE_BLF_RANGE_WGTS0_MID 16 153 #define NOISE_BLF_RANGE_WGTS0_MAX 16 154 #define NOISE_BLF_RANGE_WGTS1_MIN 9 155 #define NOISE_BLF_RANGE_WGTS1_MID 14 156 #define NOISE_BLF_RANGE_WGTS1_MAX 15 157 #define NOISE_BLF_RANGE_WGTS2_MIN 2 158 #define NOISE_BLF_RANGE_WGTS2_MID 10 159 #define NOISE_BLF_RANGE_WGTS2_MAX 13 160 #define NOISE_BLF_RANGE_WGTS3_MIN 0 161 #define NOISE_BLF_RANGE_WGTS3_MID 5 162 #define NOISE_BLF_RANGE_WGTS3_MAX 10 163 #define NOISE_BLF_RANGE_WGTS4_MIN 0 164 #define NOISE_BLF_RANGE_WGTS4_MID 2 165 #define NOISE_BLF_RANGE_WGTS4_MAX 7 166 #define NOISE_BLF_RANGE_WGTS5_MIN 0 167 #define NOISE_BLF_RANGE_WGTS5_MID 1 168 #define NOISE_BLF_RANGE_WGTS5_MAX 4 169 #define NOISE_BLF_RANGE_WGTS0_DEFAULT NOISE_BLF_RANGE_WGTS0_MID 170 #define NOISE_BLF_RANGE_WGTS1_DEFAULT NOISE_BLF_RANGE_WGTS1_MID 171 #define NOISE_BLF_RANGE_WGTS2_DEFAULT NOISE_BLF_RANGE_WGTS2_MID 172 #define NOISE_BLF_RANGE_WGTS3_DEFAULT NOISE_BLF_RANGE_WGTS3_MID 173 #define NOISE_BLF_RANGE_WGTS4_DEFAULT NOISE_BLF_RANGE_WGTS4_MID 174 #define NOISE_BLF_RANGE_WGTS5_DEFAULT NOISE_BLF_RANGE_WGTS5_MID 175 176 // Distance Weight Matrix Denoise Definitions for SKL+ 5x5 Bilateral Filter 177 #define NOISE_BLF_DISTANCE_WGTS00_DEFAULT 12 178 #define NOISE_BLF_DISTANCE_WGTS01_DEFAULT 12 179 #define NOISE_BLF_DISTANCE_WGTS02_DEFAULT 10 180 #define NOISE_BLF_DISTANCE_WGTS10_DEFAULT 12 181 #define NOISE_BLF_DISTANCE_WGTS11_DEFAULT 11 182 #define NOISE_BLF_DISTANCE_WGTS12_DEFAULT 10 183 #define NOISE_BLF_DISTANCE_WGTS20_DEFAULT 10 184 #define NOISE_BLF_DISTANCE_WGTS21_DEFAULT 10 185 #define NOISE_BLF_DISTANCE_WGTS22_DEFAULT 8 186 187 //! 188 //! \brief Improved Deinterlacing for CNL+ 189 //! 190 #define VPHAL_VEBOX_DI_CHROMA_TDM_WEIGHT_NATUAL 0 191 #define VPHAL_VEBOX_DI_LUMA_TDM_WEIGHT_NATUAL 4 192 #define VPHAL_VEBOX_DI_SHCM_DELTA_NATUAL 5 193 #define VPHAL_VEBOX_DI_SHCM_THRESHOLD_NATUAL 255 194 #define VPHAL_VEBOX_DI_SVCM_DELTA_NATUAL 5 195 #define VPHAL_VEBOX_DI_SVCM_THRESHOLD_NATUAL 255 196 #define VPHAL_VEBOX_DI_LUMA_TDM_CORING_THRESHOLD_NATUAL 0 197 #define VPHAL_VEBOX_DI_CHROMA_TDM_CORING_THRESHOLD_NATUAL 0 198 #define VPHAL_VEBOX_DI_DIRECTION_CHECK_THRESHOLD_NATUAL 3 199 #define VPHAL_VEBOX_DI_TEARING_LOW_THRESHOLD_NATUAL 20 200 #define VPHAL_VEBOX_DI_TEARING_HIGH_THRESHOLD_NATUAL 100 201 #define VPHAL_VEBOX_DI_DIFF_CHECK_SLACK_THRESHOLD_NATUAL 15 202 #define VPHAL_VEBOX_DI_SAD_WT0_NATUAL 0 203 #define VPHAL_VEBOX_DI_SAD_WT1_NATUAL 63 204 #define VPHAL_VEBOX_DI_SAD_WT2_NATUAL 76 205 #define VPHAL_VEBOX_DI_SAD_WT3_NATUAL 89 206 #define VPHAL_VEBOX_DI_SAD_WT4_NATUAL 114 207 #define VPHAL_VEBOX_DI_SAD_WT6_NATUAL 217 208 #define VPHAL_VEBOX_DI_LPFWTLUT0_SD_NATUAL 0 209 #define VPHAL_VEBOX_DI_LPFWTLUT0_HD_NATUAL 0 210 #define VPHAL_VEBOX_DI_LPFWTLUT1_SD_NATUAL 0 211 #define VPHAL_VEBOX_DI_LPFWTLUT1_HD_NATUAL 0 212 #define VPHAL_VEBOX_DI_LPFWTLUT2_SD_NATUAL 0 213 #define VPHAL_VEBOX_DI_LPFWTLUT2_HD_NATUAL 0 214 #define VPHAL_VEBOX_DI_LPFWTLUT3_SD_NATUAL 128 215 #define VPHAL_VEBOX_DI_LPFWTLUT3_HD_NATUAL 0 216 #define VPHAL_VEBOX_DI_LPFWTLUT4_SD_NATUAL 128 217 #define VPHAL_VEBOX_DI_LPFWTLUT4_HD_NATUAL 32 218 #define VPHAL_VEBOX_DI_LPFWTLUT5_SD_NATUAL 128 219 #define VPHAL_VEBOX_DI_LPFWTLUT5_HD_NATUAL 64 220 #define VPHAL_VEBOX_DI_LPFWTLUT6_SD_NATUAL 255 221 #define VPHAL_VEBOX_DI_LPFWTLUT6_HD_NATUAL 128 222 #define VPHAL_VEBOX_DI_LPFWTLUT7_SD_NATUAL 255 223 #define VPHAL_VEBOX_DI_LPFWTLUT7_HD_NATUAL 255 224 225 //! 226 //! \brief STE factor 227 //! 228 229 #define MHW_STE_FACTOR_MAX 9 // STE factor is 0 ~ 9 230 231 // \brief VEBOX 3DLUT HDR 232 #define LUT65_SEG_SIZE 65 233 #define LUT65_MUL_SIZE 128 234 #define LUT33_SEG_SIZE 33 235 #define LUT33_MUL_SIZE 64 236 #define VP_VEBOX_HDR_3DLUT65 LUT65_SEG_SIZE *\ 237 LUT65_SEG_SIZE *\ 238 LUT65_MUL_SIZE * sizeof(int64_t) 239 #define VP_VEBOX_HDR_3DLUT33 LUT33_SEG_SIZE * \ 240 LUT33_SEG_SIZE * \ 241 LUT33_MUL_SIZE * \ 242 sizeof(int64_t) 243 #define SHAPE_1K_LOOKUP_SIZE 2048 * sizeof(uint32_t) 244 //! 245 //! \brief Vebox Statistics Surface definition 246 //! 247 #define VPHAL_VEBOX_STATISTICS_SIZE (32 * 8) 248 #define VPHAL_VEBOX_STATISTICS_SURFACE_GNE_OFFSET 0x2C 249 #define VPHAL_VEBOX_STATISTICS_SURFACE_STD_OFFSET 0x44 250 #define VPHAL_VEBOX_STATISTICS_PER_FRAME_SIZE (32 * sizeof(uint32_t)) 251 #define VPHAL_VEBOX_STATISTICS_SURFACE_FMD_OFFSET 0 252 253 //! \brief Number of LACE's PWLF surfaces 254 //! 255 #define VP_NUM_LACE_PWLF_SURFACES 2 256 257 //! 258 //! \brief Chroma Denoise params 259 //! 260 typedef struct _VPHAL_DNUV_PARAMS 261 { 262 uint32_t dwHistoryInitUV; 263 uint32_t dwHistoryDeltaUV; 264 uint32_t dwHistoryMaxUV; 265 uint32_t dwSTADThresholdU; 266 uint32_t dwSTADThresholdV; 267 uint32_t dwLTDThresholdU; 268 uint32_t dwLTDThresholdV; 269 uint32_t dwTDThresholdU; 270 uint32_t dwTDThresholdV; 271 } VPHAL_DNUV_PARAMS, *PVPHAL_DNUV_PARAMS; 272 273 //! 274 //! \brief Structure to handle DNDI sampler states 275 //! 276 typedef struct _VP_SAMPLER_STATE_DN_PARAM 277 { 278 uint32_t dwDenoiseASDThreshold; 279 uint32_t dwDenoiseHistoryDelta; 280 uint32_t dwDenoiseMaximumHistory; 281 uint32_t dwDenoiseSTADThreshold; 282 uint32_t dwDenoiseSCMThreshold; 283 uint32_t dwDenoiseMPThreshold; 284 uint32_t dwLTDThreshold; 285 uint32_t dwTDThreshold; 286 uint32_t dwGoodNeighborThreshold; 287 } VP_SAMPLER_STATE_DN_PARAM, *PVP_SAMPLER_STATE_DN_PARAM; 288 289 namespace vp 290 { 291 typedef struct _VEBOX_PACKET_SURFACE_PARAMS 292 { 293 VP_SURFACE *pCurrInput; 294 VP_SURFACE *pPrevInput; 295 VP_SURFACE *pSTMMInput; 296 VP_SURFACE *pSTMMOutput; 297 VP_SURFACE *pDenoisedCurrOutput; 298 VP_SURFACE *pCurrOutput; //!< Current Vebox Output 299 VP_SURFACE *pPrevOutput; 300 VP_SURFACE *pStatisticsOutput; 301 VP_SURFACE *pAlphaOrVignette; 302 VP_SURFACE *pLaceOrAceOrRgbHistogram; 303 VP_SURFACE *pSurfSkinScoreOutput; 304 VP_SURFACE *pFMDHistorySurface; 305 VP_SURFACE *pInnerTileConvertInput; 306 }VEBOX_PACKET_SURFACE_PARAMS, *PVEBOX_PACKET_SURFACE_PARAMS; 307 }; 308 309 enum MEDIASTATE_DNDI_FIELDCOPY_SELECT 310 { 311 MEDIASTATE_DNDI_DEINTERLACE = 0, 312 MEDIASTATE_DNDI_FIELDCOPY_PREV = 1, 313 MEDIASTATE_DNDI_FIELDCOPY_NEXT = 2 314 }; 315 316 //! 317 //! \brief VPHAL Query Type for Vebox Statistics Surface 318 //! 319 typedef enum _VEBOX_STAT_QUERY_TYPE 320 { 321 VEBOX_STAT_QUERY_FMD_OFFEST = 0, 322 VEBOX_STAT_QUERY_WB_OFFEST, 323 VEBOX_STAT_QUERY_GNE_OFFEST, 324 VEBOX_STAT_QUERY_STD_OFFEST, 325 VEBOX_STAT_QUERY_GCC_OFFEST, 326 VEBOX_STAT_QUERY_PER_FRAME_SIZE 327 } VEBOX_STAT_QUERY_TYPE; 328 329 //! 330 //! \brief Feature specific cache control settings 331 //! 332 typedef struct _VP_VEBOX_CACHE_CNTL 333 { 334 // Input 335 bool bDnDi; 336 bool bLace; 337 338 // Output 339 VPHAL_DNDI_CACHE_CNTL DnDi; 340 VPHAL_LACE_CACHE_CNTL Lace; 341 } VP_VEBOX_CACHE_CNTL, *PVP_VEBOX_CACHE_CNTL; 342 343 namespace vp { 344 345 class VpVeboxCmdPacket : virtual public VpVeboxCmdPacketBase 346 { 347 public: 348 VpVeboxCmdPacket(MediaTask * task, PVP_MHWINTERFACE hwInterface, PVpAllocator &allocator, VPMediaMemComp *mmc); 349 350 virtual ~VpVeboxCmdPacket(); 351 352 virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket) override; 353 354 virtual MOS_STATUS Init() override; 355 Destory()356 virtual MOS_STATUS Destory() { return MOS_STATUS_SUCCESS; }; 357 358 virtual MOS_STATUS Prepare() override; 359 360 virtual MOS_STATUS PrepareState() override; 361 AllocateExecRenderData()362 virtual MOS_STATUS AllocateExecRenderData() 363 { 364 MOS_STATUS eStatus = MOS_STATUS_SUCCESS; 365 366 if (!m_lastExecRenderData) 367 { 368 m_lastExecRenderData = MOS_New(VpVeboxRenderData); 369 if (!m_lastExecRenderData) 370 { 371 return MOS_STATUS_NO_SPACE; 372 } 373 374 eStatus = m_lastExecRenderData->Init(); 375 if (eStatus != MOS_STATUS_SUCCESS) 376 { 377 MOS_Delete(m_lastExecRenderData); 378 } 379 380 } 381 return eStatus; 382 } 383 GetLastExecRenderData()384 virtual VpVeboxRenderData *GetLastExecRenderData() 385 { 386 if (!m_lastExecRenderData) 387 { 388 AllocateExecRenderData(); 389 } 390 return m_lastExecRenderData; 391 } 392 IsIECPEnabled()393 virtual bool IsIECPEnabled() 394 { 395 if (GetLastExecRenderData() != NULL) 396 { 397 return GetLastExecRenderData()->IECP.IsIecpEnabled(); 398 } 399 return false; 400 } 401 402 virtual MOS_STATUS ValidateHDR3DLutParameters(bool is3DLutTableFilled); 403 404 //! 405 //! \brief Setup surface states for Vebox 406 //! \details Setup surface states for use in the current Vebox Operation 407 //! \param [in] bDiVarianceEnable 408 //! Is DI/Variances report enabled 409 //! \param [in,out] pVeboxSurfaceStateCmdParams 410 //! Pointer to VEBOX_SURFACE_STATE command parameters 411 //! \return void 412 //! 413 virtual MOS_STATUS SetupSurfaceStates( 414 PVP_VEBOX_SURFACE_STATE_CMD_PARAMS pVeboxSurfaceStateCmdParams); 415 416 //! 417 //! \brief Setup surface states for Vebox 418 //! \details Setup surface states for use in the current Vebox Operation 419 //! \param [in] pRenderHal 420 //! Pointer to Render Hal 421 //! \param [in] CmdBuffer 422 //! Pointer to command buffer 423 //! \param [in] pGenericPrologParams 424 //! pointer to Generic prolog params struct to send to cmd buffer header 425 //! \return void 426 //! 427 virtual MOS_STATUS InitCmdBufferWithVeParams( 428 PRENDERHAL_INTERFACE pRenderHal, 429 MOS_COMMAND_BUFFER &CmdBuffer, 430 PRENDERHAL_GENERIC_PROLOG_PARAMS pGenericPrologParams); 431 432 //! 433 //! \brief Setup Scaling Params for Vebox/SFC 434 //! \details Setup surface Scaling Params for Vebox/SFC 435 //! \param [in] scalingParams 436 //! Scaling Params 437 //! \return MOS_STATUS 438 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 439 //! 440 virtual MOS_STATUS SetScalingParams(PSFC_SCALING_PARAMS scalingParams) override; 441 442 //! 443 //! \brief Setup CSC Params for Vebox/SFC 444 //! \details Setup surface CSC Params for Vebox/SFC 445 //! \param [in] cscParams 446 //! CSC/IEF Params 447 //! \return MOS_STATUS 448 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 449 //! 450 virtual MOS_STATUS SetSfcCSCParams(PSFC_CSC_PARAMS cscParams) override; 451 452 //! 453 //! \brief Setup CSC Params for Vebox back end 454 //! \details Setup surface CSC Params for Vebox 455 //! \param [in] cscParams 456 //! CSC Params 457 //! \return MOS_STATUS 458 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 459 //! 460 virtual MOS_STATUS SetVeboxBeCSCParams(PVEBOX_CSC_PARAMS cscParams) override; 461 462 //! 463 //! \brief Setup Vebox Output Alpha Value 464 //! \details Setup Vebox Output Alpha Value 465 //! \param [in] cscParams 466 //! CSC Params 467 //! \return MOS_STATUS 468 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 469 //! 470 virtual MOS_STATUS SetVeboxOutputAlphaParams(PVEBOX_CSC_PARAMS cscParams) ; 471 472 //! 473 //! \brief Setup Vebox Chroma sub sampling 474 //! \details Setup Vebox Chroma sub sampling 475 //! \param [in] cscParams 476 //! CSC Params 477 //! \return MOS_STATUS 478 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 479 //! 480 virtual MOS_STATUS SetVeboxChromasitingParams(PVEBOX_CSC_PARAMS cscParams); 481 482 //! 483 //! \brief Setup Roattion/Mirror Params for Vebox/SFC 484 //! \details Setup surface Roattion/Mirror Params for Vebox/SFC 485 //! \param [in] rotMirParams 486 //! Rotation/Mirror Params 487 //! \return MOS_STATUS 488 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 489 //! 490 virtual MOS_STATUS SetSfcRotMirParams(PSFC_ROT_MIR_PARAMS rotMirParams) override; 491 492 //! 493 //! \brief Setup DN Params for Vebox 494 //! \details Setup surface DN Params for Vebox 495 //! \param [in] dnParams 496 //! DN Params 497 //! \return MOS_STATUS 498 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 499 //! 500 virtual MOS_STATUS SetDnParams(PVEBOX_DN_PARAMS dnParams) override; 501 502 //! 503 //! \brief Setup STE Params for Vebox 504 //! \details Setup surface STE Params for Vebox 505 //! \param [in] steParams 506 //! STE Params 507 //! \return MOS_STATUS 508 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 509 //! 510 virtual MOS_STATUS SetSteParams(PVEBOX_STE_PARAMS steParams) override; 511 512 //! 513 //! \brief Setup HDR Params for Vebox 514 //! \details Setup surface HDR Params for Vebox 515 //! \param [in] HDRParams 516 //! HDR Params 517 //! \return MOS_STATUS 518 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 519 //! 520 virtual MOS_STATUS SetHdrParams(PVEBOX_HDR_PARAMS hdrParams) override; 521 522 //! 523 //! \brief Setup TCC Params for Vebox 524 //! \details Setup surface TCC Params for Vebox 525 //! \param [in] tccParams 526 //! TCC Params 527 //! \return MOS_STATUS 528 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 529 //! 530 virtual MOS_STATUS SetTccParams(PVEBOX_TCC_PARAMS tccParams) override; 531 532 //! 533 //! \brief Setup Procamp Params for Vebox 534 //! \details Setup surface Procamp Params for Vebox 535 //! \param [in] procampParams 536 //! Procamp Params 537 //! \return MOS_STATUS 538 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 539 //! 540 virtual MOS_STATUS SetProcampParams(PVEBOX_PROCAMP_PARAMS procampParams) override; 541 542 //! 543 //! \brief Setup DI Params for Vebox 544 //! \details Setup surface DN Params for Vebox 545 //! \param [in] diParams 546 //! DI Params 547 //! \return MOS_STATUS 548 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 549 //! 550 virtual MOS_STATUS SetDiParams(PVEBOX_DI_PARAMS diParams) override; 551 virtual MOS_STATUS ConfigureSteParams(VpVeboxRenderData *renderData, bool bEnableSte, uint32_t dwSTEFactor, bool bEnableStd, uint32_t stdParaSizeInBytes, void *stdParams); 552 553 //! 554 //! \brief Setup CGC Params for Vebox 555 //! \details Setup surface CGC Params for Vebox 556 //! \param [in] cgcParams 557 //! CGC Params 558 //! \return MOS_STATUS 559 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 560 //! 561 virtual MOS_STATUS SetCgcParams(PVEBOX_CGC_PARAMS cgcParams) override; 562 virtual MOS_STATUS ConfigureTccParams(VpVeboxRenderData *renderData, bool bEnableTcc, uint8_t magenta, uint8_t red, uint8_t yellow, uint8_t green, uint8_t cyan, uint8_t blue); 563 virtual MOS_STATUS ConfigureProcampParams(VpVeboxRenderData *renderData, bool bEnableProcamp, float fBrightness, float fContrast, float fHue, float fSaturation); 564 virtual MOS_STATUS ConfigureDenoiseParams(VpVeboxRenderData *renderData, float fDenoiseFactor); 565 566 virtual MOS_STATUS UpdateCscParams(FeatureParamCsc ¶ms) override; 567 virtual MOS_STATUS UpdateDenoiseParams(FeatureParamDenoise ¶ms) override; 568 virtual MOS_STATUS UpdateTccParams(FeatureParamTcc ¶ms) override; 569 virtual MOS_STATUS UpdateSteParams(FeatureParamSte ¶ms) override; 570 virtual MOS_STATUS UpdateProcampParams(FeatureParamProcamp ¶ms) override; 571 572 virtual void AddCommonOcaMessage(PMOS_COMMAND_BUFFER pCmdBufferInUse, MOS_CONTEXT_HANDLE pOsContext, PMOS_INTERFACE pOsInterface, PRENDERHAL_INTERFACE pRenderHal, PMHW_MI_MMIOREGISTERS pMmioRegisters); 573 //! 574 //! \brief Get DN luma parameters 575 //! \details Get DN luma parameters 576 //! \param [in] bDnEnabled 577 //! true if DN being enabled 578 //! \param [in] bAutoDetect 579 //! true if auto DN being enabled 580 //! \param [in] fDnFactor 581 //! DN factor 582 //! \param [in] bRefValid 583 //! true if reference surface available 584 //! \param [out] pLumaParams 585 //! DN luma parameters 586 //! \return MOS_STATUS 587 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 588 //! GetDnLumaParams(bool bDnEnabled,bool bAutoDetect,float fDnFactor,bool bRefValid,PVP_SAMPLER_STATE_DN_PARAM pLumaParams)589 virtual MOS_STATUS GetDnLumaParams( 590 bool bDnEnabled, 591 bool bAutoDetect, 592 float fDnFactor, 593 bool bRefValid, 594 PVP_SAMPLER_STATE_DN_PARAM pLumaParams) { return MOS_STATUS_SUCCESS; } 595 596 //! 597 //! \brief Get DN chroma parameters 598 //! \details Get DN chroma parameters 599 //! \param [in] bChromaDenoise 600 //! true if chroma DN being enabled 601 //! \param [in] bAutoDetect 602 //! true if auto DN being enabled 603 //! \param [in] fDnFactor 604 //! DN factor 605 //! \param [out] pChromaParams 606 //! DN chroma parameters 607 //! \return MOS_STATUS 608 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 609 //! GetDnChromaParams(bool bChromaDenoise,bool bAutoDetect,float fDnFactor,PVPHAL_DNUV_PARAMS pChromaParams)610 virtual MOS_STATUS GetDnChromaParams( 611 bool bChromaDenoise, 612 bool bAutoDetect, 613 float fDnFactor, 614 PVPHAL_DNUV_PARAMS pChromaParams) { return MOS_STATUS_SUCCESS; } 615 616 //! 617 //! \brief Config DN luma pix range 618 //! \details Config DN luma pix range threshold and weight 619 //! \param [in] bDnEnabled 620 //! true if DN being enabled 621 //! \param [in] bAutoDetect 622 //! true if auto DN being enabled 623 //! \param [in] fDnFactor 624 //! DN factor 625 //! \return MOS_STATUS 626 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 627 //! ConfigLumaPixRange(bool bDnEnabled,bool bAutoDetect,float fDnFactor)628 virtual MOS_STATUS ConfigLumaPixRange( 629 bool bDnEnabled, 630 bool bAutoDetect, 631 float fDnFactor) { return MOS_STATUS_SUCCESS; } 632 633 //! 634 //! \brief Config DN chroma pix range 635 //! \details Config DN chroma pix range threshold and weight 636 //! \param [in] bChromaDenoise 637 //! true if chroma DN being enabled 638 //! \param [in] bAutoDetect 639 //! true if auto DN being enabled 640 //! \param [in] fDnFactor 641 //! DN factor 642 //! \return MOS_STATUS 643 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 644 //! ConfigChromaPixRange(bool bChromaDenoise,bool bAutoDetect,float fDnFactor)645 virtual MOS_STATUS ConfigChromaPixRange( 646 bool bChromaDenoise, 647 bool bAutoDetect, 648 float fDnFactor) { return MOS_STATUS_SUCCESS; } 649 650 virtual MOS_STATUS InitSTMMHistory(); 651 652 //! 653 //! \brief Vebox Populate VEBOX parameters 654 //! \details Populate the Vebox VEBOX state parameters to VEBOX RenderData 655 //! \param [in] bDnEnabled 656 //! true if DN being enabled 657 //! \param [in] bChromaDenoise 658 //! true if chroma DN being enabled 659 //! \param [in] pLumaParams 660 //! Pointer to Luma DN and DI parameter 661 //! \param [in] pChromaParams 662 //! Pointer to Chroma DN parameter 663 //! \return MOS_STATUS 664 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 665 //! 666 virtual MOS_STATUS ConfigDnLumaChromaParams( 667 bool bDnEnabled, 668 bool bChromaDenoise, 669 PVP_SAMPLER_STATE_DN_PARAM pLumaParams, 670 PVPHAL_DNUV_PARAMS pChromaParams 671 ); 672 673 //! 674 //! \brief Calculate offsets of statistics surface address based on the 675 //! functions which were enabled in the previous call, 676 //! and store the width and height of the per-block statistics into DNDI_STATE 677 //! \details 678 //! Layout of Statistics surface when Temporal DI enabled 679 //! --------------------------------------------------------------\n 680 //! | 16 bytes for x=0, Y=0 | 16 bytes for x=16, Y=0 | ...\n 681 //! |-------------------------------------------------------------\n 682 //! | 16 bytes for x=0, Y=4 | ...\n 683 //! |------------------------------\n 684 //! | ...\n 685 //! |------------------------------\n 686 //! | 16 bytes for x=0, Y=height-4| ...\n 687 //! |-----------------------------------------------Pitch----------------------------------------------------------\n 688 //! | 256 DW of ACE histogram Slice 0 (Previous)| 17 DW Reserved | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n 689 //! |--------------------------------------------------------------------------------------------------------------\n 690 //! | 256 DW of ACE histogram Slice 0 (Current) | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n 691 //! |--------------------------------------------------------------------------------------------------------------\n 692 //! | 256 DW of ACE histogram Slice 1 (Previous)| 17 DW Reserved | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n 693 //! |--------------------------------------------------------------------------------------------------------------\n 694 //! | 256 DW of ACE histogram Slice 1 (Current) | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n 695 //! ---------------------------------------------------------------------------------------------------------------\n 696 //! 697 //! Layout of Statistics surface when DN or Spatial DI enabled (and Temporal DI disabled) 698 //! --------------------------------------------------------------\n 699 //! | 16 bytes for x=0, Y=0 | 16 bytes for x=16, Y=0 | ...\n 700 //! |-------------------------------------------------------------\n 701 //! | 16 bytes for x=0, Y=4 | ...\n 702 //! |------------------------------\n 703 //! | ...\n 704 //! |------------------------------\n 705 //! | 16 bytes for x=0, Y=height-4| ...\n 706 //! |-----------------------------------------------Pitch----------------------------------------------------------\n 707 //! | 256 DW of ACE histogram Slice 0 (Input) | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n 708 //! |--------------------------------------------------------------------------------------------------------------\n 709 //! | 256 DW of ACE histogram Slice 1 (Input) | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n 710 //! ---------------------------------------------------------------------------------------------------------------\n 711 //! 712 //! Layout of Statistics surface when both DN and DI are disabled 713 //! ------------------------------------------------Pitch----------------------------------------------------------\n 714 //! | 256 DW of ACE histogram Slice 0 (Input) | 17 DW Reserved | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n 715 //! |--------------------------------------------------------------------------------------------------------------\n 716 //! | 256 DW of ACE histogram Slice 1 (Input) | 17 DW Reserved | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n 717 //! ---------------------------------------------------------------------------------------------------------------\n 718 //! \param [out] pStatSlice0Offset 719 //! Statistics surface Slice 0 base pointer 720 //! \param [out] pStatSlice1Offset 721 //! Statistics surface Slice 1 base pointer 722 //! \return MOS_STATUS 723 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 724 //! 725 virtual MOS_STATUS GetStatisticsSurfaceOffsets( 726 int32_t* pStatSlice0Offset, 727 int32_t* pStatSlice1Offset); 728 729 //! 730 //! \brief Configure FMD parameter 731 //! \details Configure FMD parameters for DNDI State 732 //! \param [in] bProgressive 733 //! true if sample being progressive 734 //! \param [in] bAutoDenoise 735 //! true if auto denoise being enabled 736 //! \param [out] pLumaParams 737 //! Pointer to DNDI Param for set FMD parameters 738 //! \return MOS_STATUS 739 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 740 //! 741 virtual MOS_STATUS ConfigFMDParams(bool bProgressive, bool bAutoDenoise, bool bFmdEnabled); 742 743 //! 744 //! \brief Setup Vebox_State Command parameter 745 //! \param [in,out] pVeboxStateCmdParams 746 //! Pointer to VEBOX_STATE command parameters 747 //! \return MOS_STATUS 748 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 749 //! 750 virtual MOS_STATUS SetupVeboxState(mhw::vebox::VEBOX_STATE_PAR& veboxStateCmdParams); 751 752 //! 753 //! \brief Setup Vebox_DI_IECP Command params 754 //! \details Setup Vebox_DI_IECP Command params 755 //! \param [in] bDiScdEnable 756 //! Is DI/Variances report enabled 757 //! \param [in,out] pVeboxDiIecpCmdParams 758 //! Pointer to VEBOX_DI_IECP command parameters 759 //! \return MOS_STATUS 760 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 761 //! 762 virtual MOS_STATUS SetupDiIecpState( 763 bool bDiScdEnable, 764 mhw::vebox::VEB_DI_IECP_PAR &veboxDiIecpCmdParam); 765 766 //! 767 //! \brief Check Vebox using kernel resource or not 768 //! \details Check Vebox using kernel resource or not 769 //! \return bool 770 //! Return true if use kernel resource 771 //! 772 virtual bool UseKernelResource(); 773 774 //! 775 //! \brief Vebox send Vebox ring HW commands 776 //! \details Send Vebox ring Commands. 777 //! \return MOS_STATUS 778 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 779 //! 780 virtual MOS_STATUS SendVeboxCmd(MOS_COMMAND_BUFFER* commandBuffer); 781 782 //! 783 //! \brief enable or disable SFC output path. 784 //! \details enable or disable SFC output path 785 //! \return void 786 //! SetSfcOutputPath(bool bSfcUsed)787 virtual void SetSfcOutputPath(bool bSfcUsed) { m_IsSfcUsed = bSfcUsed; }; 788 GetSfcRenderInstance()789 virtual SfcRenderBase* GetSfcRenderInstance() { return m_sfcRender; }; 790 791 virtual MOS_STATUS PacketInit( 792 VP_SURFACE *inputSurface, 793 VP_SURFACE *outputSurface, 794 VP_SURFACE *previousSurface, 795 VP_SURFACE_SETTING &surfSetting, 796 VP_EXECUTE_CAPS packetCaps) override; 797 798 virtual MOS_STATUS SetUpdatedExecuteResource( 799 VP_SURFACE *inputSurface, 800 VP_SURFACE *outputSurface, 801 VP_SURFACE *previousSurface, 802 VP_SURFACE_SETTING &surfSetting) override; 803 804 //! 805 //! \brief Check whether the Vebox command parameters are correct 806 //! \param [in] VeboxStateCmdParams 807 //! MHW vebox state cmd params 808 //! \param [in] VeboxDiIecpCmdParams 809 //! DiIecpCmd params struct 810 //! \return MOS_STATUS 811 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 812 //! 813 virtual MOS_STATUS IsCmdParamsValid( 814 const mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams, 815 const mhw::vebox::VEB_DI_IECP_PAR &veboxDiIecpCmdParams, 816 const VP_VEBOX_SURFACE_STATE_CMD_PARAMS &VeboxSurfaceStateCmdParams); 817 QueryStatLayout(VEBOX_STAT_QUERY_TYPE QueryType,uint32_t * pQuery)818 virtual MOS_STATUS QueryStatLayout( 819 VEBOX_STAT_QUERY_TYPE QueryType, 820 uint32_t* pQuery) {return MOS_STATUS_SUCCESS;}; 821 822 //! 823 //! \brief Determine if the Batch Buffer End is needed to add in the end 824 //! \details Detect platform OS and return the flag whether the Batch Buffer End is needed to add in the end 825 //! \param [in] pOsInterface 826 //! Pointer to MOS_INTERFACE 827 //! \return bool 828 //! The flag of adding Batch Buffer End 829 //! 830 virtual bool RndrCommonIsMiBBEndNeeded( 831 PMOS_INTERFACE pOsInterface); 832 833 //! 834 //! \brief Vebox perftag 835 //! \details set vebox perftag 836 //! \return MOS_STATUS 837 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 838 //! 839 virtual MOS_STATUS VeboxSetPerfTag(); 840 841 //! 842 //! \brief Vebox perftag for NV12 source 843 //! \details set vebox perftag for NV12 source 844 //! \return MOS_STATUS 845 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 846 //! 847 virtual MOS_STATUS VeboxSetPerfTagNv12(); 848 849 //! 850 //! \brief Vebox perftag for Pa format source 851 //! \details set vebox perftag for Pa format source 852 //! \return MOS_STATUS 853 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 854 //! 855 virtual MOS_STATUS VeboxSetPerfTagPaFormat(); 856 857 //! 858 //! \brief Vebox state heap update for auto mode features 859 //! \details Update Vebox indirect states for auto mode features 860 //! \return MOS_STATUS 861 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 862 //! 863 virtual MOS_STATUS UpdateVeboxStates(); 864 865 //! \brief Vebox get statistics surface base 866 //! \details Calculate address of statistics surface address based on the 867 //! functions which were enabled in the previous call. 868 //! \param uint8_t* pStat 869 //! [in] Pointer to Statistics surface 870 //! \param uint8_t* * pStatSlice0Base 871 //! [out] Statistics surface Slice 0 base pointer 872 //! \param uint8_t* * pStatSlice1Base 873 //! [out] Statistics surface Slice 1 base pointer 874 //! \return MOS_STATUS 875 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 876 //! 877 virtual MOS_STATUS GetStatisticsSurfaceBase( 878 uint8_t *pStat, 879 uint8_t **pStatSlice0Base, 880 uint8_t **pStatSlice1Base); 881 882 virtual MOS_STATUS QueryStatLayoutGNE( 883 VEBOX_STAT_QUERY_TYPE QueryType, 884 uint32_t *pQuery, 885 uint8_t *pStatSlice0Base, 886 uint8_t *pStatSlice1Base); 887 888 virtual MOS_STATUS CheckTGNEValid( 889 uint32_t *pStatSlice0GNEPtr, 890 uint32_t *pStatSlice1GNEPtr, 891 uint32_t *pQuery); 892 //! 893 //! \brief Vebox update HVS DN states 894 //! \details CPU update for VEBOX DN states 895 //! \param bDnEnabled 896 //! [in] true if DN enabled 897 //! \param bChromaDenoise 898 //! [in] true if chroma DN enabled 899 //! \param bAutoDenoise 900 //! [in] true if auto DN enabled 901 //! \param uint32_t* pStatSlice0GNEPtr 902 //! [out] Pointer to Vebox slice0 GNE data 903 //! \param uint32_t* pStatSlice1GNEPtr 904 //! [out] Pointer to Vebox slice1 GNE data 905 //! \return MOS_STATUS 906 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 907 //! 908 virtual MOS_STATUS UpdateDnHVSParameters( 909 uint32_t *pStatSlice0GNEPtr, 910 uint32_t *pStatSlice1GNEPtr); 911 912 //! 913 //! \brief Vebox state adjust boundary for statistics surface 914 //! \details Adjust boundary for statistics surface block 915 //! \return MOS_STATUS 916 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 917 //! 918 virtual MOS_STATUS AdjustBlockStatistics(); 919 920 virtual MOS_STATUS GNELumaConsistentCheck( 921 uint32_t &dwGNELuma, 922 uint32_t *pStatSlice0GNEPtr, 923 uint32_t *pStatSlice1GNEPtr); 924 925 MOS_STATUS InitVeboxSurfaceStateCmdParamsForTileConvert( 926 PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS mhwVeboxSurfaceStateCmdParams, 927 PMOS_SURFACE inputSurface, 928 PMOS_SURFACE outputSurface); 929 930 MOS_STATUS AddTileConvertStates( 931 MOS_COMMAND_BUFFER *CmdBuffer, 932 MHW_VEBOX_SURFACE_STATE_CMD_PARAMS &MhwVeboxSurfaceStateCmdParams); 933 934 MOS_FORMAT AdjustFormatForTileConvert(MOS_FORMAT format); 935 // TGNE 936 uint32_t dwGlobalNoiseLevel_Temporal = 0; //!< Global Temporal Noise Level for Y 937 uint32_t dwGlobalNoiseLevelU_Temporal = 0; //!< Global Temporal Noise Level for U 938 uint32_t dwGlobalNoiseLevelV_Temporal = 0; //!< Global Temporal Noise Level for V 939 uint32_t curNoiseLevel_Temporal = 0; //!< Temporal Noise Level for Y 940 uint32_t curNoiseLevelU_Temporal = 0; //!< Temporal Noise Level for U 941 uint32_t curNoiseLevelV_Temporal = 0; //!< Temporal Noise Level for V 942 bool m_bTgneEnable = true; 943 bool m_bTgneValid = false; 944 bool m_bFallback = false; 945 946 mhw::vebox::MHW_VEBOX_CHROMA_PARAMS veboxChromaParams = {}; 947 948 #if (_DEBUG || _RELEASE_INTERNAL) StallBatchBuffer(PMOS_COMMAND_BUFFER cmdBuffer)949 virtual MOS_STATUS StallBatchBuffer( 950 PMOS_COMMAND_BUFFER cmdBuffer) 951 { 952 return MOS_STATUS_SUCCESS; 953 } 954 #endif 955 956 protected: 957 958 //! 959 //! \brief Doing prepare stage tasks for SendVeboxCmd 960 //! Parameters might remain unchanged in case 961 //! \param [out] CmdBuffer 962 //! reference to Cmd buffer control struct 963 //! \param [out] GenericPrologParams 964 //! GpuStatusBuffer resource to be set 965 //! \param [out] iRemaining 966 //! integer showing initial cmd buffer usage 967 //! \return MOS_STATUS 968 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 969 //! 970 virtual MOS_STATUS PrepareVeboxCmd( 971 MOS_COMMAND_BUFFER* CmdBuffer, 972 RENDERHAL_GENERIC_PROLOG_PARAMS& GenericPrologParams, 973 int32_t& iRemaining); 974 975 //! 976 //! \brief Render the Vebox Cmd buffer for SendVeboxCmd 977 //! Parameters might remain unchanged in case 978 //! \param [in,out] CmdBuffer 979 //! reference to Cmd buffer control struct 980 //! \param [out] VeboxDiIecpCmdParams 981 //! DiIecpCmd params struct to be set 982 //! \param [out] VeboxSurfaceStateCmdParams 983 //! VPHAL surface state cmd to be set 984 //! \param [out] MhwVeboxSurfaceStateCmdParams 985 //! MHW surface state cmd to be set 986 //! \param [out] VeboxStateCmdParams 987 //! MHW vebox state cmd to be set 988 //! \param [out] FlushDwParams 989 //! MHW MI_FLUSH_DW cmd to be set 990 //! \param [in] pGenericPrologParams 991 //! pointer to Generic prolog params struct to send to cmd buffer header 992 //! \return MOS_STATUS 993 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 994 //! 995 virtual MOS_STATUS RenderVeboxCmd( 996 MOS_COMMAND_BUFFER *CmdBuffer, 997 VP_VEBOX_SURFACE_STATE_CMD_PARAMS &VeboxSurfaceStateCmdParams, 998 MHW_VEBOX_SURFACE_STATE_CMD_PARAMS &MhwVeboxSurfaceStateCmdParams, 999 MHW_MI_FLUSH_DW_PARAMS &FlushDwParams, 1000 PRENDERHAL_GENERIC_PROLOG_PARAMS pGenericPrologParams); 1001 1002 //! 1003 //! \brief handle Cmd buffer's offset when error occur 1004 //! \details handle Cmd buffer's offset when error occur 1005 //! \param [in,out] CmdBuffer 1006 //! reference to Cmd buffer control struct 1007 //! \return void 1008 void CmdErrorHanlde( 1009 MOS_COMMAND_BUFFER *CmdBuffer, 1010 int32_t &iRemaining); 1011 1012 //! 1013 //! \brief Send Vecs Status Tag 1014 //! \details Add MI Flush with write back into command buffer for GPU to write 1015 //! back GPU Tag. This should be the last command in 1st level batch. 1016 //! This ensures sync tag will be written after rendering is complete. 1017 //! \param [in] pOsInterface 1018 //! Pointer to OS Interface 1019 //! \param [out] pCmdBuffer 1020 //! Pointer to Command Buffer 1021 //! \return MOS_STATUS 1022 //! 1023 MOS_STATUS SendVecsStatusTag( 1024 PMOS_INTERFACE pOsInterface, 1025 PMOS_COMMAND_BUFFER pCmdBuffer); 1026 1027 virtual MOS_STATUS InitVeboxSurfaceStateCmdParams( 1028 PVP_VEBOX_SURFACE_STATE_CMD_PARAMS pVpHalVeboxSurfaceStateCmdParams, 1029 PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS pMhwVeboxSurfaceStateCmdParams); 1030 1031 virtual MOS_STATUS InitVeboxSurfaceParams( 1032 PVP_SURFACE pVpHalVeboxSurface, 1033 PMHW_VEBOX_SURFACE_PARAMS pMhwVeboxSurface); 1034 1035 //! 1036 //! \brief Copy Surface value 1037 //! \param [in] pTargetSurface 1038 //! Pointer to surface copy value to 1039 //! \param [in] pSourceSurface 1040 //! Pointer to surface copy value from 1041 //! \return void 1042 //! 1043 virtual void CopySurfaceValue( 1044 PVP_SURFACE pTargetSurface, 1045 PVP_SURFACE pSourceSurface); 1046 1047 //! 1048 //! \brief Add vebox DNDI state 1049 //! \details Add vebox DNDI state 1050 //! \return MOS_STATUS 1051 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 1052 //! 1053 virtual MOS_STATUS AddVeboxDndiState(); 1054 1055 //! 1056 //! \brief Add vebox IECP state 1057 //! \details Add vebox IECP state 1058 //! \return MOS_STATUS 1059 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 1060 //! 1061 virtual MOS_STATUS AddVeboxIECPState(); 1062 1063 //! 1064 //! \brief Add vebox Hdr state 1065 //! \details Add vebox Hdr state 1066 //! \return MOS_STATUS 1067 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 1068 //! 1069 virtual MOS_STATUS AddVeboxHdrState(); 1070 1071 virtual bool IsVeboxGamutStateNeeded(); 1072 1073 //! 1074 //! \brief Add vebox Gamut state 1075 //! \details Add vebox Gamut state 1076 //! \return MOS_STATUS 1077 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 1078 //! 1079 virtual MOS_STATUS AddVeboxGamutState(); 1080 1081 //! 1082 //! \brief Vebox set up vebox state heap 1083 //! \details Setup Vebox indirect states: DNDI and etc 1084 //! \return MOS_STATUS 1085 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 1086 //! 1087 virtual MOS_STATUS SetupIndirectStates(); 1088 1089 //! 1090 //! \brief Vebox get the back-end colorspace conversion matrix 1091 //! \details When the i/o is A8R8G8B8 or X8R8G8B8, the transfer matrix 1092 //! needs to be updated accordingly 1093 //! \param [in] inputColorSpace 1094 //! color space of vebox input surface 1095 //! \param [in] outputColorSpace 1096 //! color space of vebox output surface 1097 //! \param [in] inputFormat 1098 //! format of vebox input surface 1099 //! \return void 1100 //! 1101 virtual void VeboxGetBeCSCMatrix( 1102 VPHAL_CSPACE inputColorSpace, 1103 VPHAL_CSPACE outputColorSpace, 1104 MOS_FORMAT inputFormat); 1105 1106 virtual MOS_STATUS SetDiParams( 1107 bool bDiEnabled, 1108 bool bSCDEnabled, 1109 bool bHDContent, 1110 VPHAL_SAMPLE_TYPE sampleTypeInput, 1111 MHW_VEBOX_DNDI_PARAMS ¶m); 1112 1113 bool IsTopField(VPHAL_SAMPLE_TYPE sampleType); 1114 bool IsTopFieldFirst(VPHAL_SAMPLE_TYPE sampleType); 1115 1116 //! 1117 //! \brief Get surface by type 1118 //! \details Get surface by type 1119 //! \param [in] type 1120 //! surface type 1121 //! \return VP_SURFACE* 1122 //! Pointer to surface of specified type 1123 //! 1124 virtual VP_SURFACE* GetSurface(SurfaceType type); 1125 1126 virtual MOS_STATUS InitSurfMemCacheControl(VP_EXECUTE_CAPS packetCaps); 1127 1128 virtual MHW_CSPACE VpHalCspace2MhwCspace(VPHAL_CSPACE cspace); 1129 1130 virtual MOS_STATUS SetupDNTableForHVS( 1131 mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams); 1132 1133 virtual MOS_STATUS SetupHDRLuts( 1134 mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams); 1135 virtual MOS_STATUS Init3DLutTable(PVP_SURFACE surf3DLut); 1136 void UpdateCpPrepareResources(); 1137 virtual MOS_STATUS Add1DLutState(PVP_SURFACE &surface, PMHW_1DLUT_PARAMS p1DLutParams); 1138 virtual MOS_STATUS SetupVebox3DLutForHDR( 1139 mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams); SetupVeboxFP16State(mhw::vebox::VEBOX_STATE_PAR & veboxStateCmdParams)1140 virtual MOS_STATUS SetupVeboxFP16State(mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams) 1141 { 1142 return MOS_STATUS_SUCCESS; 1143 } 1144 1145 virtual MOS_STATUS SetupHDRUnifiedForHDR( 1146 mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams); 1147 1148 virtual MOS_STATUS SetupVeboxExternal3DLutforHDR( 1149 mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams); 1150 1151 private: 1152 1153 //! 1154 //! \brief IsFormatMMCSupported 1155 //! \details Check if the format of vebox output surface is supported by MMC 1156 //! \param [in] Format 1157 //! \return bool true if suported, otherwise not supported 1158 //! 1159 bool IsFormatMMCSupported( 1160 MOS_FORMAT Format); 1161 1162 //! 1163 //! \brief SetSfcMmcParams 1164 //! \details set sfc state mmc related params 1165 //! \return bool success if succeeded, otherwise failure 1166 //! 1167 virtual MOS_STATUS SetSfcMmcParams(); 1168 MOS_STATUS InitSfcRender(); 1169 1170 //! 1171 //! \brief Dump Vebox State Heap 1172 //! \details Dump Vebox State Heap 1173 //! \return MOS_STATUS MOS_STATUS_SUCCESS if succeeded, otherwise failure 1174 //! 1175 MOS_STATUS DumpVeboxStateHeap(); 1176 1177 MOS_STATUS SetVeboxSurfaceControlBits( 1178 MHW_VEBOX_SURFACE_CNTL_PARAMS *pVeboxSurfCntlParams, 1179 uint32_t *pSurfCtrlBits); 1180 1181 MOS_STATUS SetVeboxProCmd( 1182 MOS_COMMAND_BUFFER* CmdBuffer); 1183 1184 MOS_STATUS SetVeboxIndex( 1185 uint32_t dwVeboxIndex, 1186 uint32_t dwVeboxCount, 1187 uint32_t dwUsingSFC); 1188 1189 MOS_STATUS SetVeboxState( 1190 PMOS_COMMAND_BUFFER pCmdBufferInUse); 1191 1192 MOS_STATUS SetVeboxSurfaces( 1193 PMOS_COMMAND_BUFFER pCmdBufferInUse, 1194 PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS pMhwVeboxSurfaceStateCmdParams); 1195 1196 MOS_STATUS SetVeboxDiIecp( 1197 PMOS_COMMAND_BUFFER pCmdBufferInUse); 1198 1199 protected: 1200 1201 // Execution state 1202 VpVeboxRenderData *m_lastExecRenderData = nullptr; //!< Cache last render operation info 1203 1204 VPHAL_CSPACE m_CscOutputCspace = {}; //!< Cspace of Output Frame 1205 VPHAL_CSPACE m_CscInputCspace = {}; //!< Cspace of Input frame 1206 float m_fCscCoeff[9]; //!< [3x3] Coeff matrix for CSC 1207 float m_fCscInOffset[3]; //!< [3x1] Input Offset matrix for CSC 1208 float m_fCscOutOffset[3]; //!< [3x1] Output Offset matrix for CSC 1209 SfcRenderBase *m_sfcRender = nullptr; 1210 bool m_IsSfcUsed = false; 1211 1212 VEBOX_PACKET_SURFACE_PARAMS m_veboxPacketSurface = {}; 1213 1214 VP_SURFACE *m_currentSurface = nullptr; //!< Current frame 1215 VP_SURFACE *m_previousSurface = nullptr; //!< Previous frame 1216 VP_SURFACE *m_renderTarget = nullptr; //!< Render Target frame 1217 VP_SURFACE *m_originalOutput = nullptr; //!< Render Target frame 1218 1219 uint32_t m_dwGlobalNoiseLevelU = 0; //!< Global Noise Level for U 1220 uint32_t m_dwGlobalNoiseLevelV = 0; //!< Global Noise Level for V 1221 uint32_t m_dwGlobalNoiseLevel = 0; //!< Global Noise Level 1222 PVP_VEBOX_CACHE_CNTL m_surfMemCacheCtl = nullptr; //!< Surface memory cache control 1223 uint32_t m_DIOutputFrames = MEDIA_VEBOX_DI_OUTPUT_CURRENT; //!< default value is 2 for non-DI case. 1224 1225 // Statistics 1226 uint32_t m_dwVeboxPerBlockStatisticsWidth = 0; //!< Per block statistics width 1227 uint32_t m_dwVeboxPerBlockStatisticsHeight = 0; //!< Per block statistics height 1228 1229 // STE factor LUT 1230 static const uint32_t m_satP1Table[MHW_STE_FACTOR_MAX + 1]; 1231 static const uint32_t m_satS0Table[MHW_STE_FACTOR_MAX + 1]; 1232 static const uint32_t m_satS1Table[MHW_STE_FACTOR_MAX + 1]; 1233 1234 MediaScalability *m_scalability = nullptr; //!< scalability 1235 bool m_useKernelResource = false; //!< Use Vebox Kernel Resource 1236 uint32_t m_inputDepth = 0; 1237 std::shared_ptr<mhw::vebox::Itf> m_veboxItf = nullptr; 1238 MediaFeatureManager *m_featureManager = nullptr; 1239 std::shared_ptr<mhw::mi::Itf> m_miItf = nullptr; 1240 vp::VpUserFeatureControl *m_vpUserFeatureControl = nullptr; 1241 1242 MEDIA_CLASS_DEFINE_END(vp__VpVeboxCmdPacket) 1243 }; 1244 1245 } 1246 #endif // !__VP_VEBOX_CMD_PACKET_H__ 1247