1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file codechal_kernel_hme_g8.cpp
24 //! \brief Hme kernel implementation for Gen8 platform
25 //!
26 #include "codechal_kernel_hme_g8.h"
27
28 // clang-format off
29 const uint32_t CodechalKernelHmeG8::Curbe::m_initCurbe[39] =
30 {
31 0x00000000, 0x00200010, 0x00003939, 0x77a43000, 0x00000000, 0x28300000, 0x00000000, 0x00000000,
32 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
33 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
34 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
35 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
36 };
37 // clang-format on
38
CodechalKernelHmeG8(CodechalEncoderState * encoder,bool me4xDistBufferSupported)39 CodechalKernelHmeG8::CodechalKernelHmeG8(
40 CodechalEncoderState *encoder,
41 bool me4xDistBufferSupported)
42 : CodechalKernelHme(encoder, me4xDistBufferSupported)
43 {
44 }
45
SetCurbe(MHW_KERNEL_STATE * kernelState)46 MOS_STATUS CodechalKernelHmeG8::SetCurbe(MHW_KERNEL_STATE *kernelState)
47 {
48 CODECHAL_ENCODE_CHK_NULL_RETURN(kernelState);
49
50 Curbe curbe;
51 uint32_t mvShiftFactor = 0;
52 uint32_t prevMvReadPosFactor = 0;
53 uint32_t scaleFactor;
54 bool useMvFromPrevStep;
55 bool writeDistortions;
56
57 if (m_32xMeInUse)
58 {
59 useMvFromPrevStep = false;
60 writeDistortions = false;
61 scaleFactor = scalingFactor32X;
62 mvShiftFactor = 1;
63 prevMvReadPosFactor = 0;
64 }
65 else if (m_16xMeInUse)
66 {
67 useMvFromPrevStep = Is32xMeEnabled() ? true : false;
68 writeDistortions = false;
69 scaleFactor = scalingFactor16X;
70 mvShiftFactor = 2;
71 prevMvReadPosFactor = 1;
72 }
73 else if (m_4xMeInUse)
74 {
75 useMvFromPrevStep = Is16xMeEnabled() ? true : false;
76 writeDistortions = true;
77 scaleFactor = scalingFactor4X;
78 mvShiftFactor = 2;
79 prevMvReadPosFactor = 0;
80 }
81 else
82 {
83 return MOS_STATUS_INVALID_PARAMETER;
84 }
85
86 curbe.m_data.DW3.SubPelMode = m_curbeParam.subPelMode;
87
88 if (m_fieldScalingOutputInterleaved)
89 {
90 curbe.m_data.DW3.SrcAccess = curbe.m_data.DW3.RefAccess = CodecHal_PictureIsField(m_curbeParam.currOriginalPic);
91 curbe.m_data.DW7.SrcFieldPolarity = CodecHal_PictureIsBottomField(m_curbeParam.currOriginalPic);
92 }
93 curbe.m_data.DW4.PictureHeightMinus1 = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight / scaleFactor) - 1;
94 curbe.m_data.DW4.PictureWidth = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameWidth / scaleFactor);
95 curbe.m_data.DW5.QpPrimeY = m_curbeParam.qpPrimeY;
96 curbe.m_data.DW6.WriteDistortions = writeDistortions;
97 curbe.m_data.DW6.UseMvFromPrevStep = useMvFromPrevStep;
98 curbe.m_data.DW6.SuperCombineDist = SuperCombineDist[m_curbeParam.targetUsage];
99 curbe.m_data.DW6.MaxVmvR = CodecHal_PictureIsFrame(m_curbeParam.currOriginalPic) ? m_curbeParam.maxMvLen * 4 : (m_curbeParam.maxMvLen >> 1) * 4;
100
101 if (m_pictureCodingType == B_TYPE)
102 {
103 curbe.m_data.DW1.BiWeight = 32;
104 curbe.m_data.DW13.NumRefIdxL1MinusOne = m_curbeParam.numRefIdxL1Minus1;
105 }
106
107 if (m_pictureCodingType == B_TYPE ||
108 m_pictureCodingType == P_TYPE)
109 {
110 curbe.m_data.DW13.NumRefIdxL0MinusOne = m_curbeParam.numRefIdxL0Minus1;
111 }
112
113 if (!CodecHal_PictureIsFrame(m_curbeParam.currOriginalPic))
114 {
115 if (m_pictureCodingType != I_TYPE)
116 {
117 curbe.m_data.DW14.List0RefID0FieldParity = m_curbeParam.list0RefID0FieldParity;
118 curbe.m_data.DW14.List0RefID1FieldParity = m_curbeParam.list0RefID1FieldParity;
119 curbe.m_data.DW14.List0RefID2FieldParity = m_curbeParam.list0RefID2FieldParity;
120 curbe.m_data.DW14.List0RefID3FieldParity = m_curbeParam.list0RefID3FieldParity;
121 curbe.m_data.DW14.List0RefID4FieldParity = m_curbeParam.list0RefID4FieldParity;
122 curbe.m_data.DW14.List0RefID5FieldParity = m_curbeParam.list0RefID5FieldParity;
123 curbe.m_data.DW14.List0RefID6FieldParity = m_curbeParam.list0RefID6FieldParity;
124 curbe.m_data.DW14.List0RefID7FieldParity = m_curbeParam.list0RefID7FieldParity;
125 }
126 if (m_pictureCodingType == B_TYPE)
127 {
128 curbe.m_data.DW14.List1RefID0FieldParity = m_curbeParam.list1RefID0FieldParity;
129 curbe.m_data.DW14.List1RefID1FieldParity = m_curbeParam.list1RefID1FieldParity;
130 }
131 }
132 curbe.m_data.DW15.MvShiftFactor = mvShiftFactor;
133 curbe.m_data.DW15.PrevMvReadPosFactor = prevMvReadPosFactor;
134
135 // r3 & r4
136 uint8_t methodIndex;
137 if (m_pictureCodingType == B_TYPE)
138 {
139 CODECHAL_ENCODE_CHK_NULL_RETURN(m_bmeMethodTable);
140 methodIndex = m_curbeParam.bmeMethodTable ?
141 m_curbeParam.bmeMethodTable[m_curbeParam.targetUsage] : m_bmeMethodTable[m_curbeParam.targetUsage];
142 }
143 else
144 {
145 CODECHAL_ENCODE_CHK_NULL_RETURN(m_meMethodTable);
146 methodIndex = m_curbeParam.meMethodTable ?
147 m_curbeParam.meMethodTable[m_curbeParam.targetUsage] : m_meMethodTable[m_curbeParam.targetUsage];
148 }
149
150 uint8_t tableIndex = (m_pictureCodingType == B_TYPE) ? 1 : 0;
151 MOS_SecureMemcpy(&curbe.m_data.SpDelta, 14 * sizeof(uint32_t), codechalEncodeSearchPath[tableIndex][methodIndex], 14 * sizeof(uint32_t));
152
153 //r5
154 curbe.m_data.DW32._4xMeMvOutputDataSurfIndex = BindingTableOffset::meOutputMvDataSurface;
155 curbe.m_data.DW33._16xOr32xMeMvInputDataSurfIndex = BindingTableOffset::meInputMvDataSurface;
156 curbe.m_data.DW34._4xMeOutputDistSurfIndex = BindingTableOffset::meDistortionSurface;
157 curbe.m_data.DW35._4xMeOutputBrcDistSurfIndex = BindingTableOffset::meBrcDistortion;
158 curbe.m_data.DW36.VMEFwdInterPredictionSurfIndex = BindingTableOffset::meCurrForFwdRef;
159 curbe.m_data.DW37.VMEBwdInterPredictionSurfIndex = BindingTableOffset::meCurrForBwdRef;
160
161 CODECHAL_ENCODE_CHK_STATUS_RETURN(kernelState->m_dshRegion.AddData(&curbe.m_data, kernelState->dwCurbeOffset, Curbe::m_curbeSize));
162
163 return MOS_STATUS_SUCCESS;
164 }
165