blob: c148af2c9422886281bfb9337e3da813389ebbc5 [file] [log] [blame]
/*
* 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.
*/
//!
//! \file codechal_hw_g12_X.cpp
//! \brief Implements HW interface layer for Gen12+ used on all OSs.
//! \details Implements HW interface layer for CNL+ to be used on on all operating systems/DDIs, across CODECHAL components.
//! This module must not contain any OS dependent code.
//!
#include "codechal_hw_g12_X.h"
#include "mhw_render_g12_X.h"
#include "mhw_mi_hwcmd_g12_X.h"
#include "mhw_vdbox_hcp_hwcmd_g12_X.h" // temporary include for calculating size of various hardware commands
#include "mhw_vdbox_mfx_hwcmd_g11_X.h"
#include "mhw_vdbox_vdenc_g12_X.h"
#include "mhw_vdbox_hcp_g12_X.h"
#include "media_interfaces_g12_tgllp.h"
// Currently initialized with dummy values, just as an example. Will be updated later.
const CODECHAL_SSEU_SETTING CodechalHwInterfaceG12::m_defaultSsEuLutG12[CODECHAL_NUM_MEDIA_STATES] =
{
// Slice Sub-Slice EU Rsvd(freq)
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_OLP
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_NORMAL
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_PERFORMANCE
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_QUALITY
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_I_FRAME_DIST
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_32X_SCALING
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_16X_SCALING
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_4X_SCALING
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_32X_ME
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_16X_ME
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_4X_ME
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_BRC_INIT_RESET
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_BRC_UPDATE
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_BRC_BLOCK_COPY
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_HYBRID_PAK_P1
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_HYBRID_PAK_P2
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_I_FRAME_CHROMA
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_I_FRAME_LUMA
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_MPU_FHB
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_TPU_FHB
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_PA_COPY
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_PL2_COPY
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_ADV
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_2X_SCALING
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_32x32_PU_MODE_DECISION
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_16x16_PU_SAD
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_16x16_PU_MODE_DECISION
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_8x8_PU
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_8x8_PU_FMODE
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_32x32_B_INTRA_CHECK
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_HEVC_B_MBENC
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_RESET_VLINE_STRIDE
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_HEVC_B_PAK
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_HEVC_BRC_LCU_UPDATE
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ME_VDENC_STREAMIN
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_ENC_I_32x32
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_ENC_I_16x16
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_ENC_P
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_ENC_TX
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_LUMA_RECON
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_CHROMA_RECON
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_DEBLOCK_MASK
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_LUMA_DEBLOCK
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_CHROMA_DEBLOCK
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_MC_PRED
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_P_FRAME_LUMA_RECON
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_P_FRAME_CHROMA_RECON
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_P_FRAME_INTRA_LUMA_RECON
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_VP9_PAK_P_FRAME_INTRA_CHROMA_RECON
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_PREPROC
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_ENC_WP
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_HEVC_I_MBENC
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_CSC_DS_COPY
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_2X_4X_SCALING
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_HEVC_LCU64_B_MBENC
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_MB_BRC_UPDATE
{ 1, 0, 8, 0 }, // CODECHAL_MEDIA_STATE_STATIC_FRAME_DETECTION
{ 1, 0, 8, 0 } // CODECHAL_MEDIA_STATE_SW_SCOREBOARD_INIT
};
CodechalHwInterfaceG12::CodechalHwInterfaceG12(
PMOS_INTERFACE osInterface,
CODECHAL_FUNCTION codecFunction,
MhwInterfaces *mhwInterfaces)
: CodechalHwInterface(osInterface, codecFunction, mhwInterfaces)
{
CODECHAL_HW_FUNCTION_ENTER;
PLATFORM platform;
osInterface->pfnGetPlatform(osInterface, &platform);
InitCacheabilityControlSettings(codecFunction);
m_isVdencSuperSliceEnabled = true;
m_ssEuTable = m_defaultSsEuLutG12;
// Set platform dependent parameters
m_sizeOfCmdBatchBufferEnd = mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
m_sizeOfCmdMediaReset = mhw_mi_g12_X::MI_LOAD_REGISTER_IMM_CMD::byteSize * 8;
m_vdencBrcImgStateBufferSize = mhw_vdbox_vdenc_g12_X::VDENC_IMG_STATE_CMD::byteSize + mhw_vdbox_mfx_g12_X::MFX_AVC_IMG_STATE_CMD::byteSize +
mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;;
m_vdencBatchBuffer1stGroupSize = mhw_vdbox_hcp_g12_X::HCP_PIPE_MODE_SELECT_CMD::byteSize
+ mhw_mi_g12_X::MFX_WAIT_CMD::byteSize * 2
+ mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
m_vdencBatchBuffer2ndGroupSize = 124
+ mhw_vdbox_hcp_g12_X::HCP_PIC_STATE_CMD::byteSize
+ 204
+ mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
m_vdencReadBatchBufferSize =
m_vdenc2ndLevelBatchBufferSize = m_vdencBatchBuffer1stGroupSize
+ m_vdencBatchBuffer2ndGroupSize
+ ENCODE_HEVC_VDENC_NUM_MAX_SLICES
* (2 * mhw_vdbox_hcp_g12_X::HCP_WEIGHTOFFSET_STATE_CMD::byteSize
+ mhw_vdbox_hcp_g12_X::HCP_SLICE_STATE_CMD::byteSize
+ 3 * mhw_vdbox_hcp_g12_X::HCP_PAK_INSERT_OBJECT_CMD::byteSize
+ mhw_vdbox_vdenc_g12_X::VDENC_WEIGHTSOFFSETS_STATE_CMD::byteSize
+ mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize
+ 4 * ENCODE_VDENC_HEVC_PADDING_DW_SIZE);
m_HucStitchCmdBatchBufferSize = 7 * 4
+ 14 * 4
+ mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
// HCP_WEIGHTOFFSET_STATE_CMD cmds is planned to be added in near future
m_vdencBatchBufferPerSliceConstSize = mhw_vdbox_hcp_g12_X::HCP_SLICE_STATE_CMD::byteSize
+ mhw_vdbox_hcp_g12_X::HCP_PAK_INSERT_OBJECT_CMD::byteSize // 1st PakInsertObject cmd is not always inserted for each slice, 2nd PakInsertObject cmd is always inserted for each slice
+ mhw_vdbox_vdenc_g12_X::VDENC_WEIGHTSOFFSETS_STATE_CMD::byteSize
+ mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
// Set to size of the BRC update command buffer, since it is larger than BRC Init/ PAK integration commands
m_hucCommandBufferSize = mhw_vdbox_huc_g12_X::HUC_IMEM_STATE_CMD::byteSize
+ mhw_vdbox_huc_g12_X::HUC_PIPE_MODE_SELECT_CMD::byteSize
+ mhw_mi_g12_X::MFX_WAIT_CMD::byteSize * 3
+ mhw_vdbox_huc_g12_X::HUC_DMEM_STATE_CMD::byteSize
+ mhw_vdbox_huc_g12_X::HUC_VIRTUAL_ADDR_STATE_CMD::byteSize
+ mhw_vdbox_huc_g12_X::HUC_STREAM_OBJECT_CMD::byteSize
+ mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize
+ mhw_mi_g12_X::MI_STORE_REGISTER_MEM_CMD::byteSize
+ mhw_vdbox_huc_g12_X::HUC_START_CMD::byteSize
+ mhw_vdbox_vdenc_g12_X::VD_PIPELINE_FLUSH_CMD::byteSize
+ mhw_mi_g12_X::MI_FLUSH_DW_CMD::byteSize
+ mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize * 2
+ mhw_mi_g12_X::MI_STORE_REGISTER_MEM_CMD::byteSize * 2
+ mhw_mi_g12_X::MI_BATCH_BUFFER_END_CMD::byteSize;
m_maxKernelLoadCmdSize =
mhw_mi_g12_X::PIPE_CONTROL_CMD::byteSize +
mhw_render_g12_X::PIPELINE_SELECT_CMD::byteSize +
mhw_render_g12_X::MEDIA_OBJECT_CMD::byteSize +
mhw_render_g12_X::STATE_BASE_ADDRESS_CMD::byteSize +
mhw_render_g12_X::MEDIA_VFE_STATE_CMD::byteSize +
mhw_render_g12_X::MEDIA_CURBE_LOAD_CMD::byteSize +
mhw_render_g12_X::MEDIA_INTERFACE_DESCRIPTOR_LOAD_CMD::byteSize +
mhw_mi_g12_X::MI_BATCH_BUFFER_START_CMD::byteSize +
mhw_render_g12_X::MEDIA_OBJECT_WALKER_CMD::byteSize +
mhw_mi_g12_X::MI_STORE_DATA_IMM_CMD::byteSize;
m_sizeOfCmdMediaObject = mhw_render_g12_X::MEDIA_OBJECT_CMD::byteSize;
m_sizeOfCmdMediaStateFlush = mhw_mi_g12_X::MEDIA_STATE_FLUSH_CMD::byteSize;
}
MOS_STATUS CodechalHwInterfaceG12::InitL3CacheSettings()
{
// Get default L3 cache settings
CODECHAL_HW_CHK_STATUS_RETURN(m_renderInterface->EnableL3Caching(nullptr));
#if (_DEBUG || _RELEASE_INTERNAL)
// Override default L3 cache settings
auto l3CacheConfig =
m_renderInterface->GetL3CacheConfig();
MHW_RENDER_ENGINE_L3_CACHE_SETTINGS_G12 l3Overrides;
l3Overrides.dwTcCntlReg =
static_cast<MHW_RENDER_ENGINE_L3_CACHE_CONFIG_G12*>(l3CacheConfig)->dwL3CacheTcCntlReg_Setting;
l3Overrides.dwAllocReg =
static_cast<MHW_RENDER_ENGINE_L3_CACHE_CONFIG_G12*>(l3CacheConfig)->dwL3CacheAllocReg_Setting;
CODECHAL_HW_CHK_STATUS_RETURN(InitL3ControlUserFeatureSettings(
l3CacheConfig,
&l3Overrides));
CODECHAL_HW_CHK_STATUS_RETURN(m_renderInterface->EnableL3Caching(
&l3Overrides));
#endif // (_DEBUG || _RELEASE_INTERNAL)
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalHwInterfaceG12::GetStreamoutCommandSize(
uint32_t *commandsSize,
uint32_t *patchListSize)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_HW_FUNCTION_ENTER;
MHW_VDBOX_STATE_CMDSIZE_PARAMS_G12 stateCmdSizeParams;
stateCmdSizeParams.bShortFormat = false;
stateCmdSizeParams.bHucDummyStream = MEDIA_IS_WA(m_waTable, WaHucStreamoutEnable);
CODECHAL_HW_CHK_STATUS_RETURN(GetHxxStateCommandSize(
CODECHAL_DECODE_MODE_CENC, // For CENC phase
commandsSize,
patchListSize,
&stateCmdSizeParams));
return eStatus;
}
MOS_STATUS CodechalHwInterfaceG12::SetCacheabilitySettings(
MHW_MEMORY_OBJECT_CONTROL_PARAMS cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_END_CODEC])
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_HW_FUNCTION_ENTER;
if (m_mfxInterface)
{
CODECHAL_HW_CHK_STATUS_RETURN(m_mfxInterface->SetCacheabilitySettings(cacheabilitySettings));
}
if (m_hcpInterface)
{
CODECHAL_HW_CHK_STATUS_RETURN(m_hcpInterface->SetCacheabilitySettings(cacheabilitySettings));
}
if (m_vdencInterface)
{
CODECHAL_HW_CHK_STATUS_RETURN(m_vdencInterface->SetCacheabilitySettings(cacheabilitySettings));
}
return eStatus;
}
MOS_STATUS CodechalHwInterfaceG12::SendCondBbEndCmd(
PMOS_RESOURCE resource,
uint32_t offset,
uint32_t compData,
bool disableCompMask,
bool enableEndCurrentBatchBuffLevel,
uint32_t compareOperation,
PMOS_COMMAND_BUFFER cmdBuffer)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_HW_FUNCTION_ENTER;
if (!Mos_ResourceIsNull(&m_conditionalBbEndDummy))
{
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
flushDwParams.postSyncOperation = 1;
flushDwParams.pOsResource = &m_conditionalBbEndDummy;
flushDwParams.dwDataDW1 = 0;
CODECHAL_HW_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(cmdBuffer, &flushDwParams));
}
MHW_MI_ENHANCED_CONDITIONAL_BATCH_BUFFER_END_PARAMS conditionalBatchBufferEndParams;
MOS_ZeroMemory(&conditionalBatchBufferEndParams, sizeof(conditionalBatchBufferEndParams));
conditionalBatchBufferEndParams.presSemaphoreBuffer = resource;
conditionalBatchBufferEndParams.dwOffset = offset;
conditionalBatchBufferEndParams.dwValue = compData;
conditionalBatchBufferEndParams.bDisableCompareMask = disableCompMask;
conditionalBatchBufferEndParams.dwParamsType = MHW_MI_ENHANCED_CONDITIONAL_BATCH_BUFFER_END_PARAMS::ENHANCED_PARAMS;
if (enableEndCurrentBatchBuffLevel)
{
conditionalBatchBufferEndParams.enableEndCurrentBatchBuffLevel = enableEndCurrentBatchBuffLevel;
conditionalBatchBufferEndParams.compareOperation = compareOperation;
}
eStatus = m_miInterface->AddMiConditionalBatchBufferEndCmd(cmdBuffer, &conditionalBatchBufferEndParams);
return eStatus;
}