blob: 749fd46cc5f4e5226102407ba9962e6bcc86e399 [file] [log] [blame]
/*
* Copyright (c) 2018-2021, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file vp_vebox_cmd_packet.h
//! \brief vebox packet which used in by mediapipline.
//! \details vebox packet provide the structures and generate the cmd buffer which mediapipline will used.
//!
#ifndef __VP_VEBOX_CMD_PACKET_H__
#define __VP_VEBOX_CMD_PACKET_H__
#include "mhw_vebox_g12_X.h"
#include "vp_cmd_packet.h"
#include "vp_vebox_common.h"
#include "vp_render_sfc_base.h"
#include "vp_filter.h"
#define VP_MAX_NUM_FFDI_SURFACES 4 //!< 2 for ADI plus additional 2 for parallel execution on HSW+
#define VP_NUM_FFDN_SURFACES 2 //!< Number of FFDN surfaces
#define VP_NUM_STMM_SURFACES 2 //!< Number of STMM statistics surfaces
#define VP_DNDI_BUFFERS_MAX 4 //!< Max DNDI buffers
#define VP_NUM_KERNEL_VEBOX 8 //!< Max kernels called at Adv stage
#define VP_VEBOX_RGB_ACE_HISTOGRAM_SIZE_RESERVED (3072 * 4)
#define VP_VEBOX_LACE_HISTOGRAM_256_BIN_PER_BLOCK (256 * 2)
#define VP_NUM_RGB_CHANNEL 3
#define VP_NUM_FRAME_PREVIOUS_CURRENT 2
#ifndef VEBOX_AUTO_DENOISE_SUPPORTED
#define VEBOX_AUTO_DENOISE_SUPPORTED 1
#endif
//!
//! \brief Denoise Range
//!
#define NOISEFACTOR_MAX 64 //!< Max Slider value
#define NOISEFACTOR_MID 32 //!< Mid Slider value, SKL+ only
#define NOISEFACTOR_MIN 0 //!< Min Slider value
#define VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE (256 * 4)
#define VP_VEBOX_ACE_HISTOGRAM_SIZE_PER_FRAME_PER_SLICE (256 * 4)
//No matter how many vebox running, the histogram slice number is always 4.
//When there is only one VEBOX, 0 is written to the other histogram slices by HW.
#define VP_VEBOX_HISTOGRAM_SLICES_COUNT 4
#define VP_VEBOX_RGB_HISTOGRAM_SIZE (VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE * \
VP_NUM_RGB_CHANNEL * \
VP_VEBOX_HISTOGRAM_SLICES_COUNT)
#define VP_VEBOX_RGB_ACE_HISTOGRAM_SIZE_RESERVED (3072 * 4)
//!
//! \brief Vebox Statistics Surface definition for TGL
//!
#define VP_VEBOX_STATISTICS_SIZE (32 * 8)
#define VP_VEBOX_STATISTICS_PER_FRAME_SIZE (32 * sizeof(uint32_t))
#define VP_VEBOX_STATISTICS_SURFACE_FMD_OFFSET 0
#define VP_VEBOX_STATISTICS_SURFACE_GNE_OFFSET 0x2C
#define VP_VEBOX_STATISTICS_SURFACE_STD_OFFSET 0x44
//!
//! \brief Temporal Denoise Definitions
//!
#define NOISE_HISTORY_DELTA_DEFAULT 8
#define NOISE_HISTORY_MAX_DEFAULT 192
#define NOISE_NUMMOTIONPIXELS_THRESHOLD_DEFAULT 0
#define NOISE_LOWTEMPORALPIXELDIFF_THRESHOLD_DEFAULT 6
#define NOISE_TEMPORALPIXELDIFF_THRESHOLD_DEFAULT 12
#define NOISE_SUMABSTEMPORALDIFF_THRESHOLD_DEFAULT 128
// Pixel Range Threshold Array Denoise Definitions for SKL+ 5x5 Bilateral Filter
#define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL 1
#define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL_MIN 65536
#define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL_MAX 393216
#define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI0 192
#define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI1 320
#define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI2 384
#define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI3 640
#define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI4 1024
#define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI5 1280
#define NOISE_BLF_RANGE_THRADPDYNR_MIN 512
#define NOISE_BLF_RANGE_THRADPDYNR_MAX 2048
#define NOISE_BLF_RANGE_THRDYNR_MIN 256
#define NOISE_BLF_RANGE_THRESHOLD_S0_MIN 32
#define NOISE_BLF_RANGE_THRESHOLD_S0_MID 192
#define NOISE_BLF_RANGE_THRESHOLD_S0_MAX 384
#define NOISE_BLF_RANGE_THRESHOLD_S1_MIN 64
#define NOISE_BLF_RANGE_THRESHOLD_S1_MID 256
#define NOISE_BLF_RANGE_THRESHOLD_S1_MAX 576
#define NOISE_BLF_RANGE_THRESHOLD_S2_MIN 128
#define NOISE_BLF_RANGE_THRESHOLD_S2_MID 512
#define NOISE_BLF_RANGE_THRESHOLD_S2_MAX 896
#define NOISE_BLF_RANGE_THRESHOLD_S3_MIN 128
#define NOISE_BLF_RANGE_THRESHOLD_S3_MID 640
#define NOISE_BLF_RANGE_THRESHOLD_S3_MAX 1280
#define NOISE_BLF_RANGE_THRESHOLD_S4_MIN 128
#define NOISE_BLF_RANGE_THRESHOLD_S4_MID 896
#define NOISE_BLF_RANGE_THRESHOLD_S4_MAX 1920
#define NOISE_BLF_RANGE_THRESHOLD_S5_MIN 128
#define NOISE_BLF_RANGE_THRESHOLD_S5_MID 1280
#define NOISE_BLF_RANGE_THRESHOLD_S5_MAX 2560
#define NOISE_BLF_RANGE_THRESHOLD_S0_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S0_MID
#define NOISE_BLF_RANGE_THRESHOLD_S1_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S1_MID
#define NOISE_BLF_RANGE_THRESHOLD_S2_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S2_MID
#define NOISE_BLF_RANGE_THRESHOLD_S3_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S3_MID
#define NOISE_BLF_RANGE_THRESHOLD_S4_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S4_MID
#define NOISE_BLF_RANGE_THRESHOLD_S5_DEFAULT NOISE_BLF_RANGE_THRESHOLD_S5_MID
#define NOISE_BLF_RANGE_THRESHOLD_S0_AUTO_DEFAULT 192
#define NOISE_BLF_RANGE_THRESHOLD_S1_AUTO_DEFAULT 320
#define NOISE_BLF_RANGE_THRESHOLD_S2_AUTO_DEFAULT 384
#define NOISE_BLF_RANGE_THRESHOLD_S3_AUTO_DEFAULT 640
#define NOISE_BLF_RANGE_THRESHOLD_S4_AUTO_DEFAULT 1024
#define NOISE_BLF_RANGE_THRESHOLD_S5_AUTO_DEFAULT 1280
// Pixel Range Weight Array Denoise Definitions for SKL+ 5x5 Bilateral Filter
#define NOISE_BLF_RANGE_WGTS0_MIN 16
#define NOISE_BLF_RANGE_WGTS0_MID 16
#define NOISE_BLF_RANGE_WGTS0_MAX 16
#define NOISE_BLF_RANGE_WGTS1_MIN 9
#define NOISE_BLF_RANGE_WGTS1_MID 14
#define NOISE_BLF_RANGE_WGTS1_MAX 15
#define NOISE_BLF_RANGE_WGTS2_MIN 2
#define NOISE_BLF_RANGE_WGTS2_MID 10
#define NOISE_BLF_RANGE_WGTS2_MAX 13
#define NOISE_BLF_RANGE_WGTS3_MIN 0
#define NOISE_BLF_RANGE_WGTS3_MID 5
#define NOISE_BLF_RANGE_WGTS3_MAX 10
#define NOISE_BLF_RANGE_WGTS4_MIN 0
#define NOISE_BLF_RANGE_WGTS4_MID 2
#define NOISE_BLF_RANGE_WGTS4_MAX 7
#define NOISE_BLF_RANGE_WGTS5_MIN 0
#define NOISE_BLF_RANGE_WGTS5_MID 1
#define NOISE_BLF_RANGE_WGTS5_MAX 4
#define NOISE_BLF_RANGE_WGTS0_DEFAULT NOISE_BLF_RANGE_WGTS0_MID
#define NOISE_BLF_RANGE_WGTS1_DEFAULT NOISE_BLF_RANGE_WGTS1_MID
#define NOISE_BLF_RANGE_WGTS2_DEFAULT NOISE_BLF_RANGE_WGTS2_MID
#define NOISE_BLF_RANGE_WGTS3_DEFAULT NOISE_BLF_RANGE_WGTS3_MID
#define NOISE_BLF_RANGE_WGTS4_DEFAULT NOISE_BLF_RANGE_WGTS4_MID
#define NOISE_BLF_RANGE_WGTS5_DEFAULT NOISE_BLF_RANGE_WGTS5_MID
// Distance Weight Matrix Denoise Definitions for SKL+ 5x5 Bilateral Filter
#define NOISE_BLF_DISTANCE_WGTS00_DEFAULT 12
#define NOISE_BLF_DISTANCE_WGTS01_DEFAULT 12
#define NOISE_BLF_DISTANCE_WGTS02_DEFAULT 10
#define NOISE_BLF_DISTANCE_WGTS10_DEFAULT 12
#define NOISE_BLF_DISTANCE_WGTS11_DEFAULT 11
#define NOISE_BLF_DISTANCE_WGTS12_DEFAULT 10
#define NOISE_BLF_DISTANCE_WGTS20_DEFAULT 10
#define NOISE_BLF_DISTANCE_WGTS21_DEFAULT 10
#define NOISE_BLF_DISTANCE_WGTS22_DEFAULT 8
//!
//! \brief Improved Deinterlacing for CNL+
//!
#define VPHAL_VEBOX_DI_CHROMA_TDM_WEIGHT_NATUAL 0
#define VPHAL_VEBOX_DI_LUMA_TDM_WEIGHT_NATUAL 4
#define VPHAL_VEBOX_DI_SHCM_DELTA_NATUAL 5
#define VPHAL_VEBOX_DI_SHCM_THRESHOLD_NATUAL 255
#define VPHAL_VEBOX_DI_SVCM_DELTA_NATUAL 5
#define VPHAL_VEBOX_DI_SVCM_THRESHOLD_NATUAL 255
#define VPHAL_VEBOX_DI_LUMA_TDM_CORING_THRESHOLD_NATUAL 0
#define VPHAL_VEBOX_DI_CHROMA_TDM_CORING_THRESHOLD_NATUAL 0
#define VPHAL_VEBOX_DI_DIRECTION_CHECK_THRESHOLD_NATUAL 3
#define VPHAL_VEBOX_DI_TEARING_LOW_THRESHOLD_NATUAL 20
#define VPHAL_VEBOX_DI_TEARING_HIGH_THRESHOLD_NATUAL 100
#define VPHAL_VEBOX_DI_DIFF_CHECK_SLACK_THRESHOLD_NATUAL 15
#define VPHAL_VEBOX_DI_SAD_WT0_NATUAL 0
#define VPHAL_VEBOX_DI_SAD_WT1_NATUAL 63
#define VPHAL_VEBOX_DI_SAD_WT2_NATUAL 76
#define VPHAL_VEBOX_DI_SAD_WT3_NATUAL 89
#define VPHAL_VEBOX_DI_SAD_WT4_NATUAL 114
#define VPHAL_VEBOX_DI_SAD_WT6_NATUAL 217
#define VPHAL_VEBOX_DI_LPFWTLUT0_SD_NATUAL 0
#define VPHAL_VEBOX_DI_LPFWTLUT0_HD_NATUAL 0
#define VPHAL_VEBOX_DI_LPFWTLUT1_SD_NATUAL 0
#define VPHAL_VEBOX_DI_LPFWTLUT1_HD_NATUAL 0
#define VPHAL_VEBOX_DI_LPFWTLUT2_SD_NATUAL 0
#define VPHAL_VEBOX_DI_LPFWTLUT2_HD_NATUAL 0
#define VPHAL_VEBOX_DI_LPFWTLUT3_SD_NATUAL 128
#define VPHAL_VEBOX_DI_LPFWTLUT3_HD_NATUAL 0
#define VPHAL_VEBOX_DI_LPFWTLUT4_SD_NATUAL 128
#define VPHAL_VEBOX_DI_LPFWTLUT4_HD_NATUAL 32
#define VPHAL_VEBOX_DI_LPFWTLUT5_SD_NATUAL 128
#define VPHAL_VEBOX_DI_LPFWTLUT5_HD_NATUAL 64
#define VPHAL_VEBOX_DI_LPFWTLUT6_SD_NATUAL 255
#define VPHAL_VEBOX_DI_LPFWTLUT6_HD_NATUAL 128
#define VPHAL_VEBOX_DI_LPFWTLUT7_SD_NATUAL 255
#define VPHAL_VEBOX_DI_LPFWTLUT7_HD_NATUAL 255
//!
//! \brief STE factor
//!
#define MHW_STE_FACTOR_MAX 9 // STE factor is 0 ~ 9
// \brief VEBOX 3DLUT HDR
#define LUT65_SEG_SIZE 65
#define LUT65_MUL_SIZE 128
#define LUT33_SEG_SIZE 33
#define LUT33_MUL_SIZE 64
#define VP_VEBOX_HDR_3DLUT65 LUT65_SEG_SIZE *\
LUT65_SEG_SIZE *\
LUT65_MUL_SIZE * sizeof(int64_t)
//!
//! \brief Chroma Denoise params
//!
typedef struct _VPHAL_DNUV_PARAMS
{
uint32_t dwHistoryInitUV;
uint32_t dwHistoryDeltaUV;
uint32_t dwHistoryMaxUV;
uint32_t dwSTADThresholdU;
uint32_t dwSTADThresholdV;
uint32_t dwLTDThresholdU;
uint32_t dwLTDThresholdV;
uint32_t dwTDThresholdU;
uint32_t dwTDThresholdV;
} VPHAL_DNUV_PARAMS, *PVPHAL_DNUV_PARAMS;
//!
//! \brief Structure to handle DNDI sampler states
//!
typedef struct _VP_SAMPLER_STATE_DN_PARAM
{
uint32_t dwDenoiseASDThreshold;
uint32_t dwDenoiseHistoryDelta;
uint32_t dwDenoiseMaximumHistory;
uint32_t dwDenoiseSTADThreshold;
uint32_t dwDenoiseSCMThreshold;
uint32_t dwDenoiseMPThreshold;
uint32_t dwLTDThreshold;
uint32_t dwTDThreshold;
uint32_t dwGoodNeighborThreshold;
} VP_SAMPLER_STATE_DN_PARAM, *PVP_SAMPLER_STATE_DN_PARAM;
namespace vp
{
typedef struct _VEBOX_PACKET_SURFACE_PARAMS
{
VP_SURFACE *pCurrInput;
VP_SURFACE *pPrevInput;
VP_SURFACE *pSTMMInput;
VP_SURFACE *pSTMMOutput;
VP_SURFACE *pDenoisedCurrOutput;
VP_SURFACE *pCurrOutput; //!< Current Vebox Output
VP_SURFACE *pPrevOutput;
VP_SURFACE *pStatisticsOutput;
VP_SURFACE *pAlphaOrVignette;
VP_SURFACE *pLaceOrAceOrRgbHistogram;
VP_SURFACE *pSurfSkinScoreOutput;
}VEBOX_PACKET_SURFACE_PARAMS, *PVEBOX_PACKET_SURFACE_PARAMS;
};
enum MEDIASTATE_DNDI_FIELDCOPY_SELECT
{
MEDIASTATE_DNDI_DEINTERLACE = 0,
MEDIASTATE_DNDI_FIELDCOPY_PREV = 1,
MEDIASTATE_DNDI_FIELDCOPY_NEXT = 2
};
//!
//! \brief VPHAL Query Type for Vebox Statistics Surface
//!
typedef enum _VEBOX_STAT_QUERY_TYPE
{
VEBOX_STAT_QUERY_FMD_OFFEST = 0,
VEBOX_STAT_QUERY_WB_OFFEST,
VEBOX_STAT_QUERY_GNE_OFFEST,
VEBOX_STAT_QUERY_STD_OFFEST,
VEBOX_STAT_QUERY_GCC_OFFEST,
VEBOX_STAT_QUERY_PER_FRAME_SIZE
} VEBOX_STAT_QUERY_TYPE;
//!
//! \brief Feature specific cache control settings
//!
typedef struct _VP_VEBOX_CACHE_CNTL
{
// Input
bool bDnDi;
bool bLace;
// Output
VPHAL_DNDI_CACHE_CNTL DnDi;
VPHAL_LACE_CACHE_CNTL Lace;
} VP_VEBOX_CACHE_CNTL, *PVP_VEBOX_CACHE_CNTL;
namespace vp {
class VpVeboxCmdPacket : public VpCmdPacket
{
public:
VpVeboxCmdPacket(MediaTask * task, PVP_MHWINTERFACE hwInterface, PVpAllocator &allocator, VPMediaMemComp *mmc);
virtual ~VpVeboxCmdPacket();
virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket) override;
virtual MOS_STATUS Init() override;
virtual MOS_STATUS Destory() { return MOS_STATUS_SUCCESS; };
virtual MOS_STATUS Prepare() override;
virtual MOS_STATUS PrepareState() override;
virtual MOS_STATUS AllocateExecRenderData()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
if (!m_lastExecRenderData)
{
m_lastExecRenderData = MOS_New(VpVeboxRenderData);
if (!m_lastExecRenderData)
{
return MOS_STATUS_NO_SPACE;
}
eStatus = m_lastExecRenderData->Init();
if (eStatus != MOS_STATUS_SUCCESS)
{
MOS_Delete(m_lastExecRenderData);
}
}
return eStatus;
}
virtual VpVeboxRenderData *GetLastExecRenderData()
{
if (!m_lastExecRenderData)
{
AllocateExecRenderData();
}
return m_lastExecRenderData;
}
virtual bool IsIECPEnabled()
{
if (GetLastExecRenderData() != NULL)
{
return GetLastExecRenderData()->IECP.IsIecpEnabled();
}
return false;
}
//!
//! \brief Setup surface states for Vebox
//! \details Setup surface states for use in the current Vebox Operation
//! \param [in] bDiVarianceEnable
//! Is DI/Variances report enabled
//! \param [in,out] pVeboxSurfaceStateCmdParams
//! Pointer to VEBOX_SURFACE_STATE command parameters
//! \return void
//!
virtual void SetupSurfaceStates(
PVPHAL_VEBOX_SURFACE_STATE_CMD_PARAMS pVeboxSurfaceStateCmdParams);
//!
//! \brief Setup surface states for Vebox
//! \details Setup surface states for use in the current Vebox Operation
//! \param [in] pRenderHal
//! Pointer to Render Hal
//! \param [in] CmdBuffer
//! Pointer to command buffer
//! \param [in] pGenericPrologParams
//! pointer to Generic prolog params struct to send to cmd buffer header
//! \return void
//!
virtual MOS_STATUS InitCmdBufferWithVeParams(
PRENDERHAL_INTERFACE pRenderHal,
MOS_COMMAND_BUFFER &CmdBuffer,
PRENDERHAL_GENERIC_PROLOG_PARAMS pGenericPrologParams);
//!
//! \brief Setup Scaling Params for Vebox/SFC
//! \details Setup surface Scaling Params for Vebox/SFC
//! \param [in] scalingParams
//! Scaling Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetScalingParams(PSFC_SCALING_PARAMS scalingParams);
//!
//! \brief Setup CSC Params for Vebox/SFC
//! \details Setup surface CSC Params for Vebox/SFC
//! \param [in] cscParams
//! CSC/IEF Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetSfcCSCParams(PSFC_CSC_PARAMS cscParams);
//!
//! \brief Setup CSC Params for Vebox back end
//! \details Setup surface CSC Params for Vebox
//! \param [in] cscParams
//! CSC Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetVeboxBeCSCParams(PVEBOX_CSC_PARAMS cscParams);
//!
//! \brief Setup Vebox Output Alpha Value
//! \details Setup Vebox Output Alpha Value
//! \param [in] cscParams
//! CSC Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetVeboxOutputAlphaParams(PVEBOX_CSC_PARAMS cscParams);
//!
//! \brief Setup Vebox Chroma sub sampling
//! \details Setup Vebox Chroma sub sampling
//! \param [in] cscParams
//! CSC Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetVeboxChromasitingParams(PVEBOX_CSC_PARAMS cscParams);
//!
//! \brief Setup Roattion/Mirror Params for Vebox/SFC
//! \details Setup surface Roattion/Mirror Params for Vebox/SFC
//! \param [in] rotMirParams
//! Rotation/Mirror Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetSfcRotMirParams(PSFC_ROT_MIR_PARAMS rotMirParams);
//!
//! \brief Setup DN Params for Vebox
//! \details Setup surface DN Params for Vebox
//! \param [in] dnParams
//! DN Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetDnParams(PVEBOX_DN_PARAMS dnParams);
//!
//! \brief Setup STE Params for Vebox
//! \details Setup surface STE Params for Vebox
//! \param [in] steParams
//! STE Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetSteParams(PVEBOX_STE_PARAMS steParams);
//!
//! \brief Setup HDR Params for Vebox
//! \details Setup surface HDR Params for Vebox
//! \param [in] HDRParams
//! HDR Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetHdrParams(PVEBOX_HDR_PARAMS hdrParams)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Setup TCC Params for Vebox
//! \details Setup surface TCC Params for Vebox
//! \param [in] tccParams
//! TCC Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetTccParams(PVEBOX_TCC_PARAMS tccParams);
//!
//! \brief Setup Procamp Params for Vebox
//! \details Setup surface Procamp Params for Vebox
//! \param [in] procampParams
//! Procamp Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetProcampParams(PVEBOX_PROCAMP_PARAMS procampParams);
//!
//! \brief Setup DI Params for Vebox
//! \details Setup surface DN Params for Vebox
//! \param [in] diParams
//! DI Params
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetDiParams(PVEBOX_DI_PARAMS diParams);
//!
//! \brief Get DN luma parameters
//! \details Get DN luma parameters
//! \param [in] bDnEnabled
//! true if DN being enabled
//! \param [in] bAutoDetect
//! true if auto DN being enabled
//! \param [in] fDnFactor
//! DN factor
//! \param [in] bRefValid
//! true if reference surface available
//! \param [out] pLumaParams
//! DN luma parameters
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS GetDnLumaParams(
bool bDnEnabled,
bool bAutoDetect,
float fDnFactor,
bool bRefValid,
PVP_SAMPLER_STATE_DN_PARAM pLumaParams) { return MOS_STATUS_SUCCESS; }
//!
//! \brief Get DN chroma parameters
//! \details Get DN chroma parameters
//! \param [in] bChromaDenoise
//! true if chroma DN being enabled
//! \param [in] bAutoDetect
//! true if auto DN being enabled
//! \param [in] fDnFactor
//! DN factor
//! \param [out] pChromaParams
//! DN chroma parameters
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS GetDnChromaParams(
bool bChromaDenoise,
bool bAutoDetect,
float fDnFactor,
PVPHAL_DNUV_PARAMS pChromaParams) { return MOS_STATUS_SUCCESS; }
//!
//! \brief Config DN luma pix range
//! \details Config DN luma pix range threshold and weight
//! \param [in] bDnEnabled
//! true if DN being enabled
//! \param [in] bAutoDetect
//! true if auto DN being enabled
//! \param [in] fDnFactor
//! DN factor
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS ConfigLumaPixRange(
bool bDnEnabled,
bool bAutoDetect,
float fDnFactor) { return MOS_STATUS_SUCCESS; }
//!
//! \brief Config DN chroma pix range
//! \details Config DN chroma pix range threshold and weight
//! \param [in] bChromaDenoise
//! true if chroma DN being enabled
//! \param [in] bAutoDetect
//! true if auto DN being enabled
//! \param [in] fDnFactor
//! DN factor
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS ConfigChromaPixRange(
bool bChromaDenoise,
bool bAutoDetect,
float fDnFactor) { return MOS_STATUS_SUCCESS; }
virtual MOS_STATUS InitSTMMHistory();
//!
//! \brief Vebox Populate VEBOX parameters
//! \details Populate the Vebox VEBOX state parameters to VEBOX RenderData
//! \param [in] bDnEnabled
//! true if DN being enabled
//! \param [in] bChromaDenoise
//! true if chroma DN being enabled
//! \param [in] pLumaParams
//! Pointer to Luma DN and DI parameter
//! \param [in] pChromaParams
//! Pointer to Chroma DN parameter
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS ConfigDnLumaChromaParams(
bool bDnEnabled,
bool bChromaDenoise,
PVP_SAMPLER_STATE_DN_PARAM pLumaParams,
PVPHAL_DNUV_PARAMS pChromaParams
);
//!
//! \brief Calculate offsets of statistics surface address based on the
//! functions which were enabled in the previous call,
//! and store the width and height of the per-block statistics into DNDI_STATE
//! \details
//! Layout of Statistics surface when Temporal DI enabled
//! --------------------------------------------------------------\n
//! | 16 bytes for x=0, Y=0 | 16 bytes for x=16, Y=0 | ...\n
//! |-------------------------------------------------------------\n
//! | 16 bytes for x=0, Y=4 | ...\n
//! |------------------------------\n
//! | ...\n
//! |------------------------------\n
//! | 16 bytes for x=0, Y=height-4| ...\n
//! |-----------------------------------------------Pitch----------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 0 (Previous)| 17 DW Reserved | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
//! |--------------------------------------------------------------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 0 (Current) | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
//! |--------------------------------------------------------------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 1 (Previous)| 17 DW Reserved | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
//! |--------------------------------------------------------------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 1 (Current) | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
//! ---------------------------------------------------------------------------------------------------------------\n
//!
//! Layout of Statistics surface when DN or Spatial DI enabled (and Temporal DI disabled)
//! --------------------------------------------------------------\n
//! | 16 bytes for x=0, Y=0 | 16 bytes for x=16, Y=0 | ...\n
//! |-------------------------------------------------------------\n
//! | 16 bytes for x=0, Y=4 | ...\n
//! |------------------------------\n
//! | ...\n
//! |------------------------------\n
//! | 16 bytes for x=0, Y=height-4| ...\n
//! |-----------------------------------------------Pitch----------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 0 (Input) | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
//! |--------------------------------------------------------------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 1 (Input) | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
//! ---------------------------------------------------------------------------------------------------------------\n
//!
//! Layout of Statistics surface when both DN and DI are disabled
//! ------------------------------------------------Pitch----------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 0 (Input) | 17 DW Reserved | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
//! |--------------------------------------------------------------------------------------------------------------\n
//! | 256 DW of ACE histogram Slice 1 (Input) | 17 DW Reserved | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
//! ---------------------------------------------------------------------------------------------------------------\n
//! \param [out] pStatSlice0Offset
//! Statistics surface Slice 0 base pointer
//! \param [out] pStatSlice1Offset
//! Statistics surface Slice 1 base pointer
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS GetStatisticsSurfaceOffsets(
int32_t* pStatSlice0Offset,
int32_t* pStatSlice1Offset);
//!
//! \brief Configure FMD parameter
//! \details Configure FMD parameters for DNDI State
//! \param [in] bProgressive
//! true if sample being progressive
//! \param [in] bAutoDenoise
//! true if auto denoise being enabled
//! \param [out] pLumaParams
//! Pointer to DNDI Param for set FMD parameters
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS ConfigFMDParams(bool bProgressive, bool bAutoDenoise);
//!
//! \brief Setup Vebox_State Command parameter
//! \param [in,out] pVeboxStateCmdParams
//! Pointer to VEBOX_STATE command parameters
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetupVeboxState(
PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
//!
//! \brief Setup Vebox_DI_IECP Command params
//! \details Setup Vebox_DI_IECP Command params
//! \param [in] bDiScdEnable
//! Is DI/Variances report enabled
//! \param [in,out] pVeboxDiIecpCmdParams
//! Pointer to VEBOX_DI_IECP command parameters
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetupDiIecpState(
bool bDiScdEnable,
PMHW_VEBOX_DI_IECP_CMD_PARAMS pVeboxDiIecpCmdParams);
virtual bool UseKernelResource();
//!
//! \brief Vebox send Vebox ring HW commands
//! \details Send Vebox ring Commands.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SendVeboxCmd(MOS_COMMAND_BUFFER* commandBuffer);
//!
//! \brief enable or disable SFC output path.
//! \details enable or disable SFC output path
//! \return void
//!
virtual void SetSfcOutputPath(bool bSfcUsed) { m_IsSfcUsed = bSfcUsed; };
virtual SfcRenderBase* GetSfcRenderInstance() { return m_sfcRender; };
virtual MOS_STATUS PacketInit(
VP_SURFACE *inputSurface,
VP_SURFACE *outputSurface,
VP_SURFACE *previousSurface,
VP_SURFACE_SETTING &surfSetting,
VP_EXECUTE_CAPS packetCaps) override;
//!
//! \brief Check whether the Vebox command parameters are correct
//! \param [in] VeboxStateCmdParams
//! MHW vebox state cmd params
//! \param [in] VeboxDiIecpCmdParams
//! DiIecpCmd params struct
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS IsCmdParamsValid(
const MHW_VEBOX_STATE_CMD_PARAMS &VeboxStateCmdParams,
const MHW_VEBOX_DI_IECP_CMD_PARAMS &VeboxDiIecpCmdParams,
const VPHAL_VEBOX_SURFACE_STATE_CMD_PARAMS &VeboxSurfaceStateCmdParams);
virtual MOS_STATUS QueryStatLayout(
VEBOX_STAT_QUERY_TYPE QueryType,
uint32_t* pQuery) {return MOS_STATUS_SUCCESS;};
//!
//! \brief Determine if the Batch Buffer End is needed to add in the end
//! \details Detect platform OS and return the flag whether the Batch Buffer End is needed to add in the end
//! \param [in] pOsInterface
//! Pointer to MOS_INTERFACE
//! \return bool
//! The flag of adding Batch Buffer End
//!
virtual bool RndrCommonIsMiBBEndNeeded(
PMOS_INTERFACE pOsInterface);
//!
//! \brief Vebox perftag
//! \details set vebox perftag
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS VeboxSetPerfTag();
//!
//! \brief Vebox perftag for NV12 source
//! \details set vebox perftag for NV12 source
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS VeboxSetPerfTagNv12();
//!
//! \brief Vebox perftag for Pa format source
//! \details set vebox perftag for Pa format source
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS VeboxSetPerfTagPaFormat();
//!
//! \brief Vebox state heap update for auto mode features
//! \details Update Vebox indirect states for auto mode features
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS UpdateVeboxStates();
protected:
//!
//! \brief Doing prepare stage tasks for SendVeboxCmd
//! Parameters might remain unchanged in case
//! \param [out] CmdBuffer
//! reference to Cmd buffer control struct
//! \param [out] GenericPrologParams
//! GpuStatusBuffer resource to be set
//! \param [out] iRemaining
//! integer showing initial cmd buffer usage
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS PrepareVeboxCmd(
MOS_COMMAND_BUFFER* CmdBuffer,
RENDERHAL_GENERIC_PROLOG_PARAMS& GenericPrologParams,
int32_t& iRemaining);
//!
//! \brief Render the Vebox Cmd buffer for SendVeboxCmd
//! Parameters might remain unchanged in case
//! \param [in,out] CmdBuffer
//! reference to Cmd buffer control struct
//! \param [out] VeboxDiIecpCmdParams
//! DiIecpCmd params struct to be set
//! \param [out] VeboxSurfaceStateCmdParams
//! VPHAL surface state cmd to be set
//! \param [out] MhwVeboxSurfaceStateCmdParams
//! MHW surface state cmd to be set
//! \param [out] VeboxStateCmdParams
//! MHW vebox state cmd to be set
//! \param [out] FlushDwParams
//! MHW MI_FLUSH_DW cmd to be set
//! \param [in] pGenericPrologParams
//! pointer to Generic prolog params struct to send to cmd buffer header
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS RenderVeboxCmd(
MOS_COMMAND_BUFFER *CmdBuffer,
MHW_VEBOX_DI_IECP_CMD_PARAMS &VeboxDiIecpCmdParams,
VPHAL_VEBOX_SURFACE_STATE_CMD_PARAMS &VeboxSurfaceStateCmdParams,
MHW_VEBOX_SURFACE_STATE_CMD_PARAMS &MhwVeboxSurfaceStateCmdParams,
MHW_VEBOX_STATE_CMD_PARAMS &VeboxStateCmdParams,
MHW_MI_FLUSH_DW_PARAMS &FlushDwParams,
PRENDERHAL_GENERIC_PROLOG_PARAMS pGenericPrologParams);
//!
//! \brief handle Cmd buffer's offset when error occur
//! \details handle Cmd buffer's offset when error occur
//! \param [in,out] CmdBuffer
//! reference to Cmd buffer control struct
//! \return void
void CmdErrorHanlde(
MOS_COMMAND_BUFFER *CmdBuffer,
int32_t &iRemaining);
//!
//! \brief Send Vecs Status Tag
//! \details Add MI Flush with write back into command buffer for GPU to write
//! back GPU Tag. This should be the last command in 1st level batch.
//! This ensures sync tag will be written after rendering is complete.
//! \param [in] pMhwMiInterface
//! MHW MI interface
//! \param [in] pOsInterface
//! Pointer to OS Interface
//! \param [out] pCmdBuffer
//! Pointer to Command Buffer
//! \return MOS_STATUS
//!
virtual MOS_STATUS SendVecsStatusTag(
PMHW_MI_INTERFACE pMhwMiInterface,
PMOS_INTERFACE pOsInterface,
PMOS_COMMAND_BUFFER pCmdBuffer);
virtual MOS_STATUS InitVeboxSurfaceStateCmdParams(
PVPHAL_VEBOX_SURFACE_STATE_CMD_PARAMS pVpHalVeboxSurfaceStateCmdParams,
PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS pMhwVeboxSurfaceStateCmdParams);
virtual MOS_STATUS InitVeboxSurfaceParams(
PVP_SURFACE pVpHalVeboxSurface,
PMHW_VEBOX_SURFACE_PARAMS pMhwVeboxSurface);
//!
//! \brief Copy Surface value
//! \param [in] pTargetSurface
//! Pointer to surface copy value to
//! \param [in] pSourceSurface
//! Pointer to surface copy value from
//! \return void
//!
virtual void CopySurfaceValue(
PVP_SURFACE pTargetSurface,
PVP_SURFACE pSourceSurface);
//!
//! \brief Add vebox DNDI state
//! \details Add vebox DNDI state
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS AddVeboxDndiState();
//!
//! \brief Add vebox IECP state
//! \details Add vebox IECP state
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS AddVeboxIECPState();
//!
//! \brief Add vebox Gamut state
//! \details Add vebox Gamut state
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS AddVeboxGamutState(){return MOS_STATUS_SUCCESS;}
//!
//! \brief Vebox set up vebox state heap
//! \details Setup Vebox indirect states: DNDI and etc
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetupIndirectStates();
//!
//! \brief Vebox get the back-end colorspace conversion matrix
//! \details When the i/o is A8R8G8B8 or X8R8G8B8, the transfer matrix
//! needs to be updated accordingly
//! \param [in] inputColorSpace
//! color space of vebox input surface
//! \param [in] outputColorSpace
//! color space of vebox output surface
//! \param [in] inputFormat
//! format of vebox input surface
//! \return void
//!
virtual void VeboxGetBeCSCMatrix(
VPHAL_CSPACE inputColorSpace,
VPHAL_CSPACE outputColorSpace,
MOS_FORMAT inputFormat);
virtual MOS_STATUS SetDiParams(
bool bDiEnabled,
bool bSCDEnabled,
bool bHDContent,
VPHAL_SAMPLE_TYPE sampleTypeInput,
MHW_VEBOX_DNDI_PARAMS &param);
//!
//! \brief Get surface by type
//! \details Get surface by type
//! \param [in] type
//! surface type
//! \return VP_SURFACE*
//! Pointer to surface of specified type
//!
virtual VP_SURFACE* GetSurface(SurfaceType type);
virtual MOS_STATUS InitSurfMemCacheControl(VP_EXECUTE_CAPS packetCaps);
virtual MHW_CSPACE VpHalCspace2MhwCspace(VPHAL_CSPACE cspace);
private:
//!
//! \brief IsFormatMMCSupported
//! \details Check if the format of vebox output surface is supported by MMC
//! \param [in] Format
//! \return bool true if suported, otherwise not supported
//!
bool IsFormatMMCSupported(
MOS_FORMAT Format);
//!
//! \brief SetSfcMmcParams
//! \details set sfc state mmc related params
//! \return bool success if succeeded, otherwise failure
//!
virtual MOS_STATUS SetSfcMmcParams();
MOS_STATUS InitSfcRender();
protected:
// Execution state
VpVeboxRenderData *m_lastExecRenderData = nullptr; //!< Cache last render operation info
VPHAL_CSPACE m_CscOutputCspace = {}; //!< Cspace of Output Frame
VPHAL_CSPACE m_CscInputCspace = {}; //!< Cspace of Input frame
float m_fCscCoeff[9]; //!< [3x3] Coeff matrix for CSC
float m_fCscInOffset[3]; //!< [3x1] Input Offset matrix for CSC
float m_fCscOutOffset[3]; //!< [3x1] Output Offset matrix for CSC
SfcRenderBase *m_sfcRender = nullptr;
bool m_IsSfcUsed = false;
VEBOX_PACKET_SURFACE_PARAMS m_veboxPacketSurface = {};
VP_SURFACE *m_currentSurface = nullptr; //!< Current frame
VP_SURFACE *m_previousSurface = nullptr; //!< Previous frame
VP_SURFACE *m_renderTarget = nullptr; //!< Render Target frame
uint32_t m_dwGlobalNoiseLevelU = 0; //!< Global Noise Level for U
uint32_t m_dwGlobalNoiseLevelV = 0; //!< Global Noise Level for V
uint32_t m_dwGlobalNoiseLevel = 0; //!< Global Noise Level
PVP_VEBOX_CACHE_CNTL m_surfMemCacheCtl = nullptr; //!< Surface memory cache control
uint32_t m_DNDIFirstFrame = 0;
uint32_t m_DIOutputFrames = MEDIA_VEBOX_DI_OUTPUT_CURRENT; //!< default value is 2 for non-DI case.
// Statistics
uint32_t m_dwVeboxPerBlockStatisticsWidth = 0; //!< Per block statistics width
uint32_t m_dwVeboxPerBlockStatisticsHeight = 0; //!< Per block statistics height
// STE factor LUT
static const uint32_t m_satP1Table[MHW_STE_FACTOR_MAX + 1];
static const uint32_t m_satS0Table[MHW_STE_FACTOR_MAX + 1];
static const uint32_t m_satS1Table[MHW_STE_FACTOR_MAX + 1];
MediaScalability *m_scalability = nullptr; //!< scalability
};
}
#endif // !__VP_VEBOX_CMD_PACKET_H__