1 /*
2 * Copyright (c) 2017-2021, 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_encode_jpeg_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
40 CODECHAL_ENCODE_CHK_NULL_NO_STATUS_RETURN(m_osInterface);
41 Mos_SetVirtualEngineSupported(m_osInterface, true);
42 m_osInterface->pfnVirtualEngineSupported(m_osInterface, false, true);
43 }
44
~CodechalEncodeJpegStateG12()45 CodechalEncodeJpegStateG12::~CodechalEncodeJpegStateG12()
46 {
47 if (m_sinlgePipeVeState)
48 {
49 MOS_FreeMemAndSetNull(m_sinlgePipeVeState);
50 }
51 }
52
SendPrologWithFrameTracking(PMOS_COMMAND_BUFFER cmdBuffer,bool frameTrackingRequested,MHW_MI_MMIOREGISTERS * mmioRegister)53 MOS_STATUS CodechalEncodeJpegStateG12::SendPrologWithFrameTracking(
54 PMOS_COMMAND_BUFFER cmdBuffer,
55 bool frameTrackingRequested,
56 MHW_MI_MMIOREGISTERS *mmioRegister)
57 {
58 MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams;
59 MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS));
60 forceWakeupParams.bMFXPowerWellControl = true;
61 forceWakeupParams.bMFXPowerWellControlMask = true;
62 forceWakeupParams.bHEVCPowerWellControl = false;
63 forceWakeupParams.bHEVCPowerWellControlMask = true;
64 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiForceWakeupCmd(
65 cmdBuffer,
66 &forceWakeupParams));
67
68 return CodechalEncoderState::SendPrologWithFrameTracking(cmdBuffer, frameTrackingRequested, mmioRegister);
69 }
70
InitMmcState()71 MOS_STATUS CodechalEncodeJpegStateG12::InitMmcState()
72 {
73 CODECHAL_ENCODE_FUNCTION_ENTER;
74 #ifdef _MMC_SUPPORTED
75 m_mmcState = MOS_New(CodechalMmcEncodeJpegG12, m_hwInterface, this);
76 CODECHAL_ENCODE_CHK_NULL_RETURN(m_mmcState);
77 #endif
78 return MOS_STATUS_SUCCESS;
79 }
80
SetAndPopulateVEHintParams(PMOS_COMMAND_BUFFER cmdBuffer)81 MOS_STATUS CodechalEncodeJpegStateG12::SetAndPopulateVEHintParams(
82 PMOS_COMMAND_BUFFER cmdBuffer)
83 {
84 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
85
86 CODECHAL_ENCODE_FUNCTION_ENTER;
87
88 if (!MOS_VE_SUPPORTED(m_osInterface))
89 {
90 return eStatus;
91 }
92
93 if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
94 {
95 MOS_VIRTUALENGINE_SET_PARAMS vesetParams;
96 MOS_ZeroMemory(&vesetParams, sizeof(vesetParams));
97 vesetParams.bNeedSyncWithPrevious = true;
98 vesetParams.bSFCInUse = false;
99 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalEncodeSinglePipeVE_SetHintParams(m_sinlgePipeVeState, &vesetParams));
100 }
101 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalEncodeSinglePipeVE_PopulateHintParams(m_sinlgePipeVeState, cmdBuffer, true));
102
103 return eStatus;
104 }
105
UserFeatureKeyReport()106 MOS_STATUS CodechalEncodeJpegStateG12::UserFeatureKeyReport()
107 {
108 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
109
110 CODECHAL_ENCODE_FUNCTION_ENTER;
111
112 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncoderState::UserFeatureKeyReport());
113
114 #if (_DEBUG || _RELEASE_INTERNAL)
115
116 // VE2.0 Reporting
117 CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENABLE_ENCODE_VE_CTXSCHEDULING_ID, MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface), m_osInterface->pOsContext);
118
119 #endif // _DEBUG || _RELEASE_INTERNAL
120 return eStatus;
121 }
122
SubmitCommandBuffer(PMOS_COMMAND_BUFFER cmdBuffer,bool bNullRendering)123 MOS_STATUS CodechalEncodeJpegStateG12::SubmitCommandBuffer(
124 PMOS_COMMAND_BUFFER cmdBuffer,
125 bool bNullRendering)
126 {
127 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
128
129 CODECHAL_ENCODE_FUNCTION_ENTER;
130
131 CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
132
133 CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
134 CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(
135 m_osInterface,
136 cmdBuffer,
137 bNullRendering));
138
139 return eStatus;
140 }
141
Initialize(CodechalSetting * settings)142 MOS_STATUS CodechalEncodeJpegStateG12::Initialize(CodechalSetting *settings)
143 {
144 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
145
146 CODECHAL_ENCODE_FUNCTION_ENTER;
147
148 CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface);
149 CODECHAL_ENCODE_CHK_NULL_RETURN(m_miInterface);
150 CODECHAL_ENCODE_CHK_NULL_RETURN(settings);
151
152 CODECHAL_ENCODE_CHK_STATUS_RETURN(InitMmcState());
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