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