/*
* Copyright (c) 2010-2019, 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     vphal_render_sfc_base.h
//! \brief    The header file of the base class of VPHAL 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 __VPHAL_RENDER_SFC_BASE_H__
#define __VPHAL_RENDER_SFC_BASE_H__

#include "mhw_sfc.h"
#include "renderhal.h"
#include "vphal.h"
#include "vphal_render_common.h"
#include "vphal_render_vebox_iecp.h"

#ifndef __VPHAL_SFC_SUPPORTED
#define __VPHAL_SFC_SUPPORTED 1
#endif

//!
//! \brief  Structure to hold AVS Coeff tables
//!
struct VPHAL_SFC_AVS_STATE
{
    MHW_SFC_AVS_LUMA_TABLE      LumaCoeffs;
    MHW_SFC_AVS_CHROMA_TABLE    ChromaCoeffs;
    MHW_SFC_AVS_STATE           AvsStateParams;
};

//!
//! \brief Transient Render data populated for every BLT call
//!
typedef struct _VPHAL_SFC_RENDER_DATA
{
    bool                                bColorFill;                             //!< Enable ColorFill
    bool                                bScaling;                               //!< Enable Scaling
    bool                                bIEF;                                   //!< Enable IEF filter
    bool                                bCSC;                                   //!< Enable CSC filter

    float                               fScaleX;                                //!< X Scaling ratio
    float                               fScaleY;                                //!< Y Scaling ratio
    uint16_t                            wIEFFactor;                             //!< IEF factor
    MHW_SFC_STATE_PARAMS                *SfcStateParams;                        //!< Pointer to SFC state params
    MHW_SFC_IEF_STATE_PARAMS            IEFStateParams;                         //!< Pointer to IEF state params
    PMHW_AVS_PARAMS                     pAvsParams;                             //!< Pointer to AVS params
    PVPHAL_COLORFILL_PARAMS             pColorFillParams;                       //!< Pointer to ColorFill params
    PVPHAL_ALPHA_PARAMS                 pAlphaParams;                           //!< Pointer to Alpha params
    VPHAL_CSPACE                        SfcInputCspace;                         //!< SFC Input Color Space
    MOS_FORMAT                          SfcInputFormat;                         //!< SFC Input Format
    VPHAL_ROTATION                      SfcRotation;                            //!< SFC Rotation Mode
    VPHAL_SCALING_MODE                  SfcScalingMode;                         //!< SFC Scaling Mode
    uint32_t                            SfcSrcChromaSiting;                     //!< SFC Source Surface Chroma Siting

    PVPHAL_SURFACE                      pSfcPipeOutSurface;                     //!< SFC Pipe output surface

    bool                                bForcePolyPhaseCoefs;                   //!< SFC AVS force polyphase coef
} VPHAL_SFC_RENDER_DATA, *PVPHAL_SFC_RENDER_DATA;

#if __VPHAL_SFC_SUPPORTED
class VphalSfcState
{
public:
    //!
    //! \brief    VphalSfcState constructor
    //! \param    [in] osInterface
    //!           Pointer to os interface
    //! \param    [in] renderHal
    //!           pointer to renderhal structure
    //! \param    [in] sfcInterface
    //!           pointer to mhw sfc interface
    //! \return   void
    //!
    VphalSfcState(PMOS_INTERFACE       osInterface,
                  PRENDERHAL_INTERFACE renderHal,
                  PMHW_SFC_INTERFACE   sfcInterface);
    //!
    //! \brief    VphalSfcState destructor
    //! \return   void
    //!
    virtual ~VphalSfcState();

    //!
    //! \brief    Disable the SFC functionality
    //! \param    [in] disable
    //!           true to disable, false to enable SFC
    //! \return   void
    //!
    void SetDisable(bool disable)
    {
        disableSFC = disable;
    }

    //!
    //! \brief    Set SFC MMC status
    //! \param    [in] enable
    //!           true to disable, false to enable SFC MMC
    //! \return   void
    //!
    void SetSfcOutputMmcStatus(bool enable)
    {
        enableSfcMMC = enable;
    }

    //!
    //! \brief    Check if SFC functionality is disabled
    //! \return   true if disabled, false if enabled
    //!
    bool IsDisabled()
    {
        return disableSFC;
    }

    //!
    //! \brief    Check if SFC MMC is enabled
    //! \return   true if enabled, false if disabled
    //!
    bool IsSfcMmcEnabled()
    {
        return enableSfcMMC;
    }

    //!
    //! \brief    Set stero channel of input
    //! \param    [in] currentChannel
    //!           Current stero channel
    //! \return   void
    //!
    void SetStereoChannel(uint32_t currentChannel)
    {
        m_currentChannel = currentChannel;
    }

    //!
    //! \brief    Get Sfc's input format
    //! \return   MOS_FORMAT
    //!
    MOS_FORMAT GetInputFormat()
    {
        return m_renderData.SfcInputFormat;
    }

    //!
    //! \brief    Get Sfc's input color space
    //! \return   VPHAL_CSPACE
    //!
    VPHAL_CSPACE GetInputColorSpace()
    {
        return m_renderData.SfcInputCspace;
    }

    //!
    //! \brief    Initialize sfc render data
    //! \return   void
    //!
    virtual void InitRenderData()
    {
        MOS_FreeMemory(m_renderData.SfcStateParams);
        m_renderData = { };
    }

    //!
    //! \brief    Get the output pipe considering the SFC restrictions
    //! \details  Check which output pipe can be applied, SFC or Comp
    //! \param    [in] pSrc
    //!           Pointer to input surface of SFC
    //! \param    [in] pRenderTarget
    //!           Pointer to RenderTarget
    //! \param    [in] pcRenderParams
    //!           Pointer to VpHal render parameters
    //! \return   the output pipe mode
    //!
    virtual VPHAL_OUTPUT_PIPE_MODE GetOutputPipe(
        PVPHAL_SURFACE              pSrc,
        PVPHAL_SURFACE              pRenderTarget,
        PCVPHAL_RENDER_PARAMS       pcRenderParams);

    //!
    //! \brief    Check if SFC is feasible to generate output
    //! \param    [in] pcRenderParams
    //!           Pointer to VpHal render parameters
    //! \param    [in] pSrcSurface
    //!           Pointer to input surface of SFC
    //! \param    [in] pRenderTarget
    //!           Pointer to RenderTarget
    //! \return   true if SFC is feasible
    //!
    virtual bool IsOutputPipeSfcFeasible(
        PCVPHAL_RENDER_PARAMS       pcRenderParams,
        PVPHAL_SURFACE              pSrcSurface,
        PVPHAL_SURFACE              pRenderTarget);

    //!
    //! \brief    Setup SFC Rendering Flags
    //! \details  Set up the SFC rendering flag based the input and render target
    //!           surface, SFC state and the ColorFill/Alpha parameters
    //! \param    [in] pColorFillParams
    //!           Pointer to ColorFill params
    //! \param    [in] pAlphaParams
    //!           Pointer to Alpha params
    //! \param    [in] pSrc
    //!           Pointer to Source Surface
    //! \param    [in] pRenderTarget
    //!           Pointer to Render Target Surface
    //! \param    [in,out] pRenderData
    //!           Pointer to Vebox render Data
    //! \return   void
    //!
    virtual void SetRenderingFlags(
        PVPHAL_COLORFILL_PARAMS         pColorFillParams,
        PVPHAL_ALPHA_PARAMS             pAlphaParams,
        PVPHAL_SURFACE                  pSrc,
        PVPHAL_SURFACE                  pRenderTarget,
        PVPHAL_VEBOX_RENDER_DATA        pRenderData);

    //!
    //! \brief    Free resources used by SFC Pipe
    //! \details  Free the AVS and IEF line buffer surfaces for SFC
    //! \return   void
    //!
    virtual void FreeResources();

    //!
    //! \brief    Check to see if the i/o surface is supported by SFC
    //! \details  Check the format and the size of i/o surface and determine
    //!           whether it can go through SFC pipe
    //! \param    [in] pSrcSurface
    //!           Pointer to Src surface
    //! \param    [in] pOutSurface
    //!           Pointer to Output surface
    //! \param    [in] pAlphaParams
    //!           Pointer to Alpha params
    //! \return   true if SFC Pipe is needed else false
    //!
    virtual bool IsFormatSupported(
        PVPHAL_SURFACE              pSrcSurface,
        PVPHAL_SURFACE              pOutSurface,
        PVPHAL_ALPHA_PARAMS         pAlphaParams);

    //!
    //! \brief    Setup SFC states and parameters
    //! \details  Setup SFC states and parameters including SFC State, AVS
    //!           and IEF parameters
    //! \param    [in] pSrcSurface
    //!           Pointer to Source Surface
    //! \param    [in] pOutSurface
    //!           Pointer to Output Surface
    //! \param    [in,out] pRenderData
    //!           Pointer to Vebox Render data
    //! \return   Return MOS_STATUS_SUCCESS if successful, otherwise failed
    //!
    virtual MOS_STATUS SetupSfcState(
        PVPHAL_SURFACE                  pSrcSurface,
        PVPHAL_SURFACE                  pOutSurface,
        PVPHAL_VEBOX_RENDER_DATA        pRenderData);

    //!
    //! \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(
        PVPHAL_VEBOX_RENDER_DATA        pRenderData,
        PMOS_COMMAND_BUFFER             pCmdBuffer);

    //!
    //! \brief    Set Sfc index used by HW
    //! \details  VPHAL set Sfc index used by HW
    //! \param    [in] dwSfcIndex;
    //!           set which Sfc can be used by HW
    //! \param    [in] dwSfcCount;
    //!           set Sfc Count
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    virtual MOS_STATUS SetSfcIndex(
        uint32_t                    dwSfcIndex,
        uint32_t                    dwSfcCount)
    {
        MOS_UNUSED(dwSfcIndex);
        MOS_UNUSED(dwSfcCount);
        return MOS_STATUS_SUCCESS;
    }

protected:
    //!
    //! \brief      Gen specific function for SFC adjust boundary
    //! \details    Adjust the width and height of the input surface for SFC
    //! \param      [in] pSurface
    //!             Pointer to input Surface
    //! \param      [out] pdwSurfaceWidth
    //!             Pointer to adjusted surface width
    //! \param      [out] pdwSurfaceHeight
    //!             Pointer to adjusted surface height
    //! \return     void
    //!
    virtual void AdjustBoundary(
        PVPHAL_SURFACE              pSurface,
        uint32_t*                   pdwSurfaceWidth,
        uint32_t*                   pdwSurfaceHeight);

    //!
    //! \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    Is the Format MMC Supported in SFC
    //! \details  Check whether input format is supported by memory compression
    //! \param    [in] Format
    //!           Surface format
    //! \return   true if supported, false if not
    //!
    virtual bool IsFormatMMCSupported(
        MOS_FORMAT                  Format);

    //!
    //! \brief    Check if SFC is capable to output
    //! \details  Check all conditions to see if it meets SFC's capablitiy
    //! \param    [in] isColorFill
    //!           indicates whether color fill is required
    //! \param    [in] src
    //!           Pointer to source surface
    //! \param    [in] renderTarget
    //!           Pointer to renderTarget surface
    //! \return   true if capable, false if not
    //!
    virtual bool IsOutputCapable(
        bool            isColorFill,
        PVPHAL_SURFACE  src,
        PVPHAL_SURFACE  renderTarget);

    //!
    //! \brief    Check if the input format is supported
    //! \param    [in] srcSurface
    //!           input surface
    //! \return   true if supported, false if not
    //!
    virtual bool IsInputFormatSupported(
        PVPHAL_SURFACE              srcSurface) = 0;

    //!
    //! \brief    Check if the output format is supported
    //! \param    [in] outSurface
    //!           output surface
    //! \return   true if supported, false if not
    //!
    virtual bool IsOutputFormatSupported(
        PVPHAL_SURFACE              outSurface) = 0;

    //!
    //! \brief    Get width and height align unit of input format
    //! \param    [in] inputFormat
    //!           input format
    //! \param    [in] outputFormat
    //!           output format
    //! \param    [out] widthAlignUnit
    //!           width align unit
    //! \param    [out] heightAlignUnit
    //!           height align unit
    //! \return   void
    //!
    virtual void GetInputWidthHeightAlignUnit(
        MOS_FORMAT              inputFormat,
        MOS_FORMAT              outputFormat,
        uint16_t                &widthAlignUnit,
        uint16_t                &heightAlignUnit) = 0;

    //!
    //! \brief    Get width and height align unit of output format
    //! \param    [in] outputFormat
    //!           output format
    //! \param    [out] widthAlignUnit
    //!           width align unit
    //! \param    [out] heightAlignUnit
    //!           height align unit
    //! \return   void
    //!
    virtual void GetOutputWidthHeightAlignUnit(
        MOS_FORMAT              outputFormat,
        uint16_t                &widthAlignUnit,
        uint16_t                &heightAlignUnit,
        bool                    isInterlacedScaling = false);

    //!
    //! \brief    Setup SFC State related parameters
    //! \details  Setup the SFC State related parameters based on the i/o surface
    //!           and Vebox and SFC rendering data
    //! \param    [in,out] pRenderData
    //!           Pointer to Vebox Render data
    //! \param    [in] pSrcSurface
    //!           Pointer to Input Source Surface
    //! \param    [in] pOutSurface
    //!           Pointer to Output Source Surface
    //! \return   MOS_STATUS
    //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
    //!
    virtual MOS_STATUS SetSfcStateParams(
        PVPHAL_VEBOX_RENDER_DATA        pRenderData,
        PVPHAL_SURFACE                  pSrcSurface,
        PVPHAL_SURFACE                  pOutSurface);

    //!
    //! \brief    Setup parameters related to SFC_IEF State
    //! \details  Setup the IEF and CSC params of the SFC_IEF State
    //! \param    [in] veboxRenderData
    //!           Pointer to Vebox Render Data
    //! \param    [in,out] sfcStateParams
    //!           Pointer to SFC_STATE params
    //! \param    [in] inputSurface
    //!           Pointer to Input Surface
    //! \return   void
    //!
    virtual void SetIefStateParams(
        PVPHAL_VEBOX_RENDER_DATA        veboxRenderData,
        PMHW_SFC_STATE_PARAMS           sfcStateParams,
        PVPHAL_SURFACE                  inputSurface);

    //!
    //! \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 void SetIefStateCscParams(
        PMHW_SFC_STATE_PARAMS           pSfcStateParams,
        PMHW_SFC_IEF_STATE_PARAMS       pIEFStateParams);

    //!
    //! \brief    Update SFC Rendering Flags
    //! \details  Update the SFC rendering flag based the input and render target
    //!           surface, SFC state and the ColorFill/Alpha parameters
    //! \param    [in] pSrcSurface
    //!           Pointer to Source Surface
    //! \param    [in] pOutSurface
    //!           Pointer to Render Target Surface
    //! \param    [in,out] pRenderData
    //!           Pointer to Vebox Render Data
    //! \return   MOS_STATUS
    //!
    virtual MOS_STATUS UpdateRenderingFlags(
        PVPHAL_SURFACE                  pSrcSurface,
        PVPHAL_SURFACE                  pOutSurface,
        PVPHAL_VEBOX_RENDER_DATA        pRenderData);

    //!
    //! \brief    Determine if CSC is required in SFC pipe and set related params
    //! \param    [in] src
    //!           Pointer to Source Surface
    //! \param    [in] renderTarget
    //!           Pointer to Target Surface
    //! \return   void
    //!
    virtual void DetermineCscParams(
        PVPHAL_SURFACE                  src,
        PVPHAL_SURFACE                  renderTarget);

    //!
    //! \brief    Determine SFC input surface format
    //! \details  Determine SFC input surface format according to
    //!           surface info and vebox flags
    //! \param    [in] src
    //!           Pointer to Source Surface
    //! \param    [in] veboxRenderData
    //!           Pointer to vebox Render Data
    //! \return   void
    //!
    virtual void DetermineInputFormat(
        PVPHAL_SURFACE                  src,
        PVPHAL_VEBOX_RENDER_DATA        veboxRenderData);

    //!
    //! \brief    Determine SFC input ordering mode
    //! \details  Determine SFC input ordering mode according to
    //!           vebox flags
    //! \param    [in] veboxRenderData
    //!           Pointer to vebox Render Data
    //! \param    [out] sfcStateParams
    //!           Pointer to SFC state params
    //! \return   void
    //!
    virtual void SetSfcStateInputOrderingMode(
        PVPHAL_VEBOX_RENDER_DATA    veboxRenderData,
        PMHW_SFC_STATE_PARAMS       sfcStateParams);

    //!
    //! \brief    Send SFC pipe commands
    //! \details  Register the surfaces and send the commands needed by SFC pipe
    //! \param    [in] pSfcInterface
    //!           Pointer to SFC interface
    //! \param    [in] pMhwMiInterface
    //!           Pointer to MI interface
    //! \param    [in] pOsInterface
    //!           Pointer to OS interface
    //! \param    [in] pSfcPipeOutSurface
    //!           Pointer to SFC Output surface
    //! \param    [in,out] pCmdBuffer
    //!           Pointer to command buffer
    //! \return   MOS_STATUS_SUCCESS if successful, otherwise failed
    //!
    virtual MOS_STATUS RenderSfcMmcCMD(
        PMHW_SFC_INTERFACE          pSfcInterface,
        MhwMiInterface            * pMhwMiInterface,
        PMOS_INTERFACE              pOsInterface,
        PMHW_SFC_OUT_SURFACE_PARAMS pSfcPipeOutSurface,
        PMOS_COMMAND_BUFFER         pCmdBuffer)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set SFC MMC States
    //! \details  Update the SFC output MMC status
    //! \param    [in] renderData
    //!           Pointer to Render Data
    //! \param    [in] outSurface
    //!           Pointer to Sfc Output Surface
    //! \param    [in,out] sfcStateParams
    //!           Pointer to SFC State Params
    //! \return   MOS_STATUS
    //!
    virtual MOS_STATUS SetSfcMmcStatus(
        PVPHAL_VEBOX_RENDER_DATA    renderData,
        PVPHAL_SURFACE              outSurface,
        PMHW_SFC_STATE_PARAMS       sfcStateParams);

private:

    //!
    //! \brief    Setup parameters related to SFC_AVS State
    //! \details  Setup the 8x8 table of SFC sampler
    //! \return   MOS_STATUS
    //!
    MOS_STATUS SetAvsStateParams();

public:
    bool                            m_bSFC2Pass = false;
    bool                            m_bSFC2PassPerfMode = false;

protected:
    bool                            disableSFC    = false;                      //!< Disable SFC for validation purposes
    bool                            enableSfcMMC  = false;                      //!< Memory compression enbale flag - read from User feature keys

    PMOS_INTERFACE                  m_osInterface;                              //!< Os Interface
    PRENDERHAL_INTERFACE            m_renderHal;                                //!< Pointer to RenderHal Structure Interface
    PMHW_SFC_INTERFACE              m_sfcInterface;                             //!< Pointer to SFC Structure Interface

                                                                                // AVS related params
    MHW_AVS_PARAMS                  m_AvsParameters       = {};                 //!< AVS parameters
    VPHAL_SFC_AVS_STATE             m_avsState            = {};                 //!< AVS State and Coeff. table

                                                                                // ColorFill CSC related params
    VPHAL_COLOR_SAMPLE_8            m_colorFillColorSrc   = {};                 //!< ColorFill Sample from DDI
    VPHAL_COLOR_SAMPLE_8            m_colorFillColorDst   = {};                 //!< ColorFill Sample programmed in Sfc State
    VPHAL_CSPACE                    m_colorFillSrcCspace  = {};                 //!< Cspace of the source ColorFill Color
    VPHAL_CSPACE                    m_colorFillRTCspace   = {};                 //!< Cspace of the Render Target

                                                                                // CSC related params
    VPHAL_CSPACE                    m_cscRTCspace      = {};                    //!< Cspace of Render Target
    VPHAL_CSPACE                    m_cscInputCspace   = {};                    //!< Cspace of input frame
    float                           m_cscCoeff[9]     = {};                     //!< [3x3] Coeff matrix
    float                           m_cscInOffset[3]  = {};                     //!< [3x1] Input Offset matrix
    float                           m_cscOutOffset[3] = {};                     //!< [3x1] Output Offset matrix

                                                                                // Surfaces used by SFC
    VPHAL_SURFACE                   m_AVSLineBufferSurface = {};                //!< AVS Line Buffer Surface for SFC
    VPHAL_SURFACE                   m_IEFLineBufferSurface = {};                //!< IEF Line Buffer Surface for SFC
    VPHAL_SURFACE                   m_SFDLineBufferSurface = {};                //!< SFD Line Buffer Surface for SFC

                                                                                // Stereo state.
    uint32_t                        m_currentChannel = 0;                       //!< 0=StereoLeft or nonStereo, 1=StereoRight. N/A in nonStereo

    VPHAL_SFC_RENDER_DATA           m_renderData = {};                          //!< Transient Render data populated for every BLT call

};
#else
// A dummy class that does nothing when SFC is not supported

class VphalSfcState
{
public:
    VphalSfcState(
        PMOS_INTERFACE       osInterface,
        PRENDERHAL_INTERFACE renderHal,
        PMHW_SFC_INTERFACE   sfcInterface) {}
    virtual ~VphalSfcState() {}

    //!
    //! \brief    Disable the SFC functionality
    //! \param    [in] disable
    //!           true to disable, false to enable SFC
    //! \return   void
    void SetDisable(bool disable)
    {

    }

    //!
    //! \brief    Set SFC MMC status
    //! \param    [in] enable
    //!           true to disable, false to enable SFC MMC
    //! \return   void
    void SetSfcOutputMmcStatus(bool enable)
    {

    }
    //!
    //! \brief    Check if SFC functionality is disabled
    //! \return   true if disabled, false if enabled
    bool IsDisabled()
    {
        return true;
    }

    //!
    //! \brief    Set stero channel of input
    //! \param    [in] currentChannel
    //!           Current stero channel
    //! \return   void
    void SetStereoChannel(uint32_t currentChannel)
    {

    }

    MOS_FORMAT GetInputFormat()
    {
        return Format_Invalid;
    }

    VPHAL_CSPACE GetInputColorSpace()
    {
        return CSpace_None;
    }

    void InitRenderData()
    {
        {};
    }

    //!
    //! \brief    Get the output pipe considering the SFC restrictions
    //! \details  Check which output pipe can be applied, SFC or Comp
    //! \param    [in] pSrc
    //!           Pointer to input surface of SFC
    //! \param    [in] pRenderTarget
    //!           Pointer to RenderTarget
    //! \param    [in] pcRenderParams
    //!           Pointer to VpHal render parameters
    //! \return   the output pipe mode
    //!
    VPHAL_OUTPUT_PIPE_MODE GetOutputPipe(
        PVPHAL_SURFACE              pSrc,
        PVPHAL_SURFACE              pRenderTarget,
        PCVPHAL_RENDER_PARAMS       pcRenderParams)
    {
        return VPHAL_OUTPUT_PIPE_MODE_COMP;
    }

    //!
    //! \brief    Setup SFC Rendering Flags
    //! \details  Set up the SFC rendering flag based the input and render target
    //!           surface, SFC state and the ColorFill/Alpha parameters
    //! \param    [in] pColorFillParams
    //!           Pointer to ColorFill params
    //! \param    [in] pAlphaParams
    //!           Pointer to Alpha params
    //! \param    [in] pSrc
    //!           Pointer to Source Surface
    //! \param    [in] pRenderTarget
    //!           Pointer to Render Target Surface
    //! \param    [in,out] pRenderData
    //!           Pointer to Vebox render Data
    //! \return   void
    //!
    void SetRenderingFlags(
        PVPHAL_COLORFILL_PARAMS         pColorFillParams,
        PVPHAL_ALPHA_PARAMS             pAlphaParams,
        PVPHAL_SURFACE                  pSrc,
        PVPHAL_SURFACE                  pRenderTarget,
        PVPHAL_VEBOX_RENDER_DATA        pRenderData)    {  }

    //!
    //! \brief    Free resources used by SFC Pipe
    //! \details  Free the AVS and IEF line buffer surfaces for SFC
    //! \return   void
    //!
    void FreeResources() { }

    //!
    //! \brief    Check to see if the i/o surface is supported by SFC
    //! \details  Check the format and the size of i/o surface and determine
    //!           whether it can go through SFC pipe
    //! \param    [in] pSrcSurface
    //!           Pointer to Src surface
    //! \param    [in] pOutSurface
    //!           Pointer to Output surface
    //! \param    [in] pAlphaParams
    //!           Pointer to Alpha params
    //! \return   true if SFC Pipe is needed else false
    //!
    bool IsFormatSupported(
        PVPHAL_SURFACE              pSrcSurface,
        PVPHAL_SURFACE              pOutSurface,
        PVPHAL_ALPHA_PARAMS         pAlphaParams) { return false;}

    //!
    //! \brief    Setup SFC states and parameters
    //! \details  Setup SFC states and parameters including SFC State, AVS
    //!           and IEF parameters
    //! \param    [in] pSrcSurface
    //!           Pointer to Source Surface
    //! \param    [in] pOutSurface
    //!           Pointer to Output Surface
    //! \param    [in,out] pRenderData
    //!           Pointer to Vebox Render data
    //! \return   Return MOS_STATUS_SUCCESS if successful, otherwise failed
    //!
    MOS_STATUS SetupSfcState(
        PVPHAL_SURFACE                  pSrcSurface,
        PVPHAL_SURFACE                  pOutSurface,
        PVPHAL_VEBOX_RENDER_DATA        pRenderData)    {return MOS_STATUS_SUCCESS; }

    //!
    //! \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
    //!
    MOS_STATUS SendSfcCmd(
        PVPHAL_VEBOX_RENDER_DATA        pRenderData,
        PMOS_COMMAND_BUFFER             pCmdBuffer)   { return MOS_STATUS_SUCCESS;}
};
#endif

#endif // __VPHAL_RENDER_SFC_BASE_H__
