blob: 87b971b5f1856c3bceed6a8610963ab34971e74e [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_encode_csc_ds_g12.h
//! \brief Gen12 class for CSC and Downscaling.
//!
#ifndef __CodechalEncodeCscDsG12__
#define __CodechalEncodeCscDsG12__
#include "codechal_encode_csc_ds.h"
class CodechalEncodeCscDsG12 : public CodechalEncodeCscDs
{
public:
//!
//! \brief Extension params used only by HEVC
//!
struct HevcExtKernelParams
{
bool bHevcEncHistorySum = false;
bool bUseLCU32 = false;
PMOS_RESOURCE presHistoryBuffer = nullptr;
uint32_t dwSizeHistoryBuffer = 0;
uint32_t dwOffsetHistoryBuffer = 0;
PMOS_RESOURCE presHistorySumBuffer = nullptr;
uint32_t dwSizeHistorySumBuffer = 0;
uint32_t dwOffsetHistorySumBuffer = 0;
PMOS_RESOURCE presMultiThreadTaskBuffer = nullptr;
uint32_t dwSizeMultiThreadTaskBuffer = 0;
uint32_t dwOffsetMultiThreadTaskBuffer = 0;
};
//!
//! \brief 4xDS kernel Curbe data
//!
struct Ds4xKernelCurbeData
{
Ds4xKernelCurbeData()
{
DW0 = 0;
DW1 = ds4xSrcYPlane;
DW2 = ds4xDstYPlane;
DW3_InputYBTIBottomField =
DW4_OutputYBTIBottomField =
DW5_FlatnessThreshold =
DW6 =
DW7_Reserved = 0;
DW8 = ds4xDstMbVProc;
DW9_MBVProcStatsBTIBottomField = 0;
DW10_Reserved =
DW11_Reserved =
DW12_Reserved =
DW13_Reserved =
DW14_Reserved =
DW15_Reserved = 0;
}
// DW0
union
{
struct
{
uint32_t DW0_InputPictureWidth : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW0_InputPictureHeight : MOS_BITFIELD_RANGE(16, 31);
};
uint32_t DW0;
};
// DW1
union
{
struct
{
uint32_t DW1_InputYBTIFrame;
};
struct
{
uint32_t DW1_InputYBTITopField;
};
uint32_t DW1;
};
// DW2
union
{
struct
{
uint32_t DW2_OutputYBTIFrame;
};
struct
{
uint32_t DW2_OutputYBTITopField;
};
uint32_t DW2;
};
// DW3
uint32_t DW3_InputYBTIBottomField;
// DW4
uint32_t DW4_OutputYBTIBottomField;
// DW5
uint32_t DW5_FlatnessThreshold;
// DW6
union
{
struct
{
uint32_t DW6_EnableMBFlatnessCheck : MOS_BITFIELD_BIT(0);
uint32_t DW6_EnableMBVarianceOutput : MOS_BITFIELD_BIT(1);
uint32_t DW6_EnableMBPixelAverageOutput : MOS_BITFIELD_BIT(2);
uint32_t DW6_EnableBlock8x8StatisticsOutput : MOS_BITFIELD_BIT(3);
uint32_t: MOS_BITFIELD_RANGE(4, 31);
};
uint32_t DW6;
};
// DW7
uint32_t DW7_Reserved;
// DW8
union
{
struct
{
uint32_t DW8_MBVProcStatsBTIFrame;
};
struct
{
uint32_t DW8_MBVProcStatsBTITopField;
};
uint32_t DW8;
};
// DW9
uint32_t DW9_MBVProcStatsBTIBottomField;
// DW10
uint32_t DW10_Reserved;
// DW11
uint32_t DW11_Reserved;
//DW12
uint32_t DW12_Reserved;
//DW13
uint32_t DW13_Reserved;
//DW14
uint32_t DW14_Reserved;
//DW15
uint32_t DW15_Reserved;
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(Ds4xKernelCurbeData)) == 16);
//!
//! \brief Constructor
//!
CodechalEncodeCscDsG12(CodechalEncoderState* encoder);
//!
//! \brief Destructor
//!
~CodechalEncodeCscDsG12();
virtual uint8_t GetBTCount() const override;
protected:
virtual MOS_STATUS AllocateSurfaceCsc() override;
virtual MOS_STATUS InitKernelStateDS() override;
virtual MOS_STATUS SetCurbeDS4x() override;
virtual MOS_STATUS SetKernelParamsCsc(KernelParams* params) override;
virtual MOS_STATUS InitKernelStateCsc() override;
private:
//!
//! \brief CSC kernel binding table
//!
enum CscKernelBTI
{
cscSrcYPlane = 0,
cscSrcUVPlane = 1,
cscDstConvYPlane = 2,
cscDstConvUVlane = 3,
cscDst4xDs = 4,
cscDstMbStats = 5,
cscDst2xDs = 6,
cscDstHistBuffer = 7,
cscDstHistSum = 8,
cscDstMultiTask = 9,
cscNumSurfaces = 10,
};
//!
//! \brief Csc kernel Curbe data
//!
struct CscKernelCurbeData
{
CscKernelCurbeData()
{
DW0 =
DW1 =
DW2 =
DW3_MBFlatnessThreshold =
DW4_CSC_Coefficient_C0 =
DW4_CSC_Coefficient_C1 =
DW5_CSC_Coefficient_C2 =
DW5_CSC_Coefficient_C3 =
DW6_CSC_Coefficient_C4 =
DW6_CSC_Coefficient_C5 =
DW7_CSC_Coefficient_C6 =
DW7_CSC_Coefficient_C7 =
DW8_CSC_Coefficient_C8 =
DW8_CSC_Coefficient_C9 =
DW9_CSC_Coefficient_C10 =
DW9_CSC_Coefficient_C11 = 0;
DW10_BTI_InputSurface = cscSrcYPlane;
DW11_BTI_Enc8BitSurface = cscDstConvYPlane;
DW12_BTI_4xDsSurface = cscDst4xDs;
DW13_BTI_MbStatsSurface = cscDstMbStats;
DW14_BTI_2xDsSurface = cscDst2xDs;
DW15_BTI_HistoryBuffer = cscDstHistBuffer;
DW16_BTI_HistorySumBuffer = cscDstHistSum;
DW17_BTI_MultiTaskBuffer = cscDstMultiTask;
}
union
{
struct
{
// DWORD 0
uint32_t DW0_Reserved_0 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW0_Reserved_1 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW0_OutputBitDepthForChroma : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW0_OutputBitDepthForLuma : MOS_BITFIELD_RANGE(24, 30);
uint32_t DW0_RoundingEnable : MOS_BITFIELD_BIT(31);
};
uint32_t DW0;
};
union
{
struct
{
// DWORD 1
uint32_t DW1_PictureFormat : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW1_ConvertFlag : MOS_BITFIELD_BIT(8);
uint32_t DW1_DownscaleStage : MOS_BITFIELD_RANGE(9, 11);
uint32_t DW1_MbStatisticsDumpFlag : MOS_BITFIELD_BIT(12);
uint32_t DW1_YUY2ConversionFlag : MOS_BITFIELD_BIT(13);
uint32_t DW1_HevcEncHistorySum : MOS_BITFIELD_BIT(14);
uint32_t DW1_LCUSize : MOS_BITFIELD_BIT(15);
uint32_t DW1_ChromaSitingLocation : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW1_Reserved_0 : MOS_BITFIELD_RANGE(24, 31);
};
uint32_t DW1;
};
union
{
struct
{
// DWORD 2
uint32_t DW2_OriginalPicWidthInSamples : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW2_OriginalPicHeightInSamples : MOS_BITFIELD_RANGE(16, 31);
};
uint32_t DW2;
};
// DWORD 3
uint32_t DW3_MBFlatnessThreshold;
// DWORD 4
uint32_t DW4_CSC_Coefficient_C0 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW4_CSC_Coefficient_C1 : MOS_BITFIELD_RANGE(16, 31);
// DWORD 5
uint32_t DW5_CSC_Coefficient_C2 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW5_CSC_Coefficient_C3 : MOS_BITFIELD_RANGE(16, 31);
// DWORD 6
uint32_t DW6_CSC_Coefficient_C4 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW6_CSC_Coefficient_C5 : MOS_BITFIELD_RANGE(16, 31);
// DWORD 7
uint32_t DW7_CSC_Coefficient_C6 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW7_CSC_Coefficient_C7 : MOS_BITFIELD_RANGE(16, 31);
// DWORD 8
uint32_t DW8_CSC_Coefficient_C8 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW8_CSC_Coefficient_C9 : MOS_BITFIELD_RANGE(16, 31);
// DWORD 9
uint32_t DW9_CSC_Coefficient_C10 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW9_CSC_Coefficient_C11 : MOS_BITFIELD_RANGE(16, 31);
// DWORD 10
uint32_t DW10_BTI_InputSurface;
// DWORD 11
uint32_t DW11_BTI_Enc8BitSurface;
// DWORD 12
uint32_t DW12_BTI_4xDsSurface;
// DWORD 13
uint32_t DW13_BTI_MbStatsSurface;
// DWORD 14
uint32_t DW14_BTI_2xDsSurface;
// DWORD 15
uint32_t DW15_BTI_HistoryBuffer;
// DWORD 16
uint32_t DW16_BTI_HistorySumBuffer;
// DWORD 17
uint32_t DW17_BTI_MultiTaskBuffer;
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CscKernelCurbeData)) == 18);
//!
//! \brief 4xDS kernel binding table
//!
enum Ds4xKernelBTI
{
ds4xSrcYPlane = 0,
ds4xDstYPlane = 1,
ds4xSrcYPlaneTopField = 0,
ds4xDstYPlaneTopField = 1,
ds4xSrcYPlaneBtmField = 2,
ds4xDstYPlaneBtmField = 3,
ds4xDstMbVProc = 4,
ds4xDstMbVProcTopField = 4,
ds4xDstMbVProcBtmField = 5,
ds4xNumSurfaces = 6
};
virtual MOS_STATUS CheckRawColorFormat(MOS_FORMAT format) override;
virtual MOS_STATUS SetCurbeCsc() override;
virtual MOS_STATUS SendSurfaceCsc(PMOS_COMMAND_BUFFER cmdBuffer) override;
virtual MOS_STATUS InitSfcState() override;
};
#endif // __CodechalEncodeCscDsG12__