1 /*
2 * Copyright (c) 2017-2019, 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_encode_jpeg_g12.cpp
24 //! \brief Defines state class for JPEG encoder.
25 //!
26
27 #include "codechal_encode_jpeg_g12.h"
28 #include "codechal_mmc_g12.h"
29 #include "mos_util_user_interface.h"
30
CodechalEncodeJpegStateG12(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface,PCODECHAL_STANDARD_INFO standardInfo)31 CodechalEncodeJpegStateG12::CodechalEncodeJpegStateG12(
32 CodechalHwInterface* hwInterface,
33 CodechalDebugInterface* debugInterface,
34 PCODECHAL_STANDARD_INFO standardInfo)
35 : CodechalEncodeJpegState(hwInterface, debugInterface, standardInfo),
36 m_sinlgePipeVeState(nullptr)
37 {
38 CODECHAL_ENCODE_FUNCTION_ENTER;
39 InitMmcState();
40
41 CODECHAL_ENCODE_CHK_NULL_NO_STATUS_RETURN(m_osInterface);
42 Mos_SetVirtualEngineSupported(m_osInterface, true);
43 Mos_CheckVirtualEngineSupported(m_osInterface, false, true);
44 }
45
~CodechalEncodeJpegStateG12()46 CodechalEncodeJpegStateG12::~CodechalEncodeJpegStateG12()
47 {
48 if (m_sinlgePipeVeState)
49 {
50 MOS_FreeMemAndSetNull(m_sinlgePipeVeState);
51 }
52 }
53
SendPrologWithFrameTracking(PMOS_COMMAND_BUFFER cmdBuffer,bool frameTrackingRequested,MHW_MI_MMIOREGISTERS * mmioRegister)54 MOS_STATUS CodechalEncodeJpegStateG12::SendPrologWithFrameTracking(
55 PMOS_COMMAND_BUFFER cmdBuffer,
56 bool frameTrackingRequested,
57 MHW_MI_MMIOREGISTERS *mmioRegister)
58 {
59 MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams;
60 MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS));
61 forceWakeupParams.bMFXPowerWellControl = true;
62 forceWakeupParams.bMFXPowerWellControlMask = true;
63 forceWakeupParams.bHEVCPowerWellControl = false;
64 forceWakeupParams.bHEVCPowerWellControlMask = true;
65 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiForceWakeupCmd(
66 cmdBuffer,
67 &forceWakeupParams));
68
69 return CodechalEncoderState::SendPrologWithFrameTracking(cmdBuffer, frameTrackingRequested, mmioRegister);
70 }
71
InitMmcState()72 MOS_STATUS CodechalEncodeJpegStateG12::InitMmcState()
73 {
74 CODECHAL_ENCODE_FUNCTION_ENTER;
75 #ifdef _MMC_SUPPORTED
76 m_mmcState = MOS_New(CodecHalMmcStateG12, m_hwInterface);
77 CODECHAL_ENCODE_CHK_NULL_RETURN(m_mmcState);
78 #endif
79 return MOS_STATUS_SUCCESS;
80 }
81
SetAndPopulateVEHintParams(PMOS_COMMAND_BUFFER cmdBuffer)82 MOS_STATUS CodechalEncodeJpegStateG12::SetAndPopulateVEHintParams(
83 PMOS_COMMAND_BUFFER cmdBuffer)
84 {
85 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
86
87 CODECHAL_ENCODE_FUNCTION_ENTER;
88
89 if (!MOS_VE_SUPPORTED(m_osInterface))
90 {
91 return eStatus;
92 }
93
94 if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
95 {
96 MOS_VIRTUALENGINE_SET_PARAMS vesetParams;
97 MOS_ZeroMemory(&vesetParams, sizeof(vesetParams));
98 vesetParams.bNeedSyncWithPrevious = true;
99 vesetParams.bSFCInUse = false;
100 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalEncodeSinglePipeVE_SetHintParams(m_sinlgePipeVeState, &vesetParams));
101 }
102 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalEncodeSinglePipeVE_PopulateHintParams(m_sinlgePipeVeState, cmdBuffer, true));
103
104 return eStatus;
105 }
106
UserFeatureKeyReport()107 MOS_STATUS CodechalEncodeJpegStateG12::UserFeatureKeyReport()
108 {
109 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
110
111 CODECHAL_ENCODE_FUNCTION_ENTER;
112
113 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncoderState::UserFeatureKeyReport());
114
115 #if (_DEBUG || _RELEASE_INTERNAL)
116
117 // VE2.0 Reporting
118 CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENABLE_ENCODE_VE_CTXSCHEDULING_ID, MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface));
119
120 #endif // _DEBUG || _RELEASE_INTERNAL
121 return eStatus;
122 }
123
SubmitCommandBuffer(PMOS_COMMAND_BUFFER cmdBuffer,int32_t bNullRendering)124 MOS_STATUS CodechalEncodeJpegStateG12::SubmitCommandBuffer(
125 PMOS_COMMAND_BUFFER cmdBuffer,
126 int32_t bNullRendering)
127 {
128 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
129
130 CODECHAL_ENCODE_FUNCTION_ENTER;
131
132 CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
133
134 CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
135 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(
136 m_osInterface,
137 cmdBuffer,
138 bNullRendering));
139
140 return eStatus;
141 }
142
Initialize(CodechalSetting * settings)143 MOS_STATUS CodechalEncodeJpegStateG12::Initialize(CodechalSetting *settings)
144 {
145 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
146
147 CODECHAL_ENCODE_FUNCTION_ENTER;
148
149 CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface);
150 CODECHAL_ENCODE_CHK_NULL_RETURN(m_miInterface);
151 CODECHAL_ENCODE_CHK_NULL_RETURN(settings);
152
153 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncoderState::Initialize(settings));
154
155 // Picture Level Commands
156 CODECHAL_ENCODE_CHK_STATUS_RETURN(
157 m_hwInterface->GetMfxStateCommandsDataSize(
158 CODECHAL_ENCODE_MODE_JPEG,
159 &m_pictureStatesSize,
160 &m_picturePatchListSize,
161 0));
162
163 // Slice Level Commands (cannot be placed in 2nd level batch)
164 CODECHAL_ENCODE_CHK_STATUS_RETURN(
165 m_hwInterface->GetMfxPrimitiveCommandsDataSize(
166 CODECHAL_ENCODE_MODE_JPEG,
167 &m_sliceStatesSize,
168 &m_slicePatchListSize,
169 0));
170
171 if (MOS_VE_SUPPORTED(m_osInterface))
172 {
173 m_sinlgePipeVeState = (PCODECHAL_ENCODE_SINGLEPIPE_VIRTUALENGINE_STATE)MOS_AllocAndZeroMemory(sizeof(CODECHAL_ENCODE_SINGLEPIPE_VIRTUALENGINE_STATE));
174 CODECHAL_ENCODE_CHK_NULL_RETURN(m_sinlgePipeVeState);
175 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalEncodeSinglePipeVE_InitInterface(m_hwInterface, m_sinlgePipeVeState));
176 }
177
178 return eStatus;
179 }
180
SetGpuCtxCreatOption()181 MOS_STATUS CodechalEncodeJpegStateG12::SetGpuCtxCreatOption()
182 {
183 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
184
185 CODECHAL_ENCODE_FUNCTION_ENTER;
186
187 if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
188 {
189 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncoderState::SetGpuCtxCreatOption());
190 }
191 else
192 {
193 m_gpuCtxCreatOpt = MOS_New(MOS_GPUCTX_CREATOPTIONS_ENHANCED);
194 CODECHAL_ENCODE_CHK_NULL_RETURN(m_gpuCtxCreatOpt);
195
196 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalEncodeSinglePipeVE_ConstructParmsForGpuCtxCreation(
197 m_sinlgePipeVeState,
198 (PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt));
199 }
200
201 return eStatus;
202 }
203
204