blob: a1fbe30b2fe111fa3671fa607f59a56375bc8fd1 [file] [log] [blame]
/*===================== begin_copyright_notice ==================================
Copyright (c) 2017-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.
======================= end_copyright_notice ==================================*/
//!
//! \file mhw_vdbox_hcp_g12_X.h
//! \brief Defines functions for constructing Vdbox HCP commands on Gen11-based platforms
//!
#ifndef __MHW_VDBOX_HCP_G12_X_H__
#define __MHW_VDBOX_HCP_G12_X_H__
#include "mhw_vdbox_hcp_generic.h"
#include "mhw_vdbox_hcp_hwcmd_g12_X.h"
#include "mhw_vdbox_g12_X.h"
#include "media_user_settings_mgr_g12.h"
#include "codec_def_decode_hevc.h"
//definition for row store cache offset on GEN12
#define VDENCHEVC_RSC_OFFSET_C420OR422_DXX_LCU32OR64_4K_G12 1824
#define VDENCHEVC_RSC_OFFSET_C420OR422_DXX_LCU32OR64_8K_G12 2304
#define VDENCHEVC_RSC_OFFSET_C444_D8_LCU32OR64_4K_G12 1568
#define VDENCHEVC_RSC_OFFSET_C444_D8_LCU32OR64_8K_G12 2112
#define VDENCHEVC_RSC_OFFSET_C444_D10_LCU32OR64_4K_G12 2336
#define VDENCHEVC_RSC_OFFSET_C444_D10_LCU32OR64_8K_G12 1600
#define VDENCHEVC_RSC_OFFSET_C444_D12_LCU32OR64_4K_G12 2336
#define VDENCHEVC_RSC_OFFSET_C444_D12_LCU32OR64_8K_G12 1600
#define HEVCDAT_RSC_OFFSET_CXXX_DXX_LCUXX_XX_G12 0
#define HEVCDF_RSC_OFFSET_C420OR422_DXX_LCUXX_4K_G12 256
#define HEVCDF_RSC_OFFSET_C420OR422_DXX_LCU16_8K_G12 512
#define HEVCDF_RSC_OFFSET_C420OR422_DXX_LCU32OR64_8K_G12 256
#define HEVCDF_RSC_OFFSET_C444_D8_LCU16_4K_G12 256
#define HEVCDF_RSC_OFFSET_C444_D8_LCU16_8K_G12 512
#define HEVCDF_RSC_OFFSET_C444_D10_LCU16_4K_G12 256
#define HEVCDF_RSC_OFFSET_C444_D12_LCU16_4K_G12 256
#define HEVCDF_RSC_OFFSET_C444_D8_LCU32OR64_4K_G12 256
#define HEVCDF_RSC_OFFSET_C444_D8_LCU32OR64_8K_G12 512
#define HEVCDF_RSC_OFFSET_C444_D10_LCU32OR64_4K_G12 256
#define HEVCDF_RSC_OFFSET_C444_D12_LCU32OR64_4K_G12 128
#define HEVCSAO_RSC_OFFSET_C420OR422_DXX_LCUXX_4K_G12 1280
#define HEVCSAO_RSC_OFFSET_C444_D8_LCU16_4K_G12 1024
#define HEVCSAO_RSC_OFFSET_C444_D10_LCU16_4K_G12 1792
#define HEVCSAO_RSC_OFFSET_C444_D10_LCU16_8K_G12 512
#define HEVCSAO_RSC_OFFSET_C444_D12_LCU16_4K_G12 1792
#define HEVCSAO_RSC_OFFSET_C444_D12_LCU16_8K_G12 256
#define HEVCSAO_RSC_OFFSET_C444_D8_LCU32OR64_4K_G12 1024
#define HEVCSAO_RSC_OFFSET_C444_D10_LCU32OR64_4K_G12 1792
#define HEVCSAO_RSC_OFFSET_C444_D10_LCU32OR64_8K_G12 512
#define HEVCSAO_RSC_OFFSET_C444_D12_LCU32OR64_4K_G12 1664
#define HEVCSAO_RSC_OFFSET_C444_D12_LCU32OR64_8K_G12 256
#define HEVCHSAO_RSC_OFFSET_C420OR422_DXX_LCU16_4K_G12 2048
#define HEVCHSAO_RSC_OFFSET_C420OR422_DXX_LCU32OR64_4K_G12 1792
#define HEVCHSAO_RSC_OFFSET_C444_D8_LCU16_4K_G12 1792
#define HEVCHSAO_RSC_OFFSET_C444_D8_LCU16_8K_G12 2048
#define HEVCHSAO_RSC_OFFSET_C444_D10_LCU16_8K_G12 2048
#define HEVCHSAO_RSC_OFFSET_C444_D12_LCU16_8K_G12 1792
#define HEVCHSAO_RSC_OFFSET_C444_D8_LCU32OR64_4K_G12 1536
#define HEVCHSAO_RSC_OFFSET_C444_D8_LCU32OR64_8K_G12 2048
#define HEVCHSAO_RSC_OFFSET_C444_D10_LCU32OR64_4K_G12 2304
#define HEVCHSAO_RSC_OFFSET_C444_D10_LCU32OR64_8K_G12 1536
#define HEVCHSAO_RSC_OFFSET_C444_D12_LCU32OR64_4K_G12 2304
#define HEVCHSAO_RSC_OFFSET_C444_D12_LCU32OR64_8K_G12 1536
// TGL rowstore Cache Values
#define VP9DATROWSTORE_BASEADDRESS_PICWIDTH_LESS_THAN_OR_EQU_TO_2K 32
#define VP9DATROWSTORE_BASEADDRESS_128 128
#define VP9DFROWSTORE_BASEADDRESS_64 64
#define VP9DFROWSTORE_BASEADDRESS_192 192
#define MHW_HCP_WORST_CASE_LCU_CU_TU_INFO (26 * MHW_CACHELINE_SIZE) // 18+4+4
#define MHW_HCP_WORST_CASE_LCU_CU_TU_INFO_REXT (35 * MHW_CACHELINE_SIZE) // 27+4+4
#define MHW_HCP_WORST_CASE_CU_TU_INFO (4 * MHW_CACHELINE_SIZE) // 2+1+1
#define MHW_HCP_WORST_CASE_CU_TU_INFO_REXT (6 * MHW_CACHELINE_SIZE) // 4+1+1
struct HcpPakObjectG12
{
// DW0
struct
{
uint32_t DwordLength : 16;
uint32_t SubOp : 7;
uint32_t Opcode : 6;
uint32_t Type : 3;
} DW0;
//DW1
struct
{
uint32_t Split_flag_level2_level1part0 : 4;
uint32_t Split_flag_level2_level1part1 : 4;
uint32_t Split_flag_level2_level1part2 : 4;
uint32_t Split_flag_level2_level1part3 : 4;
uint32_t Split_flag_level1 : 4;
uint32_t Split_flag_level0 : 1;
uint32_t Reserved21_23 : 3;
uint32_t CU_count_minus1 : 6;
uint32_t LastCtbOfTileFlag : 1;
uint32_t LastCtbOfSliceFlag : 1;
} DW1;
//DW2
struct
{
uint32_t Current_LCU_X_Addr : 16;
uint32_t Current_LCU_Y_Addr : 16;
} DW2;
//DW3
struct
{
uint32_t Estimated_LCU_Size_In_Bytes : 32;
} DW3;
//DW4
struct
{
uint32_t SSE_ClassID_32x32_0 : 4;
uint32_t SSE_ClassID_32x32_1 : 4;
uint32_t SSE_ClassID_32x32_2 : 4;
uint32_t SSE_ClassID_32x32_3 : 4;
uint32_t LCUForceZeroCoeff : 1;
uint32_t Disable_SAO_On_LCU_Flag : 1;
uint32_t Reserve18_31 : 14;
} DW4;
uint32_t DW5;
uint32_t DW6;
uint32_t DW7;
};
// CU Record structure
struct EncodeHevcCuDataG12
{
//DWORD 0
union
{
struct
{
uint32_t DW0_L0_Mv0x : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW0_L0_Mv0y : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t DW0_LumaIntraModeSecondBest : MOS_BITFIELD_RANGE(0, 5);
uint32_t DW0_LumaIntraModeSecondBest4x4_1 : MOS_BITFIELD_RANGE(6, 11);
uint32_t DW0_LumaIntraModeSecondBest4x4_2 : MOS_BITFIELD_RANGE(12, 17);
uint32_t DW0_LumaIntraModeSecondBest4x4_3 : MOS_BITFIELD_RANGE(18, 23);
uint32_t DW0_ChromaIntraModeSecondBest_o3a_p : MOS_BITFIELD_RANGE(24, 26);
uint32_t DW0_Reserved0 : MOS_BITFIELD_RANGE(27, 31);
};
};
//DWORD 1
uint32_t DW1_L0_Mv1x : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW1_L0_Mv1y : MOS_BITFIELD_RANGE(16, 31);
//DWORD 2
uint32_t DW2_L1_Mv0x : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW2_L1_Mv0y : MOS_BITFIELD_RANGE(16, 31);
//DWORD 3
uint32_t DW3_L1_Mv1x : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW3_L1_Mv1y : MOS_BITFIELD_RANGE(16, 31);
//DWORD 4
uint32_t DW4_L0Mv0RefIdx : MOS_BITFIELD_RANGE(0, 3);
uint32_t DW4_L0Mv1RefIdx_ChromaIntraMode : MOS_BITFIELD_RANGE(4, 7);
uint32_t DW4_L1Mv0RefIdx_ChromaIntraMode2 : MOS_BITFIELD_RANGE(8, 11);
uint32_t DW4_L1Mv1RefIdx_ChromaIntraMode1 : MOS_BITFIELD_RANGE(12, 15);
uint32_t DW4_Tu_Yuv_TransformSkip : MOS_BITFIELD_RANGE(16, 31);
//DWORD 5
uint32_t DW5_TuSize : MOS_BITFIELD_RANGE(0, 31);
//DWORD 6
uint32_t DW6_LumaIntraMode4x4_1 : MOS_BITFIELD_RANGE(0, 5);
uint32_t DW6_LumaIntraMode4x4_2 : MOS_BITFIELD_RANGE(6, 11);
uint32_t DW6_LumaIntraMode4x4_3 : MOS_BITFIELD_RANGE(12, 17);
uint32_t DW6_RoundingSelect : MOS_BITFIELD_RANGE(18, 21);
uint32_t DW6_Reserved0 : MOS_BITFIELD_RANGE(22, 23);
uint32_t DW6_TuCountMinus1 : MOS_BITFIELD_RANGE(24, 27);
uint32_t DW6_Reserved1 : MOS_BITFIELD_RANGE(28, 31);
//DWORD 7
uint32_t DW7_LumaIntraMode : MOS_BITFIELD_RANGE(0, 5);
uint32_t DW7_CuSize : MOS_BITFIELD_RANGE(6, 7);
uint32_t DW7_ChromaIntraMode : MOS_BITFIELD_RANGE(8, 10);
uint32_t DW7_CuTransquantBypassFlag : MOS_BITFIELD_BIT(11);
uint32_t DW7_CuPartMode : MOS_BITFIELD_RANGE(12, 14);
uint32_t DW7_CuPredMode : MOS_BITFIELD_BIT(15);
uint32_t DW7_InterPredIdcMv0 : MOS_BITFIELD_RANGE(16, 17);
uint32_t DW7_InterPredIdcMv1 : MOS_BITFIELD_RANGE(18, 19);
uint32_t DW7_ModifiedFlag : MOS_BITFIELD_BIT(20);
uint32_t DW7_ForceZeroCoeff : MOS_BITFIELD_BIT(21);
uint32_t DW7_Reserved0 : MOS_BITFIELD_RANGE(22, 23);
uint32_t DW7_CuQp : MOS_BITFIELD_RANGE(24, 30);
uint32_t DW7_CuQpSign : MOS_BITFIELD_BIT(31);
};
struct MHW_VDBOX_HEVC_SLICE_STATE_G12 : public MHW_VDBOX_HEVC_SLICE_STATE
{
// GEN11+ Tile coding params
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 pTileCodingParams = nullptr;
uint32_t dwTileID = 0;
uint32_t dwNumPipe = 0;
// For real tile decoding across tile
bool bTileInSlice = false; //!< This slice across tiles
bool bIsNotFirstTile = false; //!< Not first tile in slice
uint16_t u16SliceHeaderLength = 0; //!< Slice header length in this entrypoint
uint16_t u16TileCtbX = 0; //!< Ctb X index for this tile
uint16_t u16TileCtbY = 0; //!< Ctb Y index for this tile
uint16_t u16NextTileCtbX = 0; //!< Ctb X index for next tile
uint16_t u16NextTileCtbY = 0; //!< Ctb Y index for next tile
uint16_t u16OrigCtbX = 0; //!< Original slice start Ctb X index
uint16_t u16OrigCtbY = 0; //!< Original slice start Ctb Y index
PCODEC_HEVC_EXT_SLICE_PARAMS pHevcExtSliceParams = nullptr;
PCODEC_HEVC_EXT_PIC_PARAMS pHevcExtPicParam = nullptr;
PCODEC_HEVC_SCC_PIC_PARAMS pHevcSccPicParam = nullptr;
// For SCC
uint8_t ucRecNotFilteredID = 0;
};
using PMHW_VDBOX_HEVC_SLICE_STATE_G12 = MHW_VDBOX_HEVC_SLICE_STATE_G12 *;
struct MHW_VDBOX_HEVC_REF_IDX_PARAMS_G12 : public MHW_VDBOX_HEVC_REF_IDX_PARAMS
{
// For SCC
bool bIBCEnabled = false;;
uint8_t ucRecNotFilteredID = 0;;
};
using PMHW_VDBOX_HEVC_REF_IDX_PARAMS_G12 = MHW_VDBOX_HEVC_REF_IDX_PARAMS_G12 *;
struct MHW_VDBOX_HEVC_PIC_STATE_G12 : public MHW_VDBOX_HEVC_PIC_STATE
{
PCODEC_HEVC_EXT_PIC_PARAMS pHevcExtPicParams = nullptr;
PCODEC_HEVC_SCC_PIC_PARAMS pHevcSccPicParams = nullptr;
// For SCC
uint8_t ucRecNotFilteredID = 0;
uint8_t IBCControl = 0;
bool PartialFrameUpdateEnable = false;
};
using PMHW_VDBOX_HEVC_PIC_STATE_G12 = MHW_VDBOX_HEVC_PIC_STATE_G12 *;
struct MHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12 : public MHW_VDBOX_PIPE_BUF_ADDR_PARAMS
{
//Scalable
PMOS_RESOURCE presSliceStateStreamOutBuffer = nullptr;
PMOS_RESOURCE presMvUpRightColStoreBuffer = nullptr;
PMOS_RESOURCE presIntraPredUpRightColStoreBuffer = nullptr;
PMOS_RESOURCE presIntraPredLeftReconColStoreBuffer = nullptr;
PMOS_RESOURCE presCABACSyntaxStreamOutBuffer = nullptr;
PMOS_RESOURCE presCABACSyntaxStreamOutMaxAddr = nullptr;
//Reference Mmc
bool bSpecificReferencedMmcRequired = false;
MOS_MEMCOMP_STATE ReferencesMmcState = MOS_MEMCOMP_DISABLED;
};
using PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12 = MHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12 *;
// the tile size record is streamed out serving 2 purposes
// in vp9 for back annotation of tile size into the bitstream
struct HCPPakHWTileSizeRecord_G12
{
//DW0
uint32_t
Address_31_0;
//DW1
uint32_t
Address_63_32;
//DW2
uint32_t
Length; // Bitstream length per tile; includes header len in first tile, and tail len in last tile
//DW3
uint32_t
TileSize; // In Vp9, it is used for back annotation, In Hevc, it is the mmio register bytecountNoHeader
//DW4
uint32_t
AddressOffset; // Cacheline offset
//DW5
uint32_t
ByteOffset : 6, //[5:0] // Byte offset within cacheline
Res_95_70 : 26; //[31:6]
//DW6
uint32_t
Hcp_Bs_SE_Bitcount_Tile; // bitstream size for syntax element per tile
//DW7
uint32_t
Hcp_Cabac_BinCnt_Tile; // bitstream size for syntax element per tile
//DW8
uint32_t
Res_DW8_31_0;
//DW9
uint32_t
Hcp_Image_Status_Ctrl; // image status control per tile
//DW10
uint32_t
Hcp_Qp_Status_Count; // Qp status count per tile
//DW11
uint32_t
Hcp_Slice_Count_Tile; // number of slices per tile
//DW12-15
uint32_t
Res_DW12_DW15[4]; // reserved bits added so that QwordDisables are set correctly
};
//! MHW Vdbox Hcp interface for Gen11
/*!
This class defines the Hcp command construction functions for Gen11 platform
*/
class MhwVdboxHcpInterfaceG12 : public MhwVdboxHcpInterfaceGeneric<mhw_vdbox_hcp_g12_X>
{
protected:
#define PATCH_LIST_COMMAND(x) (x##_NUMBER_OF_ADDRESSES)
enum CommandsNumberOfAddresses
{
MI_BATCH_BUFFER_START_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MI_STORE_DATA_IMM_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MI_FLUSH_DW_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MI_CONDITIONAL_BATCH_BUFFER_END_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MI_STORE_REGISTER_MEM_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MI_COPY_MEM_MEM_CMD_NUMBER_OF_ADDRESSES = 4, // 4 DW for 2 address fields
MI_SEMAPHORE_WAIT_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address fields
MI_ATOMIC_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MFX_WAIT_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_PIPE_MODE_SELECT_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_SURFACE_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_PIPE_BUF_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES = 45, // 45 address fields
HCP_IND_OBJ_BASE_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES = 11, // 22 DW for 11 address field
HCP_QM_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_FQM_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_PIC_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_REF_IDX_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_WEIGHTOFFSET_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_SLICE_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_PAK_INSERT_OBJECT_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_TILE_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_BSD_OBJECT_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_VP9_SEGMENT_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_VP9_PIC_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
HCP_TILE_CODING_COMMAND_NUMBER_OF_ADDRESSES = 1, // 0 DW for address fields
HCP_PALETTE_INITIALIZER_STATE_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for address fields
VDENC_PIPE_BUF_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES = 12, // 12 DW for 12 address fields
VD_PIPELINE_FLUSH_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for 0 address fields
};
enum HcpPicStateIbcConfigurationInVdencMode
{
HCP_PIC_STATE_IBC_CONFIGURATION_IN_VDENC_MODE_UNNAMED0 = 0, ///< When IBC configuration in VDENC mode is set to 0, Intra block search is disabled.
HCP_PIC_STATE_IBC_CONFIGURATION_IN_VDENC_MODE_UNNAMED1 = 1, ///< When IBC configuration in VDENC mode is set to 1, Intra block search includes only left region.
HCP_PIC_STATE_IBC_CONFIGURATION_IN_VDENC_MODE_UNNAMED2 = 2, ///<
HCP_PIC_STATE_IBC_CONFIGURATION_IN_VDENC_MODE_UNNAMED3 = 3, ///< When IBC configuration in VDENC mode is set to 2, Intra block search includes top and left regions.
};
bool m_hevcRDOQPerfDisabled = false; //!< Flag to indicate if HEVC RDOQ Perf is disabled
uint32_t m_watchDogTimerThreshold = 0; //!< For Watch Dog Timer threshold on Gen11+
bool m_disableTlbPrefetch = false; //!< To disable TLB pre-fetch or not
static const uint32_t m_HevcSccPaletteSize = 96; //!< For HEVC SCC palette size on Gen12+
static const uint32_t m_hcpPakObjSize = MOS_BYTES_TO_DWORDS(sizeof(HcpPakObjectG12)); //!< hcp pak object size
static const uint32_t m_veboxRgbHistogramSizePerSlice = 256 * 4;
static const uint32_t m_veboxNumRgbChannel = 3;
static const uint32_t m_veboxAceHistogramSizePerFramePerSlice = 256 * 4;
static const uint32_t m_veboxNumFramePreviousCurrent = 2;
static const uint32_t m_veboxMaxSlices = 4;
static const uint32_t m_veboxRgbHistogramSize = m_veboxRgbHistogramSizePerSlice * m_veboxNumRgbChannel * m_veboxMaxSlices;
static const uint32_t m_veboxRgbAceHistogramSizeReserved = 3072 * 4;
static const uint32_t m_veboxLaceHistogram256BinPerBlock = 256 * 2;
static const uint32_t m_veboxStatisticsSize = 32 * 8;
public:
static const uint32_t m_watchDogEnableCounter = 0x0;
static const uint32_t m_watchDogDisableCounter = 0x00000001;
static const uint32_t m_watchDogTimeoutInMs = 120; // derived from WDT threshold in KMD
//!
//! \brief Constructor
//!
MhwVdboxHcpInterfaceG12(
PMOS_INTERFACE osInterface,
MhwMiInterface *miInterface,
MhwCpInterface *cpInterface,
bool decodeInUse)
: MhwVdboxHcpInterfaceGeneric(osInterface, miInterface, cpInterface, decodeInUse)
{
MHW_FUNCTION_ENTER;
m_rhoDomainStatsEnabled = true;
// Debug hook for HEVC RDOQ issue on Gen11
MOS_USER_FEATURE_VALUE_DATA userFeatureData;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_HEVC_ENCODE_RDOQ_PERF_DISABLE_ID,
&userFeatureData,
this->m_osInterface->pOsContext);
#endif // _DEBUG || _RELEASE_INTERNAL
m_hevcRDOQPerfDisabled = userFeatureData.i32Data ? true : false;
m_watchDogTimerThreshold = m_watchDogTimeoutInMs;
#if (_DEBUG || _RELEASE_INTERNAL)
// User feature config of watchdog timer threshold
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_WATCHDOG_TIMER_THRESHOLD,
&userFeatureData,
this->m_osInterface->pOsContext);
if (userFeatureData.u32Data != 0)
{
m_watchDogTimerThreshold = userFeatureData.u32Data;
}
#endif
if (MEDIA_IS_WA(m_osInterface->pfnGetWaTable(m_osInterface), Wa_14012254246))
{
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_DISABLE_TLB_PREFETCH_ID,
&userFeatureData,
this->m_osInterface->pOsContext);
m_disableTlbPrefetch = userFeatureData.u32Data ? true : false;
}
m_hevcEncCuRecordSize = sizeof(EncodeHevcCuDataG12);
m_pakHWTileSizeRecordSize = sizeof(HCPPakHWTileSizeRecord_G12);
InitRowstoreUserFeatureSettings();
InitMmioRegisters();
}
//!
//! \brief Destructor
//!
virtual ~MhwVdboxHcpInterfaceG12() { MHW_FUNCTION_ENTER; }
uint32_t GetHcpPakObjSize()
{
return m_hcpPakObjSize;
}
inline uint32_t GetHcpHevcVp9RdoqStateCommandSize()
{
return mhw_vdbox_hcp_g12_X::HEVC_VP9_RDOQ_STATE_CMD::byteSize;
}
inline uint32_t GetHcpVp9PicStateCommandSize()
{
return mhw_vdbox_hcp_g12_X::HCP_VP9_PIC_STATE_CMD::byteSize;
}
inline uint32_t GetHcpVp9SegmentStateCommandSize()
{
return mhw_vdbox_hcp_g12_X::HCP_VP9_SEGMENT_STATE_CMD::byteSize;
}
inline uint32_t GetWatchDogTimerThrehold()
{
return m_watchDogTimerThreshold;
}
void InitMmioRegisters();
void InitRowstoreUserFeatureSettings();
MOS_STATUS GetRowstoreCachingAddrs(
PMHW_VDBOX_ROWSTORE_PARAMS rowstoreParams);
MOS_STATUS GetHcpStateCommandSize(
uint32_t mode,
uint32_t *commandsSize,
uint32_t *patchListSize,
PMHW_VDBOX_STATE_CMDSIZE_PARAMS params);
MOS_STATUS GetHcpPrimitiveCommandSize(
uint32_t mode,
uint32_t *commandsSize,
uint32_t *patchListSize,
bool modeSpecific);
MOS_STATUS GetHevcBufferSize(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS hcpBufSizeParam);
MOS_STATUS GetVp9BufferSize(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS hcpBufSizeParam);
MOS_STATUS IsHevcBufferReallocNeeded(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam);
MOS_STATUS IsVp9BufferReallocNeeded(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam);
MOS_STATUS AddHcpPipeModeSelectCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS params);
MOS_STATUS AddHcpDecodeSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params);
MOS_STATUS AddHcpEncodeSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params);
MOS_STATUS AddHcpPipeBufAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS params);
MOS_STATUS AddHcpIndObjBaseAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS params);
MOS_STATUS AddHcpDecodePicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params);
MOS_STATUS AddHcpEncodePicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params);
MOS_STATUS AddHcpTileStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_TILE_STATE params);
MOS_STATUS AddHcpRefIdxStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_REF_IDX_PARAMS params);
MOS_STATUS AddHcpWeightOffsetStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS params);
MOS_STATUS AddHcpFqmStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_QM_PARAMS params);
MOS_STATUS AddHcpDecodeSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState);
MOS_STATUS AddHcpEncodeSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState);
MOS_STATUS AddHcpPakInsertObject(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PAK_INSERT_PARAMS params);
MOS_STATUS AddHcpVp9PicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_PIC_STATE params);
MOS_STATUS AddHcpVp9PicStateEncCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_ENCODE_PIC_STATE params);
MOS_STATUS AddHcpVp9SegmentStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_SEGMENT_STATE params);
MOS_STATUS AddHcpHevcVp9RdoqStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params);
//!
//! \brief Adds HCP tile coding command in command buffer for decoder
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpDecodeTileCodingCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 params);
//!
//! \brief Adds HCP tile coding command in command buffer for encoder
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpEncodeTileCodingCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 params);
MOS_STATUS AddHcpHevcPicBrcBuffer(
PMOS_RESOURCE hcpImgStates,
PMHW_VDBOX_HEVC_PIC_STATE hevcPicState);
//!
//! \brief Adds HCP tile coding command in command buffer
//! \details Client facing function to add HCP tile coding command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpTileCodingCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 params);
//!
//! \brief Adds Hcp palette initializer state in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpPaletteInitializerStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODEC_HEVC_SCC_PIC_PARAMS params);
MOS_STATUS GetOsResLaceOrAceOrRgbHistogramBufferSize(
uint32_t width,
uint32_t height,
uint32_t *size);
MOS_STATUS GetOsResStatisticsOutputBufferSize(
uint32_t width,
uint32_t height,
uint32_t *size);
};
#endif