blob: 2136e83c87bd4887755ea52cc9d3c270840d8e9b [file] [log] [blame]
/*
* Copyright (c) 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 mhw_vdbox_vdenc_cmdpar.h
//! \brief MHW command parameters
//! \details
//!
#ifndef __MHW_VDBOX_VDENC_CMDPAR_H__
#define __MHW_VDBOX_VDENC_CMDPAR_H__
#include "mhw_vdbox_cmdpar.h"
#include "codec_def_common.h"
#include "codec_def_common_encode.h"
namespace mhw
{
namespace vdbox
{
namespace vdenc
{
static constexpr uint32_t MAX_REF_LIST_NUM = 2;
static constexpr uint32_t MAX_REF_NUM_L0 = 4;
static constexpr uint32_t MAX_REF_NUM_L1 = 4; // low delay B may have 3 L1 refs
static constexpr uint32_t MAX_REF_NUM = MAX_REF_NUM_L0 > MAX_REF_NUM_L1 ? MAX_REF_NUM_L0 : MAX_REF_NUM_L1;
static constexpr uint32_t MAX_REF_NUM_L0L1 = MAX_REF_NUM_L0 + MAX_REF_NUM_L1;
enum class SurfaceFormat
{
yuv422 = 0x0,
rgba4444 = 0x1,
yuv444 = 0x2,
p010Variant = 0x3,
planar4208 = 0x4,
yCrCbSwapY422 = 0x5,
yCrCbSwapUv422 = 0x6,
yCrCbSwapUvy422 = 0x7,
y216 = 0x8,
y210 = 0x8,
r10g10b10a2 = 0x9,
y410 = 0xa,
nv21 = 0xb,
y416 = 0xc,
p010 = 0xd,
planarP016 = 0xe,
y8Unorm = 0xf,
y16 = 0x10,
y216Variant = 0x11,
y416Variant = 0x12,
yuyvVariant = 0x13,
ayuvVariant = 0x14,
};
struct _MHW_CMD_PAR_T(VDENC_CONTROL_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_CONTROL_STATE)() = default;
bool vdencInitialization = true;
};
struct _MHW_CMD_PAR_T(VDENC_PIPE_MODE_SELECT)
{
virtual ~_MHW_CMD_PAR_T(VDENC_PIPE_MODE_SELECT)() = default;
uint8_t standardSelect = 0;
bool scalabilityMode = false;
bool frameStatisticsStreamOut = false;
bool pakObjCmdStreamOut = false;
bool tlbPrefetch = false;
bool dynamicSlice = false;
bool streamIn = false;
uint8_t bitDepthMinus8 = 0;
uint8_t chromaType = 0;
uint8_t outputRangeControlCsc = 1;
bool tileBasedReplayMode = false;
bool randomAccess = false;
bool rgbEncodingMode = false;
bool hmeRegionPrefetch = true;
uint8_t topPrefetchEnableMode = 0;
uint8_t leftPrefetchAtWrapAround = 1;
uint8_t verticalShift32Minus1 = 2;
uint8_t hzShift32Minus1 = 3;
uint8_t numVerticalReqMinus1 = 6;
uint8_t numHzReqMinus1 = 2;
uint8_t prefetchOffset = 0;
uint8_t captureMode = 0;
uint8_t wirelessSessionId = 0;
uint8_t tailPointerReadFrequency = 0;
uint8_t streamingBufferConfig = 0;
uint8_t quantizationPrecision = 0;
uint8_t latencyTolerate = 0;
};
struct _MHW_CMD_PAR_T(VDENC_SRC_SURFACE_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_SRC_SURFACE_STATE)() = default;
uint32_t width = 0;
uint32_t height = 0;
uint32_t pitch = 0;
uint32_t uOffset = 0;
uint32_t vOffset = 0;
MOS_TILE_TYPE tileType = MOS_TILE_X;
MOS_TILE_MODE_GMM tileModeGmm = MOS_TILE_LINEAR_GMM;
MOS_FORMAT format = Format_Any;
bool gmmTileEn = false;
bool colorSpaceSelection = false;
bool displayFormatSwizzle = false;
uint8_t vDirection = 0;
};
struct _MHW_CMD_PAR_T(VDENC_REF_SURFACE_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_REF_SURFACE_STATE)() = default;
uint32_t width = 0;
uint32_t height = 0;
uint32_t pitch = 0;
uint32_t uOffset = 0;
uint32_t vOffset = 0;
MOS_TILE_TYPE tileType = MOS_TILE_X;
MOS_TILE_MODE_GMM tileModeGmm = MOS_TILE_LINEAR_GMM;
MOS_FORMAT format = Format_Any;
bool gmmTileEn = false;
uint8_t vDirection = 0;
};
struct _MHW_CMD_PAR_T(VDENC_DS_REF_SURFACE_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_DS_REF_SURFACE_STATE)() = default;
uint8_t vDirectionStage1 = 0;
uint8_t vDirectionStage2 = 0;
uint32_t widthStage1 = 0;
uint32_t widthStage2 = 0;
uint32_t heightStage1 = 0;
uint32_t heightStage2 = 0;
uint32_t pitchStage1 = 0;
uint32_t pitchStage2 = 0;
uint32_t uOffsetStage1 = 0;
uint32_t uOffsetStage2 = 0;
uint32_t vOffsetStage1 = 0;
uint32_t vOffsetStage2 = 0;
MOS_TILE_TYPE tileTypeStage1 = MOS_TILE_X;
MOS_TILE_TYPE tileTypeStage2 = MOS_TILE_X;
MOS_TILE_MODE_GMM tileModeGmmStage1 = MOS_TILE_LINEAR_GMM;
MOS_TILE_MODE_GMM tileModeGmmStage2 = MOS_TILE_LINEAR_GMM;
bool gmmTileEnStage1 = false;
bool gmmTileEnStage2 = false;
};
struct _MHW_CMD_PAR_T(VDENC_PIPE_BUF_ADDR_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_PIPE_BUF_ADDR_STATE)() = default;
PMOS_SURFACE surfaceRaw = nullptr;
MOS_MEMCOMP_STATE mmcStateRaw = MOS_MEMCOMP_DISABLED;
uint32_t compressionFormatRaw = 0;
uint32_t compressionFormatRecon = 0;
PMOS_RESOURCE intraRowStoreScratchBuffer = nullptr;
PMOS_RESOURCE streamOutBuffer = nullptr;
uint32_t streamOutOffset = 0;
PMOS_RESOURCE streamInBuffer = nullptr;
uint32_t numActiveRefL0 = 0;
uint32_t numActiveRefL1 = 0;
PMOS_RESOURCE refs[MAX_REF_NUM_L0L1] = {};
PMOS_RESOURCE refsDsStage1[MAX_REF_NUM_L0L1] = {};
PMOS_RESOURCE refsDsStage2[MAX_REF_NUM_L0L1] = {};
MOS_MEMCOMP_STATE mmcStatePreDeblock = MOS_MEMCOMP_DISABLED;
MOS_MEMCOMP_STATE mmcStatePostDeblock = MOS_MEMCOMP_DISABLED;
PMOS_SURFACE surfaceDsStage1 = nullptr;
MOS_MEMCOMP_STATE mmcStateDsStage1 = MOS_MEMCOMP_DISABLED;
PMOS_SURFACE surfaceDsStage2 = nullptr;
MOS_MEMCOMP_STATE mmcStateDsStage2 = MOS_MEMCOMP_DISABLED;
bool lowDelayB = false;
PMOS_RESOURCE colocatedMvReadBuffer = nullptr;
PMOS_RESOURCE colMvTempBuffer[MAX_REF_NUM_L0L1] = {};
PMOS_RESOURCE pakObjCmdStreamOutBuffer = nullptr;
PMOS_RESOURCE segmentMapStreamInBuffer = nullptr;
PMOS_RESOURCE segmentMapStreamOutBuffer = nullptr;
PMOS_RESOURCE tileRowStoreBuffer = nullptr;
PMOS_RESOURCE mfdIntraRowStoreScratchBuffer = nullptr;
PMOS_RESOURCE cumulativeCuCountStreamOutBuffer = nullptr;
PMOS_RESOURCE colocatedMvWriteBuffer = nullptr;
};
struct _MHW_CMD_PAR_T(VDENC_WEIGHTSOFFSETS_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_WEIGHTSOFFSETS_STATE)() = default;
int8_t weightsLuma[MAX_REF_LIST_NUM][MAX_REF_NUM] = {};
int16_t offsetsLuma[MAX_REF_LIST_NUM][MAX_REF_NUM] = {};
uint32_t denomLuma = 0;
int8_t weightsChroma[MAX_REF_LIST_NUM][MAX_REF_NUM][2] = {};
int16_t offsetsChroma[MAX_REF_LIST_NUM][MAX_REF_NUM][2] = {};
uint32_t denomChroma = 0;
};
struct _MHW_CMD_PAR_T(VDENC_HEVC_VP9_TILE_SLICE_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_HEVC_VP9_TILE_SLICE_STATE)() = default;
bool tileEnable = false;
bool tileRowStoreSelect = false;
uint32_t tileWidth = 0;
uint32_t tileHeight = 0;
uint32_t numPipe = 0;
uint32_t tileId = 0;
uint32_t tileStartLCUX = 0;
uint32_t tileStartLCUY = 0;
uint32_t ctbSize = 0;
uint32_t tileStreamInOffset = 0;
uint32_t tileLCUStreamOutOffset = 0;
uint32_t cumulativeCUTileOffset = 0;
uint32_t log2WeightDenomLuma = 0;
uint32_t log2WeightDenomChroma = 0;
uint32_t hevcVp9Log2WeightDenomLuma = 0;
};
struct _MHW_CMD_PAR_T(VDENC_WALKER_STATE)
{
virtual ~_MHW_CMD_PAR_T(VDENC_WALKER_STATE)() = default;
bool firstSuperSlice = true;
uint32_t tileSliceStartLcuMbX = 0;
uint32_t tileSliceStartLcuMbY = 0;
uint32_t nextTileSliceStartLcuMbX = 0;
uint32_t nextTileSliceStartLcuMbY = 0;
};
struct _MHW_CMD_PAR_T(VD_PIPELINE_FLUSH)
{
virtual ~_MHW_CMD_PAR_T(VD_PIPELINE_FLUSH)() = default;
bool waitDoneHEVC = false;
bool waitDoneVDENC = false;
bool waitDoneMFL = false;
bool waitDoneMFX = false;
bool waitDoneVDCmdMsgParser = false;
bool flushHEVC = false;
bool flushVDENC = false;
bool flushMFL = false;
bool flushMFX = false;
};
class CmdPar
{
public:
virtual ~CmdPar() = default;
_MHW_CMD_PAR_SET_DEF(VDENC_CONTROL_STATE);
_MHW_CMD_PAR_SET_DEF(VDENC_PIPE_MODE_SELECT);
_MHW_CMD_PAR_SET_DEF(VDENC_SRC_SURFACE_STATE);
_MHW_CMD_PAR_SET_DEF(VDENC_REF_SURFACE_STATE);
_MHW_CMD_PAR_SET_DEF(VDENC_DS_REF_SURFACE_STATE);
_MHW_CMD_PAR_SET_DEF(VDENC_PIPE_BUF_ADDR_STATE);
_MHW_CMD_PAR_SET_DEF(VDENC_WEIGHTSOFFSETS_STATE);
_MHW_CMD_PAR_SET_DEF(VDENC_HEVC_VP9_TILE_SLICE_STATE);
_MHW_CMD_PAR_SET_DEF(VDENC_WALKER_STATE);
_MHW_CMD_PAR_SET_DEF(VD_PIPELINE_FLUSH);
};
} // namespace vdenc
} // namespace vdbox
} // namespace mhw
#ifndef MHW_VDBOX_VDENC_CMDPAR_T
#define MHW_VDBOX_VDENC_CMDPAR_T mhw::vdbox::vdenc::CmdPar
#endif
#ifndef MHW_VDBOX_VDENC_CMD_PAR_T
#define MHW_VDBOX_VDENC_CMD_PAR_T(cmd) mhw::vdbox::vdenc::_MHW_CMD_PAR_T(cmd)
#endif
#define MHW_VDBOX_VDENC_TO_ACTUAL_CMD_PAR(cmd) \
MHW_FUNCTION_ENTER; \
auto params = mhw::DynamicPointerCast<MHW_VDBOX_VDENC_CMD_PAR_T(cmd)>(par); \
MHW_CHK_NULL_RETURN(params)
#endif // __MHW_VDBOX_VDENC_CMDPAR_H__