blob: 595ee31c5de0acac8b09bda1deb70e8b7269019f [file] [log] [blame]
/*
* Copyright (c) 2016-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 vphal_render_composite.h
//! \brief Common interface and structure used in Composite
//! \details Common interface and structure used in Composite
//!
#ifndef __VPHAL_RENDER_COMPOSITE_H__
#define __VPHAL_RENDER_COMPOSITE_H__
#include "vphal.h"
#include "vphal_render_renderstate.h"
#include "vphal_render_common.h"
#include "mhw_render.h"
//!
//! \brief Compositing buffers
//!
#define VPHAL_COMP_BUFFERS_DEFAULT 4
#define VPHAL_COMP_BUFFERS_MAX 32
#define VPHAL_MAX_PROCAMP 2
#define VPHAL_SURFACE_INDEX_INVALID -1
#define VPHAL_COMP_MAX_PALETTES 2
#define VPHAL_COMP_MAX_LUMA_KEY 1
#define VPHAL_COMP_MAX_AVS 1
#define VPHAL_COMP_MAX_PROCAMP 1
#define VPHAL_COMP_SAMPLER_NEAREST 1
#define VPHAL_COMP_SAMPLER_BILINEAR 2
#define VPHAL_COMP_SAMPLER_LUMAKEY 4
#define VPHAL_COMP_MAX_SAMPLER (VPHAL_COMP_SAMPLER_NEAREST | VPHAL_COMP_SAMPLER_BILINEAR | VPHAL_COMP_SAMPLER_LUMAKEY)
#define VPHAL_SAMPLER_Y 1
#define VPHAL_SAMPLER_U 2
#define VPHAL_SAMPLER_V 3
#define VPHAL_COMP_COMPUTE_WALKER_THREAD_SPACE_WIDTH 1
#define VPHAL_COMP_COMPUTE_WALKER_THREAD_SPACE_HEIGHT 1
#define VPHAL_COMP_COMPUTE_WALKER_THREAD_SPACE_DEPTH 1
// GRF 8 for unified kernel inline data (NLAS is enabled)
struct MEDIA_OBJECT_NLAS_INLINE_DATA
{
// DWORD 0 - GRF R6.0
union
{
struct
{
float HorizontalFrameOriginLayer0;
};
uint32_t Value;
} DW00;
// DWORD 1 - GRF R6.1
union
{
struct
{
float HorizontalFrameOriginLayer1;
};
uint32_t Value;
} DW01;
// DWORD 2 - GRF R6.2
union
{
struct
{
float HorizontalFrameOriginLayer2;
};
uint32_t Value;
} DW02;
// DWORD 03 - GRF R6.3
union
{
struct
{
float HorizontalFrameOriginLayer3;
};
uint32_t Value;
} DW03;
// DWORD 04 - GRF R6.4
union
{
struct
{
float HorizontalFrameOriginLayer4;
};
uint32_t Value;
} DW04;
// DWORD 05 - GRF R6.5
union
{
struct
{
float HorizontalFrameOriginLayer5;
};
uint32_t Value;
} DW05;
// DWORD 06 - GRF R6.6
union
{
struct
{
float HorizontalFrameOriginLayer6;
};
uint32_t Value;
} DW06;
// DWORD 07 - GRF R6.7
union
{
struct
{
float HorizontalFrameOriginLayer7;
};
uint32_t Value;
} DW07;
};
//!
//! \brief Structure to VPHAL Composite Media Object Inline Data
//!
struct VPHAL_COMPOSITE_MO_INLINE_DATA
{
// Do not change the two members' order because of low level memcpy
MEDIA_OBJECT_NLAS_INLINE_DATA NLASInline;
MEDIA_OBJECT_KA2_INLINE_DATA KA2Inline;
};
//!
//! \brief Structure to VPHAL Composite Parameters
//!
typedef struct _VPHAL_COMPOSITE_PARAMS
{
// Pointer to target and source surfaces
uint32_t uSourceCount; //!< Number of sources
PVPHAL_SURFACE pSource[VPHAL_COMP_MAX_LAYERS];
uint32_t uTargetCount; //!< Number of targets
VPHAL_SURFACE Target[VPHAL_MAX_TARGETS]; //!< Render targets
// Needed by CP during MHW VP integration, due to pTokenState->pResourceInfo
RENDERHAL_SURFACE RenderHalSurfaceSrc[VPHAL_COMP_MAX_LAYERS];
RENDERHAL_SURFACE RenderHalSurfaceSrcField[VPHAL_COMP_MAX_LAYERS];
RENDERHAL_SURFACE RenderHalSurfaceTarget[VPHAL_MAX_TARGETS];
bool bSkipBlocks; //!< Skip empty blocks
PRECT pConstriction; //!< Constricted output
PVPHAL_COLORFILL_PARAMS pColorFillParams; //!< ColorFill - BG only
PVPHAL_ALPHA_PARAMS pCompAlpha; //!< Alpha for composited surface
bool bAlphaCalculateEnable;
bool bForceSkipColorFill; //!< Force skip colorfill even the first layer is translucent
bool bComputeWlaker; //!< Compute walker in use
// Resource counters
int32_t nLayers;
int32_t nPalettes;
int32_t nAVS;
int32_t nProcamp;
int32_t nLumaKeys;
int32_t nSampler;
VPHAL_ROTATION Rotation; //!< Layer 0 rotation info
} VPHAL_COMPOSITE_PARAMS, *PVPHAL_COMPOSITE_PARAMS;
//!
//! \brief Structure to VPHAL Composite Rendering data
//!
typedef struct _VPHAL_RENDERING_DATA_COMPOSITE
{
// Sources
int32_t iLayers;
PVPHAL_SURFACE pLayers[VPHAL_COMP_MAX_LAYERS];
PVPHAL_SURFACE pTarget[VPHAL_MAX_TARGETS];
PVPHAL_COLORFILL_PARAMS pColorFill;
PVPHAL_ALPHA_PARAMS pCompAlpha;
// Geometry
int32_t iBlocksX;
int32_t iBlocksY;
int32_t iBindingTable;
int32_t iMediaID;
int32_t iCurbeOffset;
int32_t iCurbeLength;
RECT rcOutput;
// Constriction parameters
PRECT pConstriction;
int32_t ConstrictionOriginX;
int32_t ConstrictionOriginY;
float fConstrictionStepX;
float fConstrictionStepY;
// HDC Direct Write flag
bool bHdcDwEnable;
// Alpha Calculate flag
bool bAlphaCalculateEnable;
// CM FC flag
bool bCmFcEnable;
// States
PRENDERHAL_MEDIA_STATE pMediaState;
MHW_SAMPLER_STATE_PARAM SamplerStateParams[MHW_RENDER_ENGINE_SAMPLERS_MAX];
int32_t iCmdInlineSize;
int32_t iNLASInlineSize;
MEDIA_OBJECT_KA2_STATIC_DATA Static;
MEDIA_WALKER_KA2_STATIC_DATA WalkerStatic;
MEDIA_OBJECT_KA2_INLINE_DATA Inline;
PMHW_AVS_PARAMS pAvsParams;
MEDIA_DP_FC_STATIC_DATA DPFCStatic;
// Batch Buffer rendering arguments
VPHAL_BB_COMP_ARGS BbArgs;
// Kernel Information
Kdll_CacheEntry *pKernelEntry;
Kdll_Procamp *pProcamp;
// Extension data
void* pExtensionData;
} VPHAL_RENDERING_DATA_COMPOSITE, *PVPHAL_RENDERING_DATA_COMPOSITE;
//!
//! \brief Structure to VPHAL 16x16 Block COMPOSITE Mask
//!
typedef struct _VPHAL_16X16BLOCK_COMPOSITE_MASK
{
uint32_t HorizontalBlockCompositeMask : 16;
uint32_t VerticalBlockCompositeMask : 16;
} VPHAL_16X16BLOCK_COMPOSITE_MASK, *PVPHAL_16X16BLOCK_COMPOSITE_MASK;
//!
//! \brief Class to VPHAL Composite render
//!
class CompositeState : public RenderState
{
public:
//!
//! \brief Composite Constructor
//! \details Construct Composite render and allocate member data structure
//! \param [in] pOsInterface
//! Pointer to MOS interface structure
//! \param [in] pRenderHal
//! Pointer to RenderHal interface structure
//! \param [in] pPerfData
//! Pointer to performance data structure
//! \param [in] compositeCacheCntl
//! Composite Cache Control Data
//! \param [out] peStatus
//! Pointer to MOS status
//!
CompositeState(
PMOS_INTERFACE pOsInterface,
PRENDERHAL_INTERFACE pRenderHal,
PVPHAL_RNDR_PERF_DATA pPerfData,
const VPHAL_COMPOSITE_CACHE_CNTL &compositeCacheCntl,
MOS_STATUS *peStatus);
//!
//! \brief Composite render Destructor
//! \details Destroy Composite render and release all related RenderState resources
//!
virtual ~CompositeState();
//!
//! \brief Initialize Composite render
//! \param [in] pSettings
//! Pointer to VPHAL Settings
//! \param [in] pKernelDllState
//! Pointer to KernelDLL State
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful
//!
virtual MOS_STATUS Initialize(
const VphalSettings *pSettings,
Kdll_State *pKernelDllState);
//!
//! \brief Composite Destroy function
//! \details Destroy resource allocated by Composite
//!
virtual void Destroy();
//!
//! \brief Composite render Rendering
//! \details VPHal Composite render entry
//! \param [in] pcRenderParams
//! Pointer to Render parameters
//! \param [in,out] pRenderPassData
//! Pointer to Render data
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS Render(
PCVPHAL_RENDER_PARAMS pcRenderParams,
RenderpassData *pRenderPassData);
//!
//! \brief Judge if Composite render is needed
//! \details Check Render parameter/data if Composite render needed
//! \param [in] pcRenderParams
//! Pointer to Render parameters
//! \param [in,out] pRenderPassData
//! Pointer to Render data
//! \return bool
//! true if meeded. Else false
//!
bool IsNeeded(
PCVPHAL_RENDER_PARAMS pcRenderParams,
RenderpassData *pRenderPassData);
//!
//! \brief set Report data
//! \details set Report data for this render
//! \param [in] pSource
//! pointer to the surface
//!
virtual void SetReporting(PVPHAL_SURFACE pSource);
//!
//! \brief copy Report data
//! \details copy Report data from this render
//! \param [out] pReporting
//! pointer to the Report data to copy data to
//!
virtual void CopyReporting(VphalFeatureReport* pReporting);
//!
//! \brief Judge if Composite render support multiple stream rendering
//! \details Judge if Composite render support multiple stream rendering
//! \return bool
//! true if supported. Else false
//!
bool IsMultipleStreamSupported();
//!
//! \brief Search for the best match BB according to the Composition BB arguments
//! \param [in] pBatchBufferTable
//! Pointer to the BB table to be searched
//! \param [in] pInputBbParams
//! Pointer to the BB params required for the best match
//! \param [in] iBbSize
//! the BB size required for the best match
//! \param [out] ppBatchBuffer
//! Pointer to the addr of the best matched BB, pointer to nullptr if there's
//! no available matched BB
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
static MOS_STATUS GetBestMatchBB(
PVPHAL_BATCH_BUFFER_TABLE pBatchBufferTable,
PVPHAL_BATCH_BUFFER_PARAMS pInputBbParams,
int32_t iBbSize,
PMHW_BATCH_BUFFER *ppBatchBuffer);
//!
//! \brief Load Palette Data
//! \details Load Palette Data according to color space and CSC matrix.
//! \param [in] pInPalette
//! Pointer to Input Palette structure
//! \param [in] srcCspace
//! Source color space
//! \param [in] dstCspace
//! Destination color space
//! \param [in] piCscMatrix
//! Pointer to CSC matrix to use in fixed point format
//! \param [in] iNumEntries
//! Number of Palette entries to be filled
//! \param [in,out] pPaletteData
//! Pointer to Output Palette Address
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS, otherwise MOS_STATUS_UNIMPLEMENTED if Destination Colorspace not supported,
//! or MOS_STATUS_INVALID_PARAMETER/MOS_STATUS_NULL_POINTER
//!
MOS_STATUS LoadPaletteData(
PVPHAL_PALETTE pInPalette,
VPHAL_CSPACE srcCspace,
VPHAL_CSPACE dstCspace,
int32_t* piCscMatrix,
int32_t iNumEntries,
void* pPaletteData);
protected:
//!
//! \brief Set Sampler Avs 8x8 Table
//! \param [in] pRenderHal
//! Pointer to RenderHal Interface Structure
//! \param [in] pSamplerStateParams
//! Pointer to Sampler State Params
//! \param [in,out] pAvsParams
//! Pointer to AVS Params
//! \param [in] SrcFormat
//! Source Format
//! \param [in] fScaleX
//! Horizontal Scale Factor
//! \param [in] fScaleY
//! Vertical Scale Factor
//! \param [in] dwChromaSiting
//! Chroma Siting
//! \return MOS_STATUS
//!
virtual MOS_STATUS SetSamplerAvsTableParam(
PRENDERHAL_INTERFACE pRenderHal,
PMHW_SAMPLER_STATE_PARAM pSamplerStateParams,
PMHW_AVS_PARAMS pAvsParams,
MOS_FORMAT SrcFormat,
float fScaleX,
float fScaleY,
uint32_t dwChromaSiting);
//!
//! \brief Get Plane Offset override parameter for Kernel WA
//! \details Get Y/UV Plane Offset override parameters for Kernel WA
//! \param pRenderHalSurface
//! [in,out] Pointer to Render Hal Surface
//! \param pParams
//! [in] Pointer to Surface State Params
//! \param pOverride
//! [out] Pointer to override param that provides adjustments to
//! Y, UV plane offsets, used for kernel WA in a few cases.
//! \return RENDERHAL_OFFSET_OVERRIDE
//! return pointer to RENDERHAL_OFFSET_OVERRIDE if need, otherwise return nullptr.
//!
virtual PRENDERHAL_OFFSET_OVERRIDE GetPlaneOffsetOverrideParam(
PRENDERHAL_SURFACE pRenderHalSurface,
PRENDERHAL_SURFACE_STATE_PARAMS pParams,
PRENDERHAL_OFFSET_OVERRIDE pOverride)
{
return nullptr;
}
//!
//! \brief Get Thread Count for VFE state parameter
//! \details Get Thread Count for VFE state parameter
//! \param pRenderingData
//! [in] Pointer to Composite state
//! \param pTarget
//! [in] Pointer to target surface
//! \return INT
//! return the thread count
//!
virtual int32_t GetThreadCountForVfeState(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PVPHAL_SURFACE pTarget);
//!
//! \brief Calculate Composite parameter and render data
//! \param [in,out] pCompParams
//! Pointer to Composite parameters.
//! \param [in,out] pSource
//! Pointer to surface.
//! \param [in,out] pRenderingData
//! Pointer to Composite RenderData.
//! \param [out] pbColorfill
//! Pointer to color fill flag.
//! \return void
//!
virtual void CalculateRenderData(
PVPHAL_COMPOSITE_PARAMS pCompParams,
PVPHAL_SURFACE pSurface,
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
bool* pbColorfill);
//!
//! \brief Set Sampler AVS parameters
//! \param [in] pRenderingData
//! pointer to render data
//! \param [in] pSource
//! pointer to source surface
//! \param [in] pSurfaceEntry
//! pointer to source state entry
//! \param [out] pSamplerStateParams
//! pointer to Sampler state params
//! \param [in] fScaleX
//! width scaling ratio
//! \param [in] fScaleY
//! height scaling ratio
//! \return MOS_STATUS
//!
virtual MOS_STATUS SetSamplerAvsParams(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PVPHAL_SURFACE pSource,
PRENDERHAL_SURFACE_STATE_ENTRY pSurfaceEntry,
PMHW_SAMPLER_STATE_PARAM pSamplerStateParams,
float fScaleX,
float fScaleY);
//!
//! \brief set inline data
//! \param [in] pBbArgs
//! Pointer to Composite BB argument
//! \param [in] pRenderingData
//! Pointer to Composite render data
//! \param [in] pStatic
//! Pointer to static data
//! \param [in,out] pInline
//! Pointer to inline data
//! \param [in,out] pInlineNLAS
//! Pointer to NLAS inline data
//! \param [in] x
//! horizontal origin
//! \param [out] fSrcX
//! horizontal origin of layers
//! \return void
//!
virtual void ModifyInlineData(
PVPHAL_BB_COMP_ARGS pBbArgs,
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
MEDIA_OBJECT_KA2_STATIC_DATA *pStatic,
MEDIA_OBJECT_KA2_INLINE_DATA *pInline,
MEDIA_OBJECT_NLAS_INLINE_DATA *pInlineNLAS,
int32_t x,
float *fSrcX) {;}
//!
//! \brief Calculate crop factor
//! \param [in] iLayer
//! layer index
//! \param [in] pRenderingData
//! pointer to render data
//! \param [out] pfCropX
//! crop factor
//! \param [out] pfCropY
//! crop factor
//! \return MOS_STATUS
//!
virtual MOS_STATUS CalculateCropParams(
int32_t iLayer,
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
float* pfCropX,
float* pfCropY);
//!
//! \brief Calculate and set inline data size
//! \param [in] pRenderingData
//! pointer to render data
//! \param [out] pStatic
//! pointer to static data
//! \return void
//!
virtual int32_t CalculateInlineDataSize(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
MEDIA_OBJECT_KA2_STATIC_DATA *pStatic);
//!
//! \brief Calculate Media Object size
//! \param [in] pRenderingData
//! Pointer to Rendering Data
//! \return int32_t
//! Return the size of Media Object
//!
virtual int32_t CalculateMediaObjectSize(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
//!
//! \brief Modify MediaWalker Static Data
//! \param [in] pRenderingData
//! Pointer to Rendering Data
//! \return void
//!
virtual void ModifyMediaWalkerStaticData(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
//!
//! \brief Initialize Composite Rendering data
//! \details Initialize Composite Rendering data, set output area, number of blocks,
//! Sources, constriction parameters, rendering states, etc.
//! \param [in] pCompParams
//! Pointer to Composite parameters
//! \param [out] pRenderingData
//! Pointer to Composite Rendering data
//! \return MOS_STATUS
//!
virtual MOS_STATUS RenderInit(
PVPHAL_COMPOSITE_PARAMS pCompParams,
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
//!
//! \brief Release Composite Rendering data
//! \param [in] pRenderingData
//! Pointer to Composite Rendering data
//! \return MOS_STATUS
//!
virtual void CleanRenderingData(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
//!
//! \brief Fill in Gen specific static data
//! \details Fill in Gen specific static data
//! \param pRenderingData
//! [in] Pointer to REnder Data
//! \param pTarget
//! [in] Pointer to Target Surface
//! \param pStatic
//! [in,out] Pointer to Static Data
//! \return void
//!
virtual void SubmitStatesFillGenSpecificStaticData(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PVPHAL_SURFACE pTarget,
MEDIA_OBJECT_KA2_STATIC_DATA *pStatic) = 0;
//!
//! \brief Get Output Surface Chroma sitting position for kernel
//! \details Get Output Surface Chroma sitting position for kernel
//! \param pTarget
//! [in] Pointer to Target Surface
//! \return DWORD
//! Return chroma sitting position
//!
uint32_t GetOutputChromaSitting(
PVPHAL_SURFACE pTarget);
//!
//! \brief Set Surface Compressed Parameters
//! \details Set Surface Compressed Parameters, and compression mode
//! \param [in,out] pSource
//! Pointer to Source Surface
//! \param [in] isRenderTarget
//! Render Target or not
//! \return void
//!
virtual void SetSurfaceCompressionParams(
PVPHAL_SURFACE pSource,
bool isRenderTarget);
//!
//! \brief Check NV12 luma key sampler solution is needed or not
//! \details This func is needed for Gen9 platforms
//! \param pSrc
//! [in] Pointer to Source Surface
//! \param pRenderHal
//! [in] Pointer to render hal
//! \return bool
//! Return TRUE if needed, otherwise FALSE
//!
virtual bool IsNV12SamplerLumakeyNeeded(PVPHAL_SURFACE pSrc, PRENDERHAL_INTERFACE pRenderHal)
{
return false;
}
//!
//! \brief Check whether parameters for composition valid or not.
//! \param [in] CompositeParams
//! Parameters for composition
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS IsCompositeParamsValid(
const VPHAL_COMPOSITE_PARAMS& CompositeParams);
//!
//! \brief Get Sampler Index associated with a surface state for composite
//! \param [in] pSurface
//! point to input Surface
//! \param [in] pEntry
//! Pointer to Surface state
//! \param [out] pSamplerIndex
//! Pointer to Sampler Index
//! \param [out] pSamplerType
//! Pointer to Sampler Type
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise MOS_STATUS_UNKNOWN
//!
virtual MOS_STATUS GetSamplerIndex(
PVPHAL_SURFACE pSurface,
PRENDERHAL_SURFACE_STATE_ENTRY pEntry,
int32_t* pSamplerIndex,
PMHW_SAMPLER_TYPE pSamplerType);
//!
//! \brief Check whether the 3Dsampler use for Y plane
//! \param [in] SamplerID
//! sampler ID
//! \return bool
//! Return true if the 3Dsampler use for Y plane, otherwise fase
//!
virtual bool IsSamplerIDForY(
int32_t SamplerID);
//! \brief set Sampler status
//! \param [in] pSurface
//! point to input Surface
//! \param [in] Layer
//! composition layer
//! \param [in] pStatic
//! Pointer to static data
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise MOS_STATUS_UNKNOWN
//!
virtual MOS_STATUS Set3DSamplerStatus(
PVPHAL_SURFACE pSurface,
uint8_t Layer,
MEDIA_OBJECT_KA2_STATIC_DATA *pStatic)
{
// Just need the sub class to implement if it is needed;
return MOS_STATUS_SUCCESS;
}
//! \brief Update Inline Data status
//! \param [in] pSurface
//! point to input Surface
//! \param [in] pStatic
//! Pointer to static data
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise MOS_STATUS_UNKNOWN
//!
virtual MOS_STATUS UpdateInlineDataStatus(
PVPHAL_SURFACE pSurface,
MEDIA_OBJECT_KA2_STATIC_DATA *pStatic)
{
// Just need the sub class to implement if it is needed;
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Prepare phases for composite and allocate intermediate buffer for rendering
//! \param [in] pcRenderParams
//! Pointer to Render parameters
//! \param [in] ppSources
//! Pointer to the address of Source Surfaces
//! \param [in] iSources
//! Count of Source Surfaces
//! \return bool
//! Return true if multiple phases, otherwise false
//!
virtual bool PreparePhases(
PCVPHAL_RENDER_PARAMS pcRenderParams,
PVPHAL_SURFACE *ppSources,
int32_t iSources);
//!
//! \brief Reset composite rendering parameters for the current phase
//! \param [in,out] pComposite
//! Pointer to Composite parameters
//! \return void
//!
void ResetCompParams(
PVPHAL_COMPOSITE_PARAMS pComposite);
//!
//! \brief Adds a source layer for composite
//! \param [in,out] pComposite
//! Pointer to Composite parameters
//! \param [in] pSource
//! Pointer to Source Surface
//! \return bool
//! Return TURE if source may be processed in the same phase, otherwise false
//!
bool AddCompLayer(
PVPHAL_COMPOSITE_PARAMS pComposite,
PVPHAL_SURFACE pSource);
//!
//! \brief Adds render target layer for composite
//! \param [in,out] pComposite
//! Pointer to Composite parameters
//! \param [in] pTarget
//! Pointer to target surface
//! \return bool
//! Return TURE if target may be processed in the same phase, otherwise false
//!
bool AddCompTarget(
PVPHAL_COMPOSITE_PARAMS pComposite,
PVPHAL_SURFACE pTarget);
//!
//! \brief set sclaing Ratio
//! \details set sclaing Ratio for kernels which need to use different kernel to process scaling.
//! parameters
//! \param [in,out] Kdll_Scalingratio
//! Pointer to scaling ratio
//! \return void
virtual void SetFilterScalingRatio(
Kdll_Scalingratio* ScalingRatio) {}
//!
//! \brief Render Compute Walker Buffer
//! \details Render Compute Walker Buffer, fill Walker static data fields and set walker
//! cmd params
//! \param [in] pBatchBuffer
//! Pointer to BatchBuffer
//! \param [in] pRenderingData
//! Pointer to Rendering Data
//! \param [in] pWalkerParams
//! Pointer to Walker parameters
//! \return bool
//! Return true if successful, otherwise false
//!
virtual bool RenderBufferComputeWalker(
PMHW_BATCH_BUFFER pBatchBuffer,
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PMHW_GPGPU_WALKER_PARAMS pWalkerParams);
//!
//! \brief Submit Composite states
//! \details Submit Composite states, including load CSC matrix, set NLAS Inline data,
//! set background color, load Palettes, set output format, load kernel, load
//! curbe data, set sampler state, set VFE State params, and etc
//! \param [in] pRenderingData
//! Pointer to Composite state
//! \return bool
//! Return TURE if successful, otherwise false
//!
virtual bool SubmitStates(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
private:
//!
//! \brief Prepare phases for composite and determine intermediate colorspace
//! \param [in] pcRenderParams
//! Pointer to Render parameters
//! \param [in] ppSources
//! Pointer to the address of Source Surfaces
//! \param [in] iSources
//! Count of Source Surfaces
//! \return VPHAL_CSPACE
//! Return intermediate colorspace
//!
VPHAL_CSPACE PrepareCSC(
PCVPHAL_RENDER_PARAMS pcRenderParams,
PVPHAL_SURFACE *ppSources,
int32_t iSources);
//!
//! \brief Composite multiple phase rendering
//! \details Composite render with multiple phases. In some cases we cannot process composition just in one phase
//! for example, if the input streams count is 9 (1 primary + 8 substreams), we need to postpone the
//! 9th stream to next second phase due to the input count limitation of current composition kernel.
//! \param [in] pcRenderParams
//! Pointer to VPHAL_RENDER_PARAMS
//! \param [in] ppSources
//! Pointer to PVPHAL_SURFACE, array of input surfaces
//! \param [in] iSources
//! constant int iSource indicating the size of ppSources
//! \param [in] pOutput
//! Pointer to VPHAL_SURFACE, output surface for the overall composition process
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS RenderMultiPhase(
PCVPHAL_RENDER_PARAMS pcRenderParams,
PVPHAL_SURFACE *ppSources,
const int32_t iSources,
PVPHAL_SURFACE pOutput);
//!
//! \brief Perform multiple layer composite operation in one phase
//! \details Perform multiple layer composite operation in one phase(scaling, blending,
//! lumakey, CSC)
//! \param [in,out] pCompParams
//! Pointer to Composite parameters
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS RenderPhase(
PVPHAL_COMPOSITE_PARAMS pCompParams);
//!
//! \brief Set Composite Scaling mode
//! \param [in,out] pSource
//! Pointer to Source Surface
//! \param [in] uSourceCount
//! Count of Source Surfaces
//! \return void
//!
void SetScalingMode(
PVPHAL_SURFACE pSource,
uint32_t uSourceCount);
//!
//! \brief Judge whether Bob Di should be enabled
//! \details Judge whether Bob Di should be enabled according to the parameter
//! of pDeinterlaceParams and the height of the input surface
//! \param [in] pSrc
//! Pointer to Source Surface
//! \return bool
//! Return true if Bob DI should be enabled, otherwise false
//!
bool IsBobDiEnabled(PVPHAL_SURFACE pSrc);
//!
//! \brief Set Composite Layer
//! \details Set Composite Layer, including setup surface state and binding table, setup
//! lumakey parameters, setup samplers, setup alpha blending parameters, adjust
//! geometry for BOB DI, normalize source co-ordinates, set curbe and inline
//! data, and etc
//! \param [in] pRenderingData
//! Pointer to Composite Rendering data
//! \param [in] pSource
//! Pointer to Source Surface
//! \param [in] iLayerIdInCompParams
//! Layer id in pCompParams for pSource
//! \param [in,out] pCompParams
//! Pointer to Composite parameters
//! \return int32_t
//! Return 1 if set layer successful, otherwise -1
//!
int32_t SetLayer(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PVPHAL_SURFACE pSource,
int iLayerIdInCompParams,
PVPHAL_COMPOSITE_PARAMS pCompParams);
//!
//! \brief Set Composite Render Target Layer
//! \details Set Composite Render Target Layer, setup surface state and binding table
//! \param [in] pRenderingData
//! Pointer to Composite Rendering data
//! \param [in] pCompParams
//! Pointer to Composite parameters
//! \return int32_t
//! Return number of Surface State entries if successful, otherwise -1
//!
int32_t SetLayerRT(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PVPHAL_COMPOSITE_PARAMS pCompParams);
//!
//! \brief Build filter description for dynamic linking
//! \details Build filter description(render method, current layer, layer format, layer
//! rotation, layer colorspace, sampling mode, scaling mode, luma key, blending,
//! colorfill, procamp, CSC) for dynamic linking
//! parameters
//! \param [in] pCompParams
//! Pointer to Composite parameters
//! \param [out] pFilter
//! Pointer to first filter entry
//! \param [out] piFilterSize
//! Pointer to filter size
//! \return bool
//! Return true if successful, otherwise false
//!
bool BuildFilter(
PVPHAL_COMPOSITE_PARAMS pCompParams,
PKdll_FilterEntry pFilter,
int32_t* piFilterSize);
//!
//! \brief Render Composite BatchBuffer
//! \details Render Composite BatchBuffer, fill Walker static data fields and set walker
//! cmd params
//! \param [in] pBatchBuffer
//! Pointer to BatchBuffer
//! \param [in] pRenderingData
//! Pointer to Rendering Data
//! \param [in] pWalkerParams
//! Pointer to Walker parameters
//! \return bool
//! Return true if successful, otherwise false
//!
bool RenderBufferMediaWalker(
PMHW_BATCH_BUFFER pBatchBuffer,
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PMHW_WALKER_PARAMS pWalkerParams);
//!
//! \brief Judge whether media walker pattern will be vertical or not
//! \details if input layer is one , and input is linear format and rotation 90
//! or 270 is needed then the media walker pattern should be vertical
//! \param [in] pRenderingData
//! Pointer to Rendering Data
//! \return bool
//! Return true if vertical media pattern used, otherwise false
//!
bool MediaWalkerVertical(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
//!
//! \brief Set Surface Parameters
//! \details Set Surface Parameters, set flags for RT, set surface type based on scaling
//! mode, set interlacing flags, etc.
//! \param [in,out] pSource
//! Pointer to Source Surface
//! \param [out] pSurfaceParams
//! Pointer to Surface Parameters
//! \return void
//!
void SetSurfaceParams(
PVPHAL_SURFACE pSource,
PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams);
//!
//! \brief Allocate Composite BatchBuffer
//! \details Allocate Composite BatchBuffer, search from existing BBs for a match. If
//! none, allocate new BB
//! \param [in] pRenderingData
//! Pointer to Rendering Data
//! \param [out] ppBatchBuffer
//! Pointer to the addr of the available BB. Pointer to nullptr if there's no
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS AllocateBuffer(
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
PMHW_BATCH_BUFFER *ppBatchBuffer);
//!
//! \brief Render Composite BatchBuffer
//! \details Render Composite BatchBuffer, setup Media Object header and inline data
//! \param [in] pBatchBuffer
//! Pointer to BatchBuffer
//! \param [in] pRenderingData
//! Pointer to Rendering Data
//! \return bool
//! Return true if successful, otherwise false
//!
bool RenderBuffer(
PMHW_BATCH_BUFFER pBatchBuffer,
PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
//!
//! \brief Judge whether 8-tap adaptive filter for all channels should be enabled
//! \details Judge whether 8-tap adaptive filter for all channels should be enabled according to the input parameter
//! \param [in] pSrc
//! Pointer to Source Surface
//! \param [in] fScaleX
//! width scaling ratio
//! \param [in] fScaleY
//! height scaling ratio
//! \return bool
//! Return true 8-tap adaptive filter for all channels should be enabled, otherwise false
//!
bool Is8TapAdaptiveEnabled(
PVPHAL_SURFACE pSrc,
float fScaleX,
float fScaleY);
//!
//! \brief Initialize Colorfill parameters
//! \details Initialize Colorfill parameters
//! \return void
//!
void InitColorFillParams();
//!
//! \brief Check if sample unorm being used for source surface.
//! \param [in] pCompParams
//! Pointer to Composite parameters
//! \param pSrc
//! [in] Pointer to Source Surface
//! \return bool
//! Return TRUE if use sample unorm, otherwise FALSE
//!
bool IsUsingSampleUnorm(
PVPHAL_COMPOSITE_PARAMS pCompParams,
PVPHAL_SURFACE pSrc);
//!
//! \brief Check if sampler lumakey being supported or not for source surface.
//! \param pSrc
//! [in] Pointer to Source Surface
//! \return bool
//! Return TRUE if support, otherwise FALSE
//!
bool IsSamplerLumakeySupported(PVPHAL_SURFACE pSrc);
// Procamp
int32_t m_iMaxProcampEntries;
int32_t m_iProcampVersion;
Kdll_Procamp m_Procamp[VPHAL_MAX_PROCAMP];
// Cache attributes
VPHAL_COMPOSITE_CACHE_CNTL m_SurfMemObjCtl;
bool m_bNullHwRenderComp; //!< Null rendering flag for Composite function
bool m_b8TapAdaptiveEnable; //!< 8 tap adaptive filter enable flag, read from user feature key
Kdll_FilterDesc m_SearchFilter;
Kdll_SearchState m_KernelSearch;
int32_t m_ThreadCountPrimary;
// CMFC CSC Coefficient surface
VPHAL_SURFACE m_CmfcCoeff;
RENDERHAL_SURFACE m_RenderHalCmfcCoeff;
// Batch buffers
int32_t m_iBatchBufferCount;
MHW_BATCH_BUFFER m_BatchBuffer[VPHAL_COMP_BUFFERS_MAX];
VPHAL_BATCH_BUFFER_PARAMS m_BufferParam[VPHAL_COMP_BUFFERS_MAX];
// Multiple phase support
int32_t m_iCallID;
bool m_bLastPhase; //!< Flag for indicating the last Comp render phase
protected:
// Background Color fill parameters
struct
{
VPHAL_COLOR_SAMPLE_8 m_csSrc;
VPHAL_COLOR_SAMPLE_8 m_csDst;
VPHAL_CSPACE m_CSpaceSrc;
VPHAL_CSPACE m_CSpaceDst;
};
// Feature flags
float m_fSamplerLinearBiasX; //!< Linear sampler bias X
float m_fSamplerLinearBiasY; //!< Linear sampler bias Y
bool m_bFtrMediaWalker; //!< Media Object Walker enabled
bool m_bFtrComputeWalker; //!< Compute Walker enabled
bool m_bFtrCSCCoeffPatchMode; //!< Set CSC Coeff using patch mode
bool m_bSamplerSupportRotation; //!< Use sampler for Rotation
bool m_bChromaUpSampling; //!< Chroma Up Sampling needed
bool m_bChromaDownSampling; //!< Chroma Down Sampling needed
bool m_bFallbackIefPatch; //!< Fall back IEF path from AVS to SFC
bool m_bKernelSupportDualOutput; //!< Kernel support Dual Output
bool m_bKernelSupportHdcDW; //!< Kernel support HDC direct write
bool m_bApplyTwoLayersCompOptimize;//!< Apply 2 layers composition optimization
bool m_need3DSampler; //!< If AVS Sampler not avaliable on specific platform, then we need 3D sampler instead
bool m_bEnableSamplerLumakey; //!< Enable/Disable sampler lumakey feature.
bool m_bYV12iAvsScaling; //!< Interlace AVS scaling support YV12 input format
// AVS table
MHW_AVS_PARAMS m_AvsParameters;
MHW_SAMPLER_AVS_TABLE_PARAM m_mhwSamplerAvsTableParam; //!< params for AVS scaling 8x8 table
bool m_bAvsTableCoeffExtraEnabled; //!< Sampler AVS table param, bIsCoeffExtraEnabled
bool m_bAvsTableBalancedFilter; //!< Sampler AVS table param, bBalancedFilter
static const int AVS_CACHE_SIZE = 4; //!< AVS coefficients cache size
AvsCoeffsCache<AVS_CACHE_SIZE> m_AvsCoeffsCache; //!< AVS coefficients calculation is expensive, add cache to mitigate
VPHAL_SURFACE m_Intermediate; //!< Intermediate surface (multiple phase / constriction support)
VPHAL_SURFACE m_Intermediate2; //!< Rotation output intermediate surface
Kdll_State *m_pKernelDllState = nullptr; //!< Compositing Kernel DLL/Search state
RENDERHAL_KERNEL_PARAM m_KernelParams = {0};
float m_fScaleX = 1.0f;
float m_fScaleY = 1.0f;
bool m_FusedEuDispatch = false;
};
typedef CompositeState * PCComposite;
#endif // __VPHAL_RENDER_COMPOSITE_H__