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