blob: ac5247652f386bd5d49a5b72f80aad3ec75d2296 [file] [log] [blame]
/* Copyright (c) 2018-2020, 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_render_sfc_base.h
//! \brief The header file of the base class of SFC rendering component
//! \details The SFC renderer supports Scaling, IEF, CSC/ColorFill and Rotation.
//! It's responsible for setting up HW states and generating the SFC
//! commands.
//!
#ifndef __VP_RENDER_SFC_BASE_H__
#define __VP_RENDER_SFC_BASE_H__
#include "vp_sfc_common.h"
#include "vp_vebox_common.h"
#include "mhw_sfc_g12_X.h"
#include "vp_allocator.h"
#include "codec_def_decode_jpeg.h"
namespace vp {
class VpIef;
class SfcRenderBase
{
public:
SfcRenderBase(VP_MHWINTERFACE &vpMhwinterface, PVpAllocator &allocator);
virtual ~SfcRenderBase();
//!
//! \brief Initialize the object
//! \return MOS_STATUS
//!
virtual MOS_STATUS Init();
virtual MOS_STATUS Init(VIDEO_PARAMS &videoParams);
//!
//! \brief Setup CSC parameters of the SFC State
//! \param [in,out] pSfcStateParams
//! Pointer to SFC_STATE params
//! \param [out] pIEFStateParams
//! Pointer to MHW IEF state params
//! \return void
//!
virtual MOS_STATUS SetIefStateCscParams(
PMHW_SFC_STATE_PARAMS pSfcStateParams,
PMHW_SFC_IEF_STATE_PARAMS pIEFStateParams);
//!
//! \brief Setup parameters related to SFC_IEF State
//! \details Setup the IEF and CSC params of the SFC_IEF State
//! \param [in,out] sfcStateParams
//! Pointer to SFC_STATE params
//! \param [in] inputSurface
//! Pointer to Input Surface
//! \return void
//!
virtual MOS_STATUS SetIefStateParams(
PMHW_SFC_STATE_PARAMS sfcStateParams);
//!
//! \brief Setup parameters related to SFC_AVS State
//! \details Setup the 8x8 table of SFC sampler
//! \return MOS_STATUS
//!
virtual MOS_STATUS SetAvsStateParams();
//!
//! \brief Send SFC pipe commands
//! \details Register the surfaces and send the commands needed by SFC pipe
//! \param [in] pRenderData
//! Pointer to Vebox Render data
//! \param [in,out] pCmdBuffer
//! Pointer to command buffer
//! \return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SendSfcCmd(
bool bOutputToMemory,
PMOS_COMMAND_BUFFER pCmdBuffer);
//!
//! \brief Setup SFC states and parameters
//! \details Setup SFC states and parameters including SFC State, AVS
//! and IEF parameters
//! \param [in] targetSurface
//! Pointer to Output Surface
//! \return Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetupSfcState(PVP_SURFACE targetSurface);
//!
//! \brief Set scaling parameters
//! \details Set scaling parameters
//! \param [in] scalingParams
//! Scaling parameters
//! \return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetScalingParams(PSFC_SCALING_PARAMS scalingParams);
//!
//! \brief Set csc parameters
//! \details Set csc parameters
//! \param [in] cscParams
//! Csc parameters
//! \return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetCSCParams(PSFC_CSC_PARAMS cscParams);
//!
//! \brief Set rotation and mirror parameters
//! \details Set rotation and mirror parameters
//! \param [in] rotMirParams
//! rotation and mirror parameters
//! \return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetRotMirParams(PSFC_ROT_MIR_PARAMS rotMirParams);
//!
//! \brief Set mmc parameters
//! \details Set mmc parameters
//! \param [in] renderTarget
//! render target surface
//! \param [in] isFormalMmcSupported
//! Is format supported by mmc
//! \param [in] isMmcEnabled
//! Is mmc enabled
//! \return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SetMmcParams(PMOS_SURFACE renderTarget, bool isFormatMmcSupported, bool isMmcEnabled);
//!
//! \brief Check whether VDBOX-SFC Format Supported
//! \details Check whether VDBOX-SFC Format Supported.
//! \param codecStandard
//! [in] Codec Standard.
//! \param inputFormat
//! [in] Format of Input Frame
//! \param outputFormat
//! [in] Format of Output Frame
//! \return bool
//! Return true if supported, otherwise failed
//!
virtual bool IsVdboxSfcFormatSupported(
CODECHAL_STANDARD codecStandard,
MOS_FORMAT inputFormat,
MOS_FORMAT outputFormat);
bool IsCSC() { return m_renderData.bCSC; }
bool IsScaling() { return m_renderData.bScaling; }
//!
//! \brief Get Sfc's input format
//! \return MOS_FORMAT
//!
MOS_FORMAT GetInputFormat()
{
return m_renderData.SfcInputFormat;
}
MOS_STATUS SetIefObj(VpIef *iefObj)
{
VP_PUBLIC_CHK_NULL_RETURN(iefObj);
m_iefObj = iefObj;
return MOS_STATUS_SUCCESS;
}
PVPHAL_IEF_PARAMS GetIefParams()
{
return m_renderData.pIefParams;
}
MOS_STATUS SetHistogramBuf(PMOS_BUFFER histogramBuf);
//!
//! \brief Set sfc pipe selected with vebox
//! \details Set sfc pipe selected with vebox
//! \param [in] dwSfcPipe
//! Sfc pipe selected with vebox
//! \param [in] dwSfcNum
//! Sfc pipe num in total
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
virtual MOS_STATUS SetSfcPipe(uint32_t dwSfcPipe, uint32_t dwSfcNum)
{
MOS_STATUS eStatus = MOS_STATUS_UNKNOWN;
MOS_UNUSED(dwSfcPipe);
MOS_UNUSED(dwSfcNum);
return eStatus;
}
protected:
//!
//! \brief Initialize SfcState parameters
//! \return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS InitSfcStateParams() = 0;
//!
//! \brief Set SFC input chroma subsampling
//! \details Set SFC input chroma subsampling according to
//! pipe mode
//! \param [out] sfcStateParams
//! Pointer to SFC state params
//! \return MOS_STATUS
//!
virtual MOS_STATUS SetSfcStateInputChromaSubSampling(
PMHW_SFC_STATE_PARAMS sfcStateParams);
//!
//! \brief Set SFC input ordering mode
//! \details SFC input ordering mode according to
//! pipe mode
//! \param [out] sfcStateParams
//! Pointer to SFC state params
//! \return MOS_STATUS
//!
virtual MOS_STATUS SetSfcStateInputOrderingMode(
PMHW_SFC_STATE_PARAMS sfcStateParams);
virtual MOS_STATUS SetSfcStateInputOrderingModeJpeg(
PMHW_SFC_STATE_PARAMS sfcStateParams);
virtual MOS_STATUS SetSfcStateInputOrderingModeVdbox(
PMHW_SFC_STATE_PARAMS sfcStateParams);
virtual MOS_STATUS SetSfcStateInputOrderingModeHcp(
PMHW_SFC_STATE_PARAMS sfcStateParams) = 0;
//!
//! \brief Set codec pipe mode
//! \details Set codec pipe mode
//! \param [in] codecStandard
//! codec standard
//! \return MOS_STATUS
virtual MOS_STATUS SetCodecPipeMode(CODECHAL_STANDARD codecStandard);
//!
//! \brief Setup ColorFill parameters
//! \details Setup ColorFill parameters
//! \param [in] sfcStateParams
//! Pointer to SFC_STATE params
//! \return void
void SetColorFillParams(
PMHW_SFC_STATE_PARAMS pSfcStateParams);
//!
//! \brief Setup Rotation and Mirrow params
//! \details Setup Rotation and Mirrow params
//! \param [in,out] sfcStateParams
//! Pointer to SFC_STATE params
//! \return void
//!
void SetRotationAndMirrowParams(
PMHW_SFC_STATE_PARAMS pSfcStateParams);
//!
//! \brief Setup Chromasting params
//! \details Setup Chromasting params
//! \param [in,out] sfcStateParams
//! Pointer to SFC_STATE params
//! \return void
//!
void SetChromasitingParams(
PMHW_SFC_STATE_PARAMS pSfcStateParams);
//!
//! \brief Setup Bypass X & Y AdaptiveFilter params
//! \details Setup Bypass X & Y AdaptiveFilter params
//! \param [in,out] sfcStateParams
//! Pointer to SFC_STATE params
//! \return void
//!
void SetXYAdaptiveFilter(
PMHW_SFC_STATE_PARAMS pSfcStateParams);
//!
//! \brief Setup RGB Adaptive params
//! \details Setup RGB Adaptive params
//! \param [in,out] sfcStateParams
//! Pointer to SFC_STATE params
//! \return void
//!
void SetRGBAdaptive(
PMHW_SFC_STATE_PARAMS pSfcStateParams);
//!
//! \brief Initialize SFC Output Surface Command parameters
//! \details Initialize MHW SFC Output Surface Command parameters from SFC Pipe output Surface
//! \param [in] pSfcPipeOutSurface
//! pointer to SFC Pipe output Surface
//! \param [out] pMhwOutSurfParams
//! pointer to SFC Output Surface Command parameters
//! \return MOS_STATUS
//!
MOS_STATUS InitMhwOutSurfParams(
PVP_SURFACE pSfcPipeOutSurface,
PMHW_SFC_OUT_SURFACE_PARAMS pMhwOutSurfParams);
//!
//! \brief Initialize AVS parameters shared by Renderers
//! \details Initialize the members of the AVS parameter and allocate memory for its coefficient tables
//! \param [in,out] pAVS_Params
//! Pointer to MHW AVS parameter
//! \param [in] uiYCoeffTableSize
//! Size of the Y coefficient table
//! \param [in] uiUVCoeffTableSize
//! Size of the UV coefficient table
//! \return void
//!
//!
void InitAVSParams(
PMHW_AVS_PARAMS pAVS_Params,
uint32_t uiYCoeffTableSize,
uint32_t uiUVCoeffTableSize);
//!
//! \brief Destroy AVS parameters shared by Renderers
//! \details Free the memory of AVS parameter's coefficient tables
//! \param [in,out] pAVS_Params
//! Pointer to VPHAL AVS parameter
//! \return void
//!
void DestroyAVSParams(
PMHW_AVS_PARAMS pAVS_Params);
//!
//! \brief Get Avs line buffer size
//! \details Get Avs line buffer size according to height of input surface
//! \param [in] lineTiledBuffer
//! ture if avs line tile buffer, otherwise, avs line buffer.
//! \param [in] b8tapChromafiltering
//! ture if 8-tap UV, otherwise, 4-tap UV.
//! \param [in] width
//! The width of input surface
//! \param [in] height
//! The height of input surface
//! \return uint32_t
//!
uint32_t GetAvsLineBufferSize(bool lineTiledBuffer, bool b8tapChromafiltering, uint32_t width, uint32_t height);
//!
//! \brief Get Ief line buffer size
//! \details Get Ief line buffer size according to height of scaled surface
//! \param [in] lineTiledBuffer
//! ture if ief line tile buffer, otherwise, ief line buffer.
//! \param [in] heightOutput
//! The height of output surface
//! \return uint32_t
//!
uint32_t GetIefLineBufferSize(bool lineTiledBuffer, uint32_t heightOutput);
//!
//! \brief Get Sfd line buffer size
//! \details Get Sfd line buffer size according to height of scaled surface
//! \param [in] lineTiledBuffer
//! ture if sdf line tile buffer, otherwise, sdf line buffer.
//! \param [in] formatOutput
//! format of output surface.
//! \param [in] widthOutput
//! The width of input surface
//! \param [in] heightOutput
//! The height of input surface
//! \return uint32_t
//!
virtual uint32_t GetSfdLineBufferSize(bool lineTiledBuffer, MOS_FORMAT formatOutput, uint32_t widthOutput, uint32_t heightOutput);
//!
//! \brief Allocate line buffer
//! \details Allocate line buffer
//! \param [in/out] lineBuffer
//! pointer to line buffer.
//! \param [in] size
//! size of line buffer.
//! \param [in] bufName
//! name of line buffer.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS AllocateLineBuffer(VP_SURFACE *&lineBuffer, uint32_t size, const char *bufName);
//!
//! \brief Allocate line buffer array
//! \details Allocate line buffer
//! \param [in/out] lineBufferArray
//! pointer to line buffer.
//! \param [in] size
//! size of line buffer.
//! \param [in] bufName
//! name of line buffer.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS AllocateLineBufferArray(VP_SURFACE **&lineBufferArray, uint32_t size, const char *bufName);
//!
//! \brief Destroy line buffer array
//! \details Allocate line buffer
//! \param [in/out] lineBufferArray
//! pointer to line buffer.
//! \param [in] numPipe
//! size of pipe.
//! \param [in] size
//! size of line buffer.
//! \param [in] bufName
//! name of line buffer.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS DestroyLineBufferArray(VP_SURFACE **&lineBufferArray);
//!
//! \brief Allocate Resources for SFC Pipe
//! \details Allocate the AVS and IEF line buffer surfaces for SFC
//! \return Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS AllocateResources();
//!
//! \brief SFC free resources
//! \details Free resources that are used in Vebox
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS FreeResources();
virtual MOS_STATUS AddSfcLock(
PMOS_COMMAND_BUFFER pCmdBuffer,
PMHW_SFC_LOCK_PARAMS pSfcLockParams);
//!
//! \brief Set resource of line buffer
//! \details Set resource of line buffer
//! \param [out] osResLineBuffer
//! resource to be set
//! \param [in] lineBuffer
//! pointer to line buffer
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS SetLineBuffer(PMOS_RESOURCE &osResLineBuffer, VP_SURFACE *lineBuffer);
virtual MOS_STATUS SetupScalabilityParams() = 0;
virtual bool IsInputChannelSwapNeeded(MOS_FORMAT inputFormat);
virtual bool IsOutputChannelSwapNeeded(MOS_FORMAT outputFormat) = 0;
virtual bool IsCscNeeded(SFC_CSC_PARAMS &cscParams) = 0;
protected:
// HW intface to access MHW
PMOS_INTERFACE m_osInterface = nullptr;
PMHW_SFC_INTERFACE m_sfcInterface = nullptr;
PMHW_MI_INTERFACE m_miInterface = nullptr;
MEDIA_FEATURE_TABLE *m_skuTable = nullptr;
MEDIA_WA_TABLE *m_waTable = nullptr;
// AVS related params
MHW_AVS_PARAMS m_AvsParameters = {}; //!< AVS parameters
VPHAL_SFC_AVS_STATE m_avsState = {}; //!< AVS State and Coeff. table
static const uint32_t k_YCoefficientTableSize = 256 * sizeof(int32_t);
static const uint32_t k_UVCoefficientTableSize = 128 * sizeof(int32_t);
PMHW_SFC_STATE_PARAMS m_sfcStateParams = nullptr; //!< Pointer to sfc state parameters
VP_SFC_RENDER_DATA m_renderData = {}; //!< Transient Render data populated for every BLT call
VPHAL_CSPACE m_cscRTCspace = {}; //!< Cspace of Render Target
VPHAL_CSPACE m_cscInputCspace = {}; //!< Cspace of input frame
MHW_SFC_IEF_STATE_PARAMS m_IefStateParams = {}; //!< IEF Params state
float m_cscCoeff[9] = {}; //!< [3x3] Coeff matrix
float m_cscInOffset[3] = {}; //!< [3x1] Input Offset matrix
float m_cscOutOffset[3] = {}; //!< [3x1] Output Offset matrix
uint32_t m_currentChannel = 0; //!< 0=StereoLeft or nonStereo, 1=StereoRight. N/A in nonStereo
VP_SURFACE **m_AVSLineBufferSurfaceArray = nullptr; //!< AVS Line Buffer Surface for SFC
VP_SURFACE **m_IEFLineBufferSurfaceArray = nullptr; //!< IEF Line Buffer Surface for SFC
VP_SURFACE ** m_SFDLineBufferSurfaceArray = nullptr; //!< SFD Line Buffer Surface for SFC
VP_SURFACE *m_AVSLineTileBufferSurface = nullptr; //!< AVS Line Tile Buffer Surface for SFC
VP_SURFACE *m_IEFLineTileBufferSurface = nullptr; //!< IEF Line Tile Buffer Surface for SFC
VP_SURFACE *m_SFDLineTileBufferSurface = nullptr; //!< SFD Line Tile Buffer Surface for SFC
// Allocator interface
PVpAllocator m_allocator = nullptr; //!< vp pipeline allocator
VpIef *m_iefObj = nullptr;
uint8_t m_pipeMode = MhwSfcInterface::SFC_PIPE_MODE_VEBOX; //!< which FE engine pipe used
bool m_bVdboxToSfc = false;
VIDEO_PARAMS m_videoConfig = {};
int m_lineBufferAllocatedInArray = 1; //!< Line buffer allocated in array
SCALABILITY_PARAMS m_scalabilityParams = {};
MOS_SURFACE m_histogramSurf = {}; //!< Histogram buffer
};
}
#endif // !__VP_RENDER_SFC_BASE_H__