blob: 1195802408914b8c9c143d4564f5c4ee57f71c76 [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_vdenc_vp9_g12.h
//! \brief VP9 VDENC encoder for GEN12 platform.
//!
#ifndef __CODECHAL_VDENC_VP9_G12_H__
#define __CODECHAL_VDENC_VP9_G12_H__
#include "codechal.h"
#include "codechal_hw.h"
#include "codechal_vdenc_vp9_base.h"
#include "mhw_vdbox_g12_X.h"
#include "codechal_encode_singlepipe_virtualengine.h"
#include "codechal_encode_scalability.h"
#define __MEDIA_USER_FEATURE_VALUE_VP9_ENCODE_VDBOX_NUM_ID 5155
#define __MEDIA_USER_FEATURE_VALUE_VP9_ENCODE_ENABLE_VE_ID 5156
#define __MEDIA_USER_FEATURE_VALUE_VP9_ENCODE_ENABLE_HW_STITCH 5157
#define HUC_CMD_LIST_MODE 1
#define HUC_BATCH_BUFFER_END 0x05000000
#define VDBOX_HUC_PAK_INTEGRATION_KERNEL_DESCRIPTOR 15
class CodechalVdencVp9StateG12 : public CodechalVdencVp9State
{
public:
enum MeBindingTableOffset
{
CODECHAL_ENCODE_ME_MV_DATA_SURFACE_G12 = 0,
CODECHAL_ENCODE_16xME_MV_DATA_SURFACE_G12 = 1,
CODECHAL_ENCODE_32xME_MV_DATA_SURFACE_G12 = 1,
CODECHAL_ENCODE_ME_DISTORTION_SURFACE_G12 = 2,
CODECHAL_ENCODE_ME_BRC_DISTORTION_G12 = 3,
CODECHAL_ENCODE_ME_RESERVED0_G12 = 4,
CODECHAL_ENCODE_ME_CURR_FOR_FWD_REF_G12 = 5,
CODECHAL_ENCODE_ME_FWD_REF_IDX0_G12 = 6,
CODECHAL_ENCODE_ME_RESERVED1_G12 = 7,
CODECHAL_ENCODE_ME_FWD_REF_IDX1_G12 = 8,
CODECHAL_ENCODE_ME_RESERVED2_G12 = 9,
CODECHAL_ENCODE_ME_FWD_REF_IDX2_G12 = 10,
CODECHAL_ENCODE_ME_RESERVED3_G12 = 11,
CODECHAL_ENCODE_ME_FWD_REF_IDX3_G12 = 12,
CODECHAL_ENCODE_ME_RESERVED4_G12 = 13,
CODECHAL_ENCODE_ME_FWD_REF_IDX4_G12 = 14,
CODECHAL_ENCODE_ME_RESERVED5_G12 = 15,
CODECHAL_ENCODE_ME_FWD_REF_IDX5_G12 = 16,
CODECHAL_ENCODE_ME_RESERVED6_G12 = 17,
CODECHAL_ENCODE_ME_FWD_REF_IDX6_G12 = 18,
CODECHAL_ENCODE_ME_RESERVED7_G12 = 19,
CODECHAL_ENCODE_ME_FWD_REF_IDX7_G12 = 20,
CODECHAL_ENCODE_ME_RESERVED8_G12 = 21,
CODECHAL_ENCODE_ME_CURR_FOR_BWD_REF_G12 = 22,
CODECHAL_ENCODE_ME_BWD_REF_IDX0_G12 = 23,
CODECHAL_ENCODE_ME_RESERVED9_G12 = 24,
CODECHAL_ENCODE_ME_BWD_REF_IDX1_G12 = 25,
CODECHAL_ENCODE_ME_VDENC_STREAMIN_OUTPUT_G12 = 26,
CODECHAL_ENCODE_ME_VDENC_STREAMIN_INPUT_G12 = 27,
CODECHAL_ENCODE_ME_NUM_SURFACES_G12 = 28
};
struct MeCurbe
{
// DW0
union
{
struct
{
uint32_t SkipModeEn : MOS_BITFIELD_BIT ( 0);
uint32_t AdaptiveEn : MOS_BITFIELD_BIT ( 1);
uint32_t BiMixDis : MOS_BITFIELD_BIT ( 2);
uint32_t : MOS_BITFIELD_RANGE( 3, 4);
uint32_t EarlyImeSuccessEn : MOS_BITFIELD_BIT ( 5);
uint32_t : MOS_BITFIELD_BIT ( 6);
uint32_t T8x8FlagForInterEn : MOS_BITFIELD_BIT ( 7);
uint32_t : MOS_BITFIELD_RANGE( 8, 23);
uint32_t EarlyImeStop : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW0;
// DW1
union
{
struct
{
uint32_t MaxNumMVs : MOS_BITFIELD_RANGE( 0, 5);
uint32_t : MOS_BITFIELD_RANGE( 6, 15);
uint32_t BiWeight : MOS_BITFIELD_RANGE(16, 21);
uint32_t : MOS_BITFIELD_RANGE(22, 27);
uint32_t UniMixDisable : MOS_BITFIELD_BIT ( 28);
uint32_t : MOS_BITFIELD_RANGE(29, 31);
};
struct
{
uint32_t Value;
};
} DW1;
// DW2
union
{
struct
{
uint32_t MaxLenSP : MOS_BITFIELD_RANGE( 0, 7);
uint32_t MaxNumSU : MOS_BITFIELD_RANGE( 8, 15);
uint32_t : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW2;
// DW3
union
{
struct
{
uint32_t SrcSize : MOS_BITFIELD_RANGE( 0, 1);
uint32_t : MOS_BITFIELD_RANGE( 2, 3);
uint32_t MbTypeRemap : MOS_BITFIELD_RANGE( 4, 5);
uint32_t SrcAccess : MOS_BITFIELD_BIT ( 6);
uint32_t RefAccess : MOS_BITFIELD_BIT ( 7);
uint32_t SearchCtrl : MOS_BITFIELD_RANGE( 8, 10);
uint32_t DualSearchPathOption : MOS_BITFIELD_BIT ( 11);
uint32_t SubPelMode : MOS_BITFIELD_RANGE(12, 13);
uint32_t SkipType : MOS_BITFIELD_BIT ( 14);
uint32_t DisableFieldCacheAlloc : MOS_BITFIELD_BIT ( 15);
uint32_t InterChromaMode : MOS_BITFIELD_BIT ( 16);
uint32_t FTEnable : MOS_BITFIELD_BIT ( 17);
uint32_t BMEDisableFBR : MOS_BITFIELD_BIT ( 18);
uint32_t BlockBasedSkipEnable : MOS_BITFIELD_BIT ( 19);
uint32_t InterSAD : MOS_BITFIELD_RANGE(20, 21);
uint32_t IntraSAD : MOS_BITFIELD_RANGE(22, 23);
uint32_t SubMbPartMask : MOS_BITFIELD_RANGE(24, 30);
uint32_t : MOS_BITFIELD_BIT ( 31);
};
struct
{
uint32_t Value;
};
} DW3;
// DW4
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0, 7);
uint32_t PictureHeightMinus1 : MOS_BITFIELD_RANGE( 8, 15);
uint32_t PictureWidth : MOS_BITFIELD_RANGE(16, 23);
uint32_t : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW4;
// DW5
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0, 7);
uint32_t QpPrimeY : MOS_BITFIELD_RANGE( 8, 15);
uint32_t RefWidth : MOS_BITFIELD_RANGE(16, 23);
uint32_t RefHeight : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW5;
// DW6
union
{
struct
{
uint32_t : MOS_BITFIELD_BIT ( 0);
uint32_t InputStreamInSurfaceEnable : MOS_BITFIELD_BIT ( 1);
uint32_t LCUSize : MOS_BITFIELD_BIT ( 2);
uint32_t WriteDistortions : MOS_BITFIELD_BIT ( 3);
uint32_t UseMvFromPrevStep : MOS_BITFIELD_BIT ( 4);
uint32_t : MOS_BITFIELD_RANGE( 5, 7);
uint32_t SuperCombineDist : MOS_BITFIELD_RANGE( 8, 15);
uint32_t MaxVmvR : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW6;
// DW7
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0, 15);
uint32_t MVCostScaleFactor : MOS_BITFIELD_RANGE(16, 17);
uint32_t BilinearEnable : MOS_BITFIELD_BIT ( 18);
uint32_t SrcFieldPolarity : MOS_BITFIELD_BIT ( 19);
uint32_t WeightedSADHAAR : MOS_BITFIELD_BIT ( 20);
uint32_t AConlyHAAR : MOS_BITFIELD_BIT ( 21);
uint32_t RefIDCostMode : MOS_BITFIELD_BIT ( 22);
uint32_t : MOS_BITFIELD_BIT ( 23);
uint32_t SkipCenterMask : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW7;
// DW8
union
{
struct
{
uint32_t Mode0Cost : MOS_BITFIELD_RANGE( 0, 7);
uint32_t Mode1Cost : MOS_BITFIELD_RANGE( 8, 15);
uint32_t Mode2Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t Mode3Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW8;
// DW9
union
{
struct
{
uint32_t Mode4Cost : MOS_BITFIELD_RANGE( 0, 7);
uint32_t Mode5Cost : MOS_BITFIELD_RANGE( 8, 15);
uint32_t Mode6Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t Mode7Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW9;
// DW10
union
{
struct
{
uint32_t Mode8Cost : MOS_BITFIELD_RANGE( 0, 7);
uint32_t Mode9Cost : MOS_BITFIELD_RANGE( 8, 15);
uint32_t RefIDCost : MOS_BITFIELD_RANGE(16, 23);
uint32_t ChromaIntraModeCost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW10;
// DW11
union
{
struct
{
uint32_t MV0Cost : MOS_BITFIELD_RANGE( 0, 7);
uint32_t MV1Cost : MOS_BITFIELD_RANGE( 8, 15);
uint32_t MV2Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t MV3Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW11;
// DW12
union
{
struct
{
uint32_t MV4Cost : MOS_BITFIELD_RANGE( 0, 7);
uint32_t MV5Cost : MOS_BITFIELD_RANGE( 8, 15);
uint32_t MV6Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t MV7Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW12;
// DW13
union
{
struct
{
uint32_t NumRefIdxL0MinusOne : MOS_BITFIELD_RANGE( 0, 7);
uint32_t NumRefIdxL1MinusOne : MOS_BITFIELD_RANGE( 8, 15);
uint32_t RefStreaminCost : MOS_BITFIELD_RANGE(16, 23);
uint32_t ROIEnable : MOS_BITFIELD_RANGE(24, 26);
uint32_t : MOS_BITFIELD_RANGE(27, 31);
};
struct
{
uint32_t Value;
};
} DW13;
// DW14
union
{
struct
{
uint32_t List0RefID0FieldParity : MOS_BITFIELD_BIT ( 0);
uint32_t List0RefID1FieldParity : MOS_BITFIELD_BIT ( 1);
uint32_t List0RefID2FieldParity : MOS_BITFIELD_BIT ( 2);
uint32_t List0RefID3FieldParity : MOS_BITFIELD_BIT ( 3);
uint32_t List0RefID4FieldParity : MOS_BITFIELD_BIT ( 4);
uint32_t List0RefID5FieldParity : MOS_BITFIELD_BIT ( 5);
uint32_t List0RefID6FieldParity : MOS_BITFIELD_BIT ( 6);
uint32_t List0RefID7FieldParity : MOS_BITFIELD_BIT ( 7);
uint32_t List1RefID0FieldParity : MOS_BITFIELD_BIT ( 8);
uint32_t List1RefID1FieldParity : MOS_BITFIELD_BIT ( 9);
uint32_t : MOS_BITFIELD_RANGE(10, 31);
};
struct
{
uint32_t Value;
};
} DW14;
// DW15
union
{
struct
{
uint32_t PrevMvReadPosFactor : MOS_BITFIELD_RANGE( 0, 7);
uint32_t MvShiftFactor : MOS_BITFIELD_RANGE( 8, 15);
uint32_t Reserved : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW15;
struct
{
// DW16
union
{
struct
{
SearchPathDelta SPDelta_0;
SearchPathDelta SPDelta_1;
SearchPathDelta SPDelta_2;
SearchPathDelta SPDelta_3;
};
struct
{
uint32_t Value;
};
} DW16;
// DW17
union
{
struct
{
SearchPathDelta SPDelta_4;
SearchPathDelta SPDelta_5;
SearchPathDelta SPDelta_6;
SearchPathDelta SPDelta_7;
};
struct
{
uint32_t Value;
};
} DW17;
// DW18
union
{
struct
{
SearchPathDelta SPDelta_8;
SearchPathDelta SPDelta_9;
SearchPathDelta SPDelta_10;
SearchPathDelta SPDelta_11;
};
struct
{
uint32_t Value;
};
} DW18;
// DW19
union
{
struct
{
SearchPathDelta SPDelta_12;
SearchPathDelta SPDelta_13;
SearchPathDelta SPDelta_14;
SearchPathDelta SPDelta_15;
};
struct
{
uint32_t Value;
};
} DW19;
// DW20
union
{
struct
{
SearchPathDelta SPDelta_16;
SearchPathDelta SPDelta_17;
SearchPathDelta SPDelta_18;
SearchPathDelta SPDelta_19;
};
struct
{
uint32_t Value;
};
} DW20;
// DW21
union
{
struct
{
SearchPathDelta SPDelta_20;
SearchPathDelta SPDelta_21;
SearchPathDelta SPDelta_22;
SearchPathDelta SPDelta_23;
};
struct
{
uint32_t Value;
};
} DW21;
// DW22
union
{
struct
{
SearchPathDelta SPDelta_24;
SearchPathDelta SPDelta_25;
SearchPathDelta SPDelta_26;
SearchPathDelta SPDelta_27;
};
struct
{
uint32_t Value;
};
} DW22;
// DW23
union
{
struct
{
SearchPathDelta SPDelta_28;
SearchPathDelta SPDelta_29;
SearchPathDelta SPDelta_30;
SearchPathDelta SPDelta_31;
};
struct
{
uint32_t Value;
};
} DW23;
// DW24
union
{
struct
{
SearchPathDelta SPDelta_32;
SearchPathDelta SPDelta_33;
SearchPathDelta SPDelta_34;
SearchPathDelta SPDelta_35;
};
struct
{
uint32_t Value;
};
} DW24;
// DW25
union
{
struct
{
SearchPathDelta SPDelta_36;
SearchPathDelta SPDelta_37;
SearchPathDelta SPDelta_38;
SearchPathDelta SPDelta_39;
};
struct
{
uint32_t Value;
};
} DW25;
// DW26
union
{
struct
{
SearchPathDelta SPDelta_40;
SearchPathDelta SPDelta_41;
SearchPathDelta SPDelta_42;
SearchPathDelta SPDelta_43;
};
struct
{
uint32_t Value;
};
} DW26;
// DW27
union
{
struct
{
SearchPathDelta SPDelta_44;
SearchPathDelta SPDelta_45;
SearchPathDelta SPDelta_46;
SearchPathDelta SPDelta_47;
};
struct
{
uint32_t Value;
};
} DW27;
// DW28
union
{
struct
{
SearchPathDelta SPDelta_48;
SearchPathDelta SPDelta_49;
SearchPathDelta SPDelta_50;
SearchPathDelta SPDelta_51;
};
struct
{
uint32_t Value;
};
} DW28;
// DW29
union
{
struct
{
SearchPathDelta SPDelta_52;
SearchPathDelta SPDelta_53;
SearchPathDelta SPDelta_54;
SearchPathDelta SPDelta_55;
};
struct
{
uint32_t Value;
};
} DW29;
}SPDelta;
// DW30
union
{
struct
{
uint32_t ActualMBWidth : MOS_BITFIELD_RANGE( 0, 15);
uint32_t ActualMBHeight : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW30;
// DW31
union
{
struct
{
uint32_t RoiCtrl : MOS_BITFIELD_RANGE( 0, 7);
uint32_t MaxTuSize : MOS_BITFIELD_RANGE( 8, 9);
uint32_t MaxCuSize : MOS_BITFIELD_RANGE(10, 11);
uint32_t NumImePredictors : MOS_BITFIELD_RANGE(12, 15);
uint32_t : MOS_BITFIELD_RANGE(16, 23);
uint32_t PuTypeCtrl : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW31;
// DW32
union
{
struct
{
uint32_t ForceMvx0 : MOS_BITFIELD_RANGE( 0, 15);
uint32_t ForceMvy0 : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW32;
// DW33
union
{
struct
{
uint32_t ForceMvx1 : MOS_BITFIELD_RANGE( 0, 15);
uint32_t ForceMvy1 : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW33;
// DW34
union
{
struct
{
uint32_t ForceMvx2 : MOS_BITFIELD_RANGE( 0, 15);
uint32_t ForceMvy2 : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW34;
// DW35
union
{
struct
{
uint32_t ForceMvx3 : MOS_BITFIELD_RANGE( 0, 15);
uint32_t ForceMvy3 : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW35;
// DW36
union
{
struct
{
uint32_t ForceRefIdx0 : MOS_BITFIELD_RANGE( 0, 3);
uint32_t ForceRefIdx1 : MOS_BITFIELD_RANGE( 4, 7);
uint32_t ForceRefIdx2 : MOS_BITFIELD_RANGE( 8, 11);
uint32_t ForceRefIdx3 : MOS_BITFIELD_RANGE(12, 15);
uint32_t NumMergeCandidateCu8x8 : MOS_BITFIELD_RANGE(16, 19);
uint32_t NumMergeCandidateCu16x16 : MOS_BITFIELD_RANGE(20, 23);
uint32_t NumMergeCandidateCu32x32 : MOS_BITFIELD_RANGE(24, 27);
uint32_t NumMergeCandidateCu64x64 : MOS_BITFIELD_RANGE(28, 31);
};
struct
{
uint32_t Value;
};
} DW36;
// DW37
union
{
struct
{
uint32_t SegID : MOS_BITFIELD_RANGE( 0, 15);
uint32_t QpEnable : MOS_BITFIELD_RANGE(16, 19);
uint32_t SegIDEnable : MOS_BITFIELD_BIT ( 20);
uint32_t : MOS_BITFIELD_RANGE(21, 22);
uint32_t ForceRefIdEnable : MOS_BITFIELD_BIT ( 23);
uint32_t : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t Value;
};
} DW37;
// DW38
union
{
struct
{
uint32_t ForceQp0 : MOS_BITFIELD_RANGE( 0, 7);
uint32_t ForceQp1 : MOS_BITFIELD_RANGE( 8, 15);
uint32_t ForceQp2 : MOS_BITFIELD_RANGE(16, 23);
uint32_t ForceQp3 : MOS_BITFIELD_RANGE(16, 19);
};
struct
{
uint32_t Value;
};
} DW38;
// DW39
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW39;
// DW40
union
{
struct
{
uint32_t _4xMeMvOutputDataSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW40;
// DW41
union
{
struct
{
uint32_t _16xOr32xMeMvInputDataSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW41;
// DW42
union
{
struct
{
uint32_t _4xMeOutputDistSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW42;
// DW43
union
{
struct
{
uint32_t _4xMeOutputBrcDistSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW43;
// DW44
union
{
struct
{
uint32_t VMEFwdInterPredictionSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW44;
// DW45
union
{
struct
{
uint32_t VMEBwdInterPredictionSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW45;
// DW46
union
{
struct
{
uint32_t VDEncStreamInOutputSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW46;
// DW47
union
{
struct
{
uint32_t VDEncStreamInInputSurfIndex : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t Value;
};
} DW47;
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(MeCurbe)) == 48);
// Integrated stats information
struct StatsInfo
{
uint32_t tileSizeRecord;
uint32_t vdencStats;
uint32_t pakStats;
uint32_t counterBuffer;
};
//!
//! \struct HucPakStitchDmemEncG12
//! \brief The struct of Huc Com Dmem
//!
struct HucPakIntDmem
{
uint32_t tileSizeRecordOffset[5]; // Tile Size Records, start offset in byte, 0xffffffff means unavailable
uint32_t vdencStatOffset[5]; // needed for HEVC VDEnc, VP9 VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t hevcPakStatOffset[5]; // needed for HEVC VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t hevcStreamoutOffset[5]; // needed for HEVC VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t vp9PakStatOffset[5]; // needed for VP9 VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t vp9CounterBufferOffset[5]; // needed for VP9 VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t lastTileBSStartInBytes; // last tile in bitstream for region 4 and region 5
uint32_t SliceHeaderSizeinBits; // needed for HEVC dual pipe BRC
uint16_t totalSizeInCommandBuffer; // Total size in bytes of valid data in the command buffer
uint16_t offsetInCommandBuffer; // Byte offset of the to-be-updated Length (uint32_t ) in the command buffer, 0xffff means unavailable
uint16_t picWidthInPixel; // Picture width in pixel
uint16_t picHeightInPixel; // Picture hieght in pixel
uint16_t totalNumberOfPaks; // [2..4] for Gen11
uint16_t numSlices[4]; // this is number of slices in each PAK
uint16_t numTiles[4]; // this is number of tiles from each PAK
uint16_t picStateStartInBytes; // offset for region 7 and region 8
uint8_t codec; // 1: HEVC DP; 2: HEVC VDEnc; 3: VP9 VDEnc
uint8_t maxPass; // Max number of BRC pass >=1
uint8_t currentPass; // Current BRC pass [1..MAXPass]
uint8_t minCUSize; // Minimum CU size (3: 8x8, 4:16x16), HEVC only.
uint8_t cabacZeroWordFlag; // Cabac zero flag, HEVC only
uint8_t bitdepthLuma; // luma bitdepth, HEVC only
uint8_t bitdepthChroma; // chroma bitdepth, HEVC only
uint8_t chromaFormatIdc; // chroma format idc, HEVC only
uint8_t currFrameBRClevel; // Hevc dual pipe only
uint8_t brcUnderFlowEnable; // Hevc dual pipe only
uint8_t StitchEnable;// enable stitch cmd for Hevc dual pipe
uint8_t reserved1;
uint16_t StitchCommandOffset; // offset in region 10 which is the second level batch buffer
uint16_t reserved2;
uint32_t BBEndforStitch;
uint8_t RSVD[16];
};
//!
//! \struct HucInputCmdG12
//! \brief The struct of Huc input command
//!
struct HucInputCmdG12
{
uint8_t SelectionForIndData = 0;
uint8_t CmdMode = 0;
uint16_t LengthOfTable = 0;
uint32_t SrcBaseOffset = 0;
uint32_t DestBaseOffset = 0;
uint32_t Reserved[3] = { 0 };
uint32_t CopySize = 0;
uint32_t ReservedCounter[4] = {0};
uint32_t SrcAddrBottom = 0;
uint32_t SrcAddrTop = 0;
uint32_t DestAddrBottom = 0;
uint32_t DestAddrTop = 0;
};
//!
//! \struct HucCommandData
//! \brief The struct of Huc commands data
//!
struct HucCommandData
{
uint32_t TotalCommands; //!< Total Commands in the Data buffer
struct
{
uint16_t ID; //!< Command ID, defined and order must be same as that in DMEM
uint16_t SizeOfData; //!< data size in uint32_t
uint32_t data[40];
} InputCOM[10];
};
// VDENC BRC related buffer size
static constexpr uint32_t m_brcStatsBufSize = ((48 + 256) * sizeof(uint32_t));
static constexpr uint32_t m_brcPakStatsBufSize = (64 * sizeof(uint32_t));
static constexpr uint32_t m_brcHistoryBufSize = 1152;
// VDENC Pak Int related constants
static constexpr uint32_t m_pakIntDmemOffsetsSize = 120;
static constexpr uint32_t m_pakIntVp9CodecId = 3;
static constexpr uint32_t m_maxNumPipes = 4;
static constexpr uint32_t m_hmeMaxMvLength = 511;
static constexpr uint32_t m_hmeFirstStep = 0;
static constexpr uint32_t m_hmeFollowingStep = 1;
static constexpr uint32_t m_mvShiftFactor32x = 1;
static constexpr uint32_t m_mvShiftFactor16x = 2;
static constexpr uint32_t m_mvShiftFactor4x = 2;
static constexpr uint32_t m_prevMvReadPosition16x = 1;
static constexpr uint32_t m_prevMvReadPosition4x = 0;
// ME CURBE init data for G12 Kernel
static const uint32_t meCurbeInit[48];
CODEC_PICTURE m_refPicList0[3];
// Virtual engine
//Scalability
uint8_t m_numPipe = 0;
uint8_t m_numPassesInOnePipe = 0;
bool m_scalableMode = false;
bool m_lastFrameScalableMode = false;
bool m_isTilingSupported = false;
bool m_enableTileStitchByHW = true;
bool m_useVirtualEngine = true;
MOS_COMMAND_BUFFER m_veBatchBuffer[m_numUncompressedSurface][CODECHAL_ENCODE_VP9_MAX_NUM_HCP_PIPE][m_brcMaxNumPasses];
MOS_COMMAND_BUFFER m_realCmdBuffer;
uint32_t m_sizeOfVEBatchBuffer = 0;
uint8_t m_virtualEngineBBIndex = 0;
uint32_t m_32BlocksRasterized = 0;
CODECHAL_ENCODE_BUFFER m_tileRecordBuffer[m_numUncompressedSurface];
CODECHAL_ENCODE_BUFFER m_hcpScalabilitySyncBuffer;
// Stats Integration regions
CODECHAL_ENCODE_BUFFER m_tileStatsPakIntegrationBuffer[m_numUncompressedSurface];
uint32_t m_tileStatsPakIntegrationBufferSize = 0;
CODECHAL_ENCODE_BUFFER m_frameStatsPakIntegrationBuffer;
uint32_t m_frameStatsPakIntegrationBufferSize = 0;
MOS_RESOURCE m_hucPakIntDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][m_brcMaxNumPasses];
MOS_RESOURCE m_hucPakIntDummyBuffer;
MOS_RESOURCE m_hucPakIntBrcDataBuffer;
StatsInfo m_tileStatsOffset = {}; // Page aligned offsets for HuC PAK Integration kernel input
StatsInfo m_frameStatsOffset = {}; // Page aligned offsets for HuC PAK Integration kernel output
StatsInfo m_statsSize = {}; // Sizes for the stats for HuC PAK Integration kernel input
MHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS m_hpuVirtualAddrParams;
// Needed for WA, fix for hang during resolution change
uint16_t m_picWidthInMinBlk = 0; //!< Picture Width aligned to minBlock
uint16_t m_picHeightInMinBlk = 0; //!< Picture Height aligned to minBlock
// Semaphore memory for synchronizing
CODECHAL_ENCODE_BUFFER m_pakIntDoneSemaphoreMem;
CODECHAL_ENCODE_BUFFER m_hucDoneSemaphoreMem[m_maxNumPipes];
CODECHAL_ENCODE_BUFFER m_stitchWaitSemaphoreMem[m_maxNumPipes];
// Indexes used to propagate buffers between frames/passes
uint16_t m_lastVdencPictureState2ndLevelBBIndex = 0;
uint8_t m_lastVirtualEngineBBIndex = 0;
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 m_tileParams = nullptr; //!< Pointer to the Tile params
PCODECHAL_ENCODE_SCALABILITY_STATE m_scalabilityState = nullptr; //!< Scalability state
MOS_RESOURCE m_vdencCumulativeCuCountStreamoutSurface = {};
MOS_RESOURCE m_vdencTileRowStoreBuffer = {};
bool m_hucPakStitchEnabled = true;
MOS_RESOURCE m_resHucStitchDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_ENCODE_VP9_BRC_MAX_NUM_OF_PASSES];
MHW_BATCH_BUFFER m_HucStitchCmdBatchBuffer = {};
//!
//! \brief Constructor
//!
CodechalVdencVp9StateG12(CodechalHwInterface* hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Destructor
//!
virtual ~CodechalVdencVp9StateG12();
int GetCurrentPipe()
{
return (m_numPipe <= 1) ? 0 : (int)(m_currPass) % (int)m_numPipe;
}
int GetCurrentPass() override
{
return (m_numPipe <= 1) ? m_currPass : (int)(m_currPass) / (int)m_numPipe;
}
int GetNumPasses() override
{
return m_numPassesInOnePipe;
}
bool IsLastPipe()
{
return (GetCurrentPipe() == (m_numPipe - 1)) ? true : false;
}
bool IsFirstPipe()
{
return (GetCurrentPipe() == 0) ? true : false;
}
bool IsFirstPass() override
{
return (GetCurrentPass() == 0) ? true : false;
}
bool IsLastPass() override
{
return (GetCurrentPass() == m_numPassesInOnePipe) ? true : false;
}
bool UseLegacyCommandBuffer()
{
return ((!m_scalableMode) || (m_osInterface->pfnGetGpuContext(m_osInterface) == m_renderContext));
}
bool IsRenderContext()
{
return (m_osInterface->pfnGetGpuContext(m_osInterface) == m_renderContext);
}
uint8_t ToHCPChromaFormat(uint8_t vp9ChromaFormat)
{
HCP_CHROMA_FORMAT_IDC hcpChromaFormat = HCP_CHROMA_FORMAT_YUV420;
switch(vp9ChromaFormat)
{
case VP9_ENCODED_CHROMA_FORMAT_YUV420:
hcpChromaFormat = HCP_CHROMA_FORMAT_YUV420;
break;
case VP9_ENCODED_CHROMA_FORMAT_YUV422:
hcpChromaFormat = HCP_CHROMA_FORMAT_YUV422;
break;
case VP9_ENCODED_CHROMA_FORMAT_YUV444:
hcpChromaFormat = HCP_CHROMA_FORMAT_YUV444;
break;
default:
hcpChromaFormat = HCP_CHROMA_FORMAT_YUV420;
break;
}
return hcpChromaFormat;
}
MOS_STATUS VerifyCommandBufferSize() override;
MOS_STATUS GetCommandBuffer(
PMOS_COMMAND_BUFFER cmdBuffer) override;
MOS_STATUS ReturnCommandBuffer(
PMOS_COMMAND_BUFFER cmdBuffer) override;
MOS_STATUS SubmitCommandBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
bool nullRendering) override;
MOS_STATUS SendPrologWithFrameTracking(
PMOS_COMMAND_BUFFER cmdBuffer,
bool frameTrackingRequested,
MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override;
MOS_STATUS SetSemaphoreMem(
PMOS_RESOURCE semaphoreMem,
PMOS_COMMAND_BUFFER cmdBuffer,
uint32_t value);
MOS_STATUS SendHWWaitCommand(
PMOS_RESOURCE semaphoreMem,
PMOS_COMMAND_BUFFER cmdBuffer,
uint32_t value);
MOS_STATUS UserFeatureKeyReport() override;
MOS_STATUS SetHcpPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams,
PMOS_SURFACE* refSurface,
PMOS_SURFACE* refSurfaceNonScaled,
PMOS_SURFACE* dsRefSurface4x,
PMOS_SURFACE* dsRefSurface8x) override;
uint16_t GetNumTilesInFrame();
MOS_STATUS ExecutePictureLevel() override;
MOS_STATUS SetSequenceStructs() override;
MOS_STATUS SetPictureStructs() override;
MOS_STATUS SetRowstoreCachingOffsets() override;
virtual MOS_STATUS AllocateResources() override;
void FreeResources() override;
MOS_STATUS SetMeSurfaceParams(MeSurfaceParams *meSurfaceParams);
MOS_STATUS SetMeCurbeParams(MeCurbeParams *meParams);
MOS_STATUS ExecuteKernelFunctions() override;
MOS_STATUS SetupSegmentationStreamIn() override;
void SetHcpPipeModeSelectParams(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& pipeModeSelectParams) override;
void SetHcpIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& indObjBaseAddrParams) override;
MOS_STATUS ExecuteSliceLevel() override;
MOS_STATUS ExecuteDysSliceLevel() override;
MOS_STATUS ExecuteDysPictureLevel() override;
MOS_STATUS Initialize(CodechalSetting * settings) override;
MOS_STATUS InitMmcState() override;
MOS_STATUS GetSystemPipeNumberCommon();
MOS_STATUS InitKernelStateMe();
MOS_STATUS SetCurbeMe(
MeCurbeParams* params);
MOS_STATUS SendMeSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
MeSurfaceParams* params);
MOS_STATUS InitInterface();
MOS_STATUS InitKernelStates();
uint32_t GetMaxBtCount();
MOS_STATUS ExecuteMeKernel(
MeCurbeParams *meParams,
MeSurfaceParams *meSurfaceParams,
HmeLevel hmeLevel) override;
MOS_STATUS InitKernelStateDys();
MOS_STATUS ExecuteTileLevel();
MOS_STATUS SetTileData();
virtual MOS_STATUS SetTileCommands(
PMOS_COMMAND_BUFFER cmdBuffer);
MOS_STATUS GetStatusReport(
EncodeStatus* encodeStatus,
EncodeStatusReport* encodeStatusReport) override;
MOS_STATUS DecideEncodingPipeNumber();
MOS_STATUS PlatformCapabilityCheck() override;
uint32_t GetSegmentBlockIndexInFrame(
uint32_t frameWidth,
uint32_t curr32XInTile,
uint32_t curr32YInTile,
uint32_t currTileStartY64aligned,
uint32_t currTileStartX64aligned);
MOS_STATUS InitZigZagToRasterLUTPerTile(
uint32_t tileHeight,
uint32_t tileWidth,
uint32_t currTileStartYInFrame,
uint32_t currTileStartXInFrame);
MOS_STATUS CalculateVdencPictureStateCommandSize() override;
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS CreateHcpPipeBufAddrParams(
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams) override;
MOS_STATUS UpdateCmdBufAttribute(
PMOS_COMMAND_BUFFER cmdBuffer,
bool renderEngineInUse) override;
MOS_STATUS AddMediaVfeCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
SendKernelCmdsParams *params) override;
MOS_STATUS ConstructPicStateBatchBuf(
PMOS_RESOURCE picStateBuffer) override;
virtual MOS_STATUS SetDmemHuCPakInt();
virtual MOS_STATUS HuCVp9PakInt(
PMOS_COMMAND_BUFFER cmdBuffer);
MOS_STATUS ConfigStitchDataBuffer();
MOS_STATUS HuCBrcUpdate() override;
MOS_STATUS HuCVp9Prob() override;
MOS_STATUS HuCBrcInitReset() override;
MOS_STATUS SetGpuCtxCreatOption() override;
MOS_STATUS SetAndPopulateVEHintParams(
PMOS_COMMAND_BUFFER cmdBuffer);
MOS_STATUS AddCommandsVp9(
uint32_t commandType,
PMOS_COMMAND_BUFFER cmdBuffer);
};
#endif // __CODECHAL_VDENC_VP9_G12_H__