blob: 4bbab306f062c6947df784dc16d47e1075393ed1 [file] [log] [blame]
/*
* Copyright (c) 2019-2022, 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 decode_hevc_picture_packet_m12.cpp
//! \brief Defines the interface for hevc decode picture packet
//!
#include "codechal_utilities.h"
#include "decode_hevc_picture_packet_xe_m_base.h"
#include "decode_hevc_picture_packet_m12.h"
#include "decode_hevc_mem_compression_m12.h"
#include "mhw_mi_g12_X.h"
#include "mhw_vdbox_g12_X.h"
#include "mhw_vdbox_hcp_g12_X.h"
#include "codechal_hw_g12_X.h"
#include "decode_common_feature_defs.h"
namespace decode
{
HevcDecodePicPktM12::~HevcDecodePicPktM12()
{
}
MOS_STATUS HevcDecodePicPktM12::Init()
{
DECODE_FUNC_CALL();
DECODE_CHK_STATUS(HevcDecodePicPktXe_M_Base::Init());
return MOS_STATUS_SUCCESS;
}
MOS_STATUS HevcDecodePicPktM12::Execute(MOS_COMMAND_BUFFER& cmdBuffer)
{
// Send VD_CONTROL_STATE Pipe Initialization
DECODE_CHK_STATUS(VdInit(cmdBuffer));
DECODE_CHK_STATUS(AddHcpPipeModeSelectCmd(cmdBuffer));
if (IsRealTilePhase() || IsBackEndPhase())
{
VdScalabPipeLock(cmdBuffer);
}
#ifdef _DECODE_PROCESSING_SUPPORTED
if (m_downSamplingFeature != nullptr && m_downSamplingPkt != nullptr &&
m_downSamplingFeature->IsEnabled())
{
if (!IsFrontEndPhase())
{
DECODE_CHK_STATUS(m_downSamplingPkt->Execute(cmdBuffer));
}
}
#endif
MHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12 pipeBufAddrParams;
DECODE_CHK_STATUS(SetHcpPipeBufAddrParams(pipeBufAddrParams));
DECODE_CHK_STATUS(AddHcpSurfaces(cmdBuffer, pipeBufAddrParams));
DECODE_CHK_STATUS(AddHcpPipeBufAddrCmd(cmdBuffer, pipeBufAddrParams));
DECODE_CHK_STATUS(AddHcpIndObjBaseAddrCmd(cmdBuffer));
DECODE_CHK_STATUS(AddHcpQmStateCmd(cmdBuffer));
DECODE_CHK_STATUS(AddHcpPicStateCmd(cmdBuffer));
if (m_hevcPicParams->tiles_enabled_flag == 1)
{
DECODE_CHK_STATUS(AddHcpTileStateCmd(cmdBuffer));
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS HevcDecodePicPktM12::VdInit(MOS_COMMAND_BUFFER &cmdBuffer)
{
MHW_MI_VD_CONTROL_STATE_PARAMS vdCtrlParam;
MOS_ZeroMemory(&vdCtrlParam, sizeof(MHW_MI_VD_CONTROL_STATE_PARAMS));
vdCtrlParam.initialization = true;
MhwMiInterfaceG12* miInterfaceG12 = dynamic_cast<MhwMiInterfaceG12*>(m_miInterface);
DECODE_CHK_NULL(miInterfaceG12);
DECODE_CHK_STATUS(miInterfaceG12->AddMiVdControlStateCmd(&cmdBuffer, &vdCtrlParam));
return MOS_STATUS_SUCCESS;
}
MOS_STATUS HevcDecodePicPktM12::VdScalabPipeLock(MOS_COMMAND_BUFFER &cmdBuffer)
{
MHW_MI_VD_CONTROL_STATE_PARAMS vdCtrlParam;
MOS_ZeroMemory(&vdCtrlParam, sizeof(MHW_MI_VD_CONTROL_STATE_PARAMS));
vdCtrlParam.scalableModePipeLock = true;
MhwMiInterfaceG12* miInterfaceG12 = dynamic_cast<MhwMiInterfaceG12*>(m_miInterface);
DECODE_CHK_NULL(miInterfaceG12);
DECODE_CHK_STATUS(miInterfaceG12->AddMiVdControlStateCmd(&cmdBuffer, &vdCtrlParam));
return MOS_STATUS_SUCCESS;
}
void HevcDecodePicPktM12::SetHcpPipeModeSelectParams(
MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& pipeModeSelectParamsBase)
{
DECODE_FUNC_CALL();
HevcDecodePicPktXe_M_Base::SetHcpPipeModeSelectParams(pipeModeSelectParamsBase);
MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12 &pipeModeSelectParams =
static_cast<MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12&>(pipeModeSelectParamsBase);
uint32_t pipeWorkMode = MHW_VDBOX_HCP_PIPE_WORK_MODE_LEGACY;
uint32_t multiEngineMode = MHW_VDBOX_HCP_MULTI_ENGINE_MODE_FE_LEGACY;
if (m_phase != nullptr)
{
m_phase->GetMode(pipeWorkMode, multiEngineMode);
}
pipeModeSelectParams.PipeWorkMode = static_cast<MHW_VDBOX_HCP_PIPE_WORK_MODE>(pipeWorkMode);
pipeModeSelectParams.MultiEngineMode = static_cast<MHW_VDBOX_HCP_MULTI_ENGINE_MODE>(multiEngineMode);
auto decodeMode = m_hevcPipeline->GetDecodeMode();
if (decodeMode == HevcPipeline::realTileDecodeMode)
{
if (m_hevcPipeline->IsFirstPass())
{
pipeModeSelectParams.ucPhaseIndicator = MHW_VDBOX_HCP_RT_FIRST_PHASE;
}
else if (m_hevcPipeline->IsLastPass())
{
pipeModeSelectParams.ucPhaseIndicator = MHW_VDBOX_HCP_RT_LAST_PHASE;
}
else
{
pipeModeSelectParams.ucPhaseIndicator = MHW_VDBOX_HCP_RT_MIDDLE_PHASE;
}
}
pipeModeSelectParams.bHEVCSeparateTileProgramming =
(m_hevcPipeline->GetDecodeMode() == HevcPipeline::separateTileDecodeMode);
}
MOS_STATUS HevcDecodePicPktM12::AddHcpPipeModeSelectCmd(MOS_COMMAND_BUFFER &cmdBuffer)
{
DECODE_FUNC_CALL();
MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12 pipeModeSelectParams;
SetHcpPipeModeSelectParams(pipeModeSelectParams);
DECODE_CHK_STATUS(m_hcpInterface->AddHcpPipeModeSelectCmd(&cmdBuffer, &pipeModeSelectParams));
return MOS_STATUS_SUCCESS;
}
MOS_STATUS HevcDecodePicPktM12::SetHcpPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS &pipeBufAddrParamsBase)
{
DECODE_FUNC_CALL();
DECODE_CHK_STATUS(HevcDecodePicPktXe_M_Base::SetHcpPipeBufAddrParams(pipeBufAddrParamsBase));
#ifdef _MMC_SUPPORTED
HevcDecodeMemCompM12 *hevcDecodeMemComp = dynamic_cast<HevcDecodeMemCompM12 *>(m_mmcState);
DECODE_CHK_NULL(hevcDecodeMemComp);
DECODE_CHK_STATUS(hevcDecodeMemComp->CheckReferenceList(*m_hevcBasicFeature, pipeBufAddrParamsBase.PostDeblockSurfMmcState,
pipeBufAddrParamsBase.PreDeblockSurfMmcState, pipeBufAddrParamsBase.presReferences));
#endif
MHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12 &pipeBufAddrParams =
static_cast<MHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12&>(pipeBufAddrParamsBase);
auto decodeMode = m_hevcPipeline->GetDecodeMode();
if (decodeMode == HevcPipeline::virtualTileDecodeMode ||
decodeMode == HevcPipeline::realTileDecodeMode)
{
pipeBufAddrParams.presSliceStateStreamOutBuffer = &(m_resSliceStateStreamOutBuffer->OsResource);
pipeBufAddrParams.presMvUpRightColStoreBuffer = &(m_resMvUpRightColStoreBuffer->OsResource);
pipeBufAddrParams.presIntraPredUpRightColStoreBuffer = &(m_resIntraPredUpRightColStoreBuffer->OsResource);
pipeBufAddrParams.presIntraPredLeftReconColStoreBuffer = &(m_resIntraPredLeftReconColStoreBuffer->OsResource);
pipeBufAddrParams.presCABACSyntaxStreamOutBuffer = &(m_resCABACSyntaxStreamOutBuffer->OsResource);
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS HevcDecodePicPktM12::AddHcpPipeBufAddrCmd(
MOS_COMMAND_BUFFER &cmdBuffer, MHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12 &pipeBufAddrParams)
{
DECODE_FUNC_CALL();
DECODE_CHK_STATUS(m_hcpInterface->AddHcpPipeBufAddrCmd(&cmdBuffer, &pipeBufAddrParams));
return MOS_STATUS_SUCCESS;
}
void HevcDecodePicPktM12::SetHcpPicStateParams(MHW_VDBOX_HEVC_PIC_STATE& picStateParamsBase)
{
DECODE_FUNC_CALL();
HevcDecodePicPktXe_M_Base::SetHcpPicStateParams(picStateParamsBase);
MHW_VDBOX_HEVC_PIC_STATE_G12 &picStateParams =
static_cast<MHW_VDBOX_HEVC_PIC_STATE_G12&>(picStateParamsBase);
picStateParams.pHevcExtPicParams = m_hevcRextPicParams;
picStateParams.pHevcSccPicParams = m_hevcSccPicParams;
picStateParams.ucRecNotFilteredID = m_hevcBasicFeature->m_refFrames.m_IBCRefIdx;
}
MOS_STATUS HevcDecodePicPktM12::AddHcpPicStateCmd(MOS_COMMAND_BUFFER &cmdBuffer)
{
DECODE_FUNC_CALL();
MHW_VDBOX_HEVC_PIC_STATE_G12 picStateParams;
SetHcpPicStateParams(picStateParams);
DECODE_CHK_STATUS(m_hcpInterface->AddHcpPicStateCmd(&cmdBuffer, &picStateParams));
return MOS_STATUS_SUCCESS;
}
MOS_STATUS HevcDecodePicPktM12::CalculateCommandSize(uint32_t &commandBufferSize, uint32_t &requestedPatchListSize)
{
MHW_VDBOX_STATE_CMDSIZE_PARAMS_G12 stateCmdSizeParams;
auto decodeMode = m_hevcPipeline->GetDecodeMode();
if (decodeMode == HevcPipeline::virtualTileDecodeMode ||
decodeMode == HevcPipeline::realTileDecodeMode)
{
stateCmdSizeParams.bScalableMode = true;
}
#ifdef _DECODE_PROCESSING_SUPPORTED
DecodeDownSamplingFeature *decodeDownSampling =
dynamic_cast<DecodeDownSamplingFeature*>(m_featureManager->GetFeature(DecodeFeatureIDs::decodeDownSampling));
stateCmdSizeParams.bSfcInUse = (decodeDownSampling != nullptr);
#endif
// Picture Level Commands
DECODE_CHK_STATUS(m_hwInterface->GetHcpStateCommandSize(
m_hevcBasicFeature->m_mode,
&commandBufferSize,
&requestedPatchListSize,
&stateCmdSizeParams));
return MOS_STATUS_SUCCESS;
}
MOS_STATUS HevcDecodePicPktM12::ValidateCabacStreamOutSize(MOS_COMMAND_BUFFER &cmdBuffer)
{
DECODE_CHK_NULL(m_resCABACStreamOutSizeBuffer);
DECODE_CHK_NULL(m_resCABACSyntaxStreamOutBuffer);
CodechalHwInterfaceG12* hwInterface = dynamic_cast<CodechalHwInterfaceG12*>(m_hwInterface);
DECODE_CHK_NULL(hwInterface);
uint32_t compareOperation = mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADLESSTHANIDD;
DECODE_CHK_STATUS(hwInterface->SendCondBbEndCmd(
&m_resCABACStreamOutSizeBuffer->OsResource,
0,
m_resCABACSyntaxStreamOutBuffer->size,
true,
true,
compareOperation,
&cmdBuffer));
return MOS_STATUS_SUCCESS;
}
}