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_decode_avc_g11.cpp
24 //! \brief     This modules implements Render interface layer for AVC decoding to be used on all operating systems/DDIs, across CODECHAL components.
25 //!
26 
27 #include "codechal_decoder.h"
28 #include "codechal_decode_avc_g12.h"
29 #include "codechal_secure_decode_interface.h"
30 #include "codechal_decode_histogram.h"
31 #include "mhw_vdbox_mfx_g12_X.h"
32 #include "codechal_mmc_decode_avc_g12.h"
33 #include "hal_oca_interface.h"
34 
AllocateStandard(CodechalSetting * settings)35 MOS_STATUS CodechalDecodeAvcG12::AllocateStandard(
36     CodechalSetting *          settings)
37 {
38     CODECHAL_DECODE_FUNCTION_ENTER;
39 
40     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
41 
42     CODECHAL_DECODE_CHK_NULL_RETURN(settings);
43 
44     CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeAvc::AllocateStandard(settings));
45 #ifdef _MMC_SUPPORTED
46     // To WA invalid aux data caused HW issue when MMC on
47     // Add disable Clear CCS WA due to green corruption issue
48     if (m_mmc->IsMmcEnabled())
49     {
50         if (MEDIA_IS_WA(m_waTable, Wa_1408785368) || MEDIA_IS_WA(m_waTable, Wa_22010493002) && (!MEDIA_IS_WA(m_waTable, WaDisableClearCCS)))
51         {
52             //Add HUC STATE Commands
53             MHW_VDBOX_STATE_CMDSIZE_PARAMS stateCmdSizeParams;
54 
55             m_hwInterface->GetHucStateCommandSize(
56                 CODECHAL_DECODE_MODE_AVCVLD,
57                 &m_HucStateCmdBufferSizeNeeded,
58                 &m_HucPatchListSizeNeeded,
59                 &stateCmdSizeParams);
60         }
61     }
62 #endif
63 
64     if ( MOS_VE_SUPPORTED(m_osInterface))
65     {
66         static_cast<MhwVdboxMfxInterfaceG12*>(m_mfxInterface)->DisableScalabilitySupport();
67 
68         //single pipe VE initialize
69         m_veState = (PCODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE)MOS_AllocAndZeroMemory(sizeof(CODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE));
70         CODECHAL_DECODE_CHK_NULL_RETURN(m_veState);
71         CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_InitInterface(m_osInterface, m_veState));
72     }
73 
74     return eStatus;
75 }
76 
InitSfcState()77 MOS_STATUS CodechalDecodeAvcG12::InitSfcState()
78 {
79 #ifdef _DECODE_PROCESSING_SUPPORTED
80     m_sfcState = MOS_New(CodechalAvcSfcStateG12);
81     CODECHAL_DECODE_CHK_NULL_RETURN(m_sfcState);
82     CODECHAL_DECODE_CHK_STATUS_RETURN(m_sfcState->InitializeSfcState(
83         this,
84         m_hwInterface,
85         m_osInterface));
86 #endif
87     return MOS_STATUS_SUCCESS;
88 }
89 
~CodechalDecodeAvcG12()90 CodechalDecodeAvcG12::~CodechalDecodeAvcG12()
91 {
92     CODECHAL_DECODE_FUNCTION_ENTER;
93 
94     if (m_veState)
95     {
96         MOS_FreeMemAndSetNull(m_veState);
97         m_veState = nullptr;
98     }
99 
100     if (m_histogramSurface)
101     {
102         if (!Mos_ResourceIsNull(&m_histogramSurface->OsResource))
103         {
104             m_osInterface->pfnFreeResource(
105                 m_osInterface,
106                 &m_histogramSurface->OsResource);
107         }
108 
109         MOS_FreeMemory(m_histogramSurface);
110         m_histogramSurface = nullptr;
111     }
112 
113     return;
114 }
115 
InitMmcState()116 MOS_STATUS CodechalDecodeAvcG12::InitMmcState()
117 {
118 #ifdef _MMC_SUPPORTED
119     m_mmc = MOS_New(CodechalMmcDecodeAvcG12, m_hwInterface, this);
120     CODECHAL_DECODE_CHK_NULL_RETURN(m_mmc);
121 #endif
122     return MOS_STATUS_SUCCESS;
123 }
124 
SetGpuCtxCreatOption(CodechalSetting * codecHalSetting)125 MOS_STATUS CodechalDecodeAvcG12::SetGpuCtxCreatOption(
126     CodechalSetting *codecHalSetting)
127 {
128     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
129 
130     CODECHAL_DECODE_FUNCTION_ENTER;
131 
132     if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
133     {
134         CodechalDecode::SetGpuCtxCreatOption(codecHalSetting);
135     }
136     else
137     {
138         m_gpuCtxCreatOpt = MOS_New(MOS_GPUCTX_CREATOPTIONS_ENHANCED);
139         bool sfcInUse    = (codecHalSetting->sfcInUseHinted && codecHalSetting->downsamplingHinted
140                             && (MEDIA_IS_SKU(m_skuTable, FtrSFCPipe) && !MEDIA_IS_SKU(m_skuTable, FtrDisableVDBox2SFC)));
141         CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_ConstructParmsForGpuCtxCreation(
142             m_veState,
143             (PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt,
144             sfcInUse));
145         m_videoContext = MOS_GPU_CONTEXT_VIDEO;
146     }
147 
148     return eStatus;
149 }
150 
AllocateHistogramSurface()151 MOS_STATUS CodechalDecodeAvcG12::AllocateHistogramSurface()
152 {
153     MOS_ALLOC_GFXRES_PARAMS allocParams;
154 
155     if (m_histogramSurface == nullptr)
156     {
157         m_histogramSurface = (MOS_SURFACE*)MOS_AllocAndZeroMemory(sizeof(MOS_SURFACE));
158         CODECHAL_DECODE_CHK_NULL_RETURN(m_histogramSurface);
159 
160         MOS_ZeroMemory(&allocParams, sizeof(MOS_ALLOC_GFXRES_PARAMS));
161         allocParams.Type = MOS_GFXRES_BUFFER;
162         allocParams.TileType = MOS_TILE_LINEAR;
163         allocParams.Format = Format_Buffer;
164         allocParams.dwBytes = 256 * 4;
165         allocParams.pBufName = "HistogramStreamOut";
166 
167         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnAllocateResource(
168             m_osInterface,
169             &allocParams,
170             &m_histogramSurface->OsResource));
171 
172         CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(
173             m_osInterface,
174             m_histogramSurface));
175     }
176 
177     if (m_decodeHistogram)
178         m_decodeHistogram->SetSrcHistogramSurface(m_histogramSurface);
179 
180     return MOS_STATUS_SUCCESS;
181 }
182 
CalcRequestedSpace(uint32_t & requestedSize,uint32_t & additionalSizeNeeded,uint32_t & requestedPatchListSize)183 void CodechalDecodeAvcG12::CalcRequestedSpace(
184     uint32_t &requestedSize,
185     uint32_t &additionalSizeNeeded,
186     uint32_t &requestedPatchListSize)
187 {
188     CODECHAL_DECODE_FUNCTION_ENTER;
189 
190     requestedSize          = m_commandBufferSizeNeeded + m_HucStateCmdBufferSizeNeeded +
191                     (m_standardDecodeSizeNeeded * (m_decodeParams.m_numSlices + 1));
192     requestedPatchListSize = m_commandPatchListSizeNeeded + m_HucPatchListSizeNeeded +
193                              (m_standardDecodePatchListSizeNeeded * (m_decodeParams.m_numSlices + 1));
194     additionalSizeNeeded = COMMAND_BUFFER_RESERVED_SPACE;
195 
196 }
197 
SetFrameStates()198 MOS_STATUS CodechalDecodeAvcG12::SetFrameStates()
199 {
200     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
201 
202     CODECHAL_DECODE_FUNCTION_ENTER;
203 
204     if (m_secureDecoder)
205     {
206         m_secureDecoder->EnableSampleGroupConstantIV();
207     }
208 
209 #ifdef _DECODE_PROCESSING_SUPPORTED
210     if (m_decodeParams.m_procParams)
211     {
212         CODECHAL_DECODE_CHK_STATUS_RETURN(AllocateHistogramSurface());
213 
214         ((DecodeProcessingParams*)m_decodeParams.m_procParams)->m_histogramSurface = m_histogramSurface;
215 
216         if (m_decodeHistogram)
217             m_decodeHistogram->SetSrcHistogramSurface(m_histogramSurface);
218 
219     }
220 #endif
221 
222     CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeAvc::SetFrameStates());
223 
224     if (MOS_VE_SUPPORTED(m_osInterface) && !MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
225     {
226         MOS_VIRTUALENGINE_SET_PARAMS vesetParams;
227 
228         MOS_ZeroMemory(&vesetParams, sizeof(vesetParams));
229 #ifdef _DECODE_PROCESSING_SUPPORTED
230         vesetParams.bSFCInUse = m_sfcState->m_sfcPipeOut;
231 #else
232         vesetParams.bSFCInUse                   = false;
233 #endif
234         vesetParams.bNeedSyncWithPrevious = true;
235         vesetParams.bSameEngineAsLastSubmission = false;
236         CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_SetHintParams(m_veState, &vesetParams));
237     }
238 
239     return eStatus;
240 }
241 
DecodeStateLevel()242 MOS_STATUS CodechalDecodeAvcG12::DecodeStateLevel()
243 {
244     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
245 
246     CODECHAL_DECODE_FUNCTION_ENTER;
247 
248 #ifdef _MMC_SUPPORTED
249     // To WA invalid aux data caused HW issue when MMC on
250     // Add disable Clear CCS WA due to green corruption issue
251     if (m_mmc->IsMmcEnabled() && m_decodeParams.m_destSurface && !Mos_ResourceIsNull(&m_decodeParams.m_destSurface->OsResource) &&
252         m_decodeParams.m_destSurface->OsResource.bConvertedFromDDIResource)
253     {
254         if (MEDIA_IS_WA(m_waTable, Wa_1408785368) || MEDIA_IS_WA(m_waTable, Wa_22010493002) && (!MEDIA_IS_WA(m_waTable, WaDisableClearCCS)))
255         {
256             if (m_secureDecoder && m_secureDecoder->IsAuxDataInvalid(&m_decodeParams.m_destSurface->OsResource))
257             {
258                 CODECHAL_DECODE_CHK_STATUS_RETURN(m_secureDecoder->InitAuxSurface(&m_decodeParams.m_destSurface->OsResource, false, true));
259             }
260             else
261             {
262                 CODECHAL_DECODE_VERBOSEMESSAGE("Clear CCS by VE resolve before frame %d submission", m_frameNum);
263                 CODECHAL_DECODE_CHK_STATUS_RETURN(static_cast<CodecHalMmcStateG12 *>(m_mmc)->ClearAuxSurf(
264                     this, m_miInterface, &m_decodeParams.m_destSurface->OsResource, m_veState));
265             }
266         }
267 
268     }
269 #endif
270 
271     if (m_secureDecoder)
272     {
273         CODECHAL_DECODE_CHK_STATUS_RETURN(m_secureDecoder->Execute(this));
274     }
275 
276     MOS_COMMAND_BUFFER cmdBuffer;
277     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
278 
279     auto mmioRegisters = m_hwInterface->GetMfxInterface()->GetMmioRegisters(m_vdboxIndex);
280     HalOcaInterface::On1stLevelBBStart(cmdBuffer, *m_osInterface->pOsContext, m_osInterface->CurrentGpuContextHandle, *m_miInterface, *mmioRegisters);
281 
282     MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams;
283     MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS));
284     forceWakeupParams.bMFXPowerWellControl = true;
285     forceWakeupParams.bMFXPowerWellControlMask = true;
286     forceWakeupParams.bHEVCPowerWellControl = false;
287     forceWakeupParams.bHEVCPowerWellControlMask = true;
288     CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiForceWakeupCmd(
289         &cmdBuffer,
290         &forceWakeupParams));
291 
292     CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(
293         &cmdBuffer, true));
294 
295     PIC_MHW_PARAMS picMhwParams;
296     CODECHAL_DECODE_CHK_STATUS_RETURN(InitPicMhwParams(&picMhwParams));
297 
298     if (m_cencBuf && m_cencBuf->checkStatusRequired)
299     {
300         CODECHAL_DECODE_COND_ASSERTMESSAGE((m_vdboxIndex > m_hwInterface->GetMfxInterface()->GetMaxVdboxIndex()), "ERROR - vdbox index exceed the maximum");
301         auto mmioRegisters = m_hwInterface->GetMfxInterface()->GetMmioRegisters(m_vdboxIndex);
302 
303         CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->GetCpInterface()->CheckStatusReportNum(
304             mmioRegisters,
305             m_cencBuf->bufIdx,
306             m_cencBuf->resStatus,
307             &cmdBuffer));
308     }
309 
310     if (m_statusQueryReportingEnabled)
311     {
312         CODECHAL_DECODE_CHK_STATUS_RETURN(StartStatusReport(&cmdBuffer));
313     }
314 
315     CODECHAL_DECODE_CHK_STATUS_RETURN(AddPictureCmds(&cmdBuffer, &picMhwParams));
316 
317     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
318 
319     return eStatus;
320 }
321 
DecodePrimitiveLevel()322 MOS_STATUS CodechalDecodeAvcG12::DecodePrimitiveLevel()
323 {
324     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
325     CODECHAL_DECODE_FUNCTION_ENTER;
326 
327     CODECHAL_DECODE_CHK_NULL_RETURN(m_avcPicParams);
328 
329     MOS_COMMAND_BUFFER cmdBuffer;
330     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
331 
332     if (m_cencBuf)
333     {
334         CODECHAL_DECODE_CHK_STATUS_RETURN(SetCencBatchBuffer(&cmdBuffer));
335     }
336     else
337     {
338         CODECHAL_DECODE_CHK_STATUS_RETURN(ParseSlice(&cmdBuffer));
339     }
340 
341     // Check if destination surface needs to be synchronized
342     MOS_SYNC_PARAMS syncParams;
343     syncParams = g_cInitSyncParams;
344     syncParams.GpuContext = m_videoContext;
345     syncParams.presSyncResource         = &m_destSurface.OsResource;
346     syncParams.bReadOnly = false;
347     syncParams.bDisableDecodeSyncLock = m_disableDecodeSyncLock;
348     syncParams.bDisableLockForTranscode = m_disableLockForTranscode;
349 
350     if (!CodecHal_PictureIsField(m_avcPicParams->CurrPic) ||
351         !m_isSecondField)
352     {
353         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnPerformOverlaySync(m_osInterface, &syncParams));
354         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceWait(m_osInterface, &syncParams));
355 
356         // Update the resource tag (s/w tag) for On-Demand Sync
357         m_osInterface->pfnSetResourceSyncTag(m_osInterface, &syncParams);
358     }
359 
360     MHW_MI_FLUSH_DW_PARAMS flushDwParams;
361     MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
362 
363     CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(
364         &cmdBuffer,
365         &flushDwParams));
366 
367     // Update the tag in GPU Sync eStatus buffer (H/W Tag) to match the current S/W tag
368     if (m_osInterface->bTagResourceSync &&
369         (!CodecHal_PictureIsField(m_avcPicParams->CurrPic) || m_isSecondField))
370     {
371         CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->WriteSyncTagToResource(&cmdBuffer, &syncParams));
372     }
373 
374     if (m_statusQueryReportingEnabled)
375     {
376         CodechalDecodeStatusReport decodeStatusReport;
377 
378         decodeStatusReport.m_statusReportNumber = m_statusReportFeedbackNumber;
379         decodeStatusReport.m_currDecodedPic     = m_avcPicParams->CurrPic;
380         decodeStatusReport.m_currDeblockedPic   = m_avcPicParams->CurrPic;
381         decodeStatusReport.m_codecStatus = CODECHAL_STATUS_UNAVAILABLE;
382         decodeStatusReport.m_currDecodedPicRes  = m_avcRefList[m_avcPicParams->CurrPic.FrameIdx]->resRefPic;
383 
384         CODECHAL_DEBUG_TOOL(
385             if (m_streamOutEnabled) {
386                 // add current streamout buffer to the report and move onto the next one
387                 decodeStatusReport.m_streamOutBuf = &(m_streamOutBuffer[m_streamOutCurrBufIdx]);
388                 decodeStatusReport.m_streamoutIdx = m_streamOutCurrBufIdx;
389                 if (++m_streamOutCurrBufIdx >= CODECHAL_DECODE_NUM_STREAM_OUT_BUFFERS)
390                 {
391                     m_streamOutCurrBufIdx = 0;
392                 }
393                 // check next buffer in the list is free.
394                 if (m_streamOutCurrStatusIdx[m_streamOutCurrBufIdx] != CODECHAL_DECODE_STATUS_NUM)
395                 {
396                     // We've run out of buffers. Temporarily lock the next one down to force a wait. Then mark it as free.
397                     CodechalResLock ResourceLock(m_osInterface, &(m_streamOutBuffer[m_streamOutCurrBufIdx]));
398                     ResourceLock.Lock(CodechalResLock::readOnly);
399 
400                     m_streamOutCurrStatusIdx[m_streamOutCurrBufIdx] = CODECHAL_DECODE_STATUS_NUM;
401                 }
402             }
403 
404             decodeStatusReport.m_secondField = m_secondField;
405             decodeStatusReport.m_frameType   = m_perfType;)
406 
407         CODECHAL_DECODE_CHK_STATUS_RETURN(EndStatusReport(decodeStatusReport, &cmdBuffer));
408     }
409 
410 #if (_DEBUG || _RELEASE_INTERNAL)
411     if (CodecHal_PictureIsFrame(m_crrPic) ||
412         CodecHal_PictureIsInterlacedFrame(m_crrPic) ||
413         m_secondField)
414     {
415         uint32_t curIdx = (GetDecodeStatusBuf()->m_currIndex + CODECHAL_DECODE_STATUS_NUM - 1) % CODECHAL_DECODE_STATUS_NUM;
416         uint32_t frameCrcOffset = curIdx * sizeof(CodechalDecodeStatus) + GetDecodeStatusBuf()->m_decFrameCrcOffset + sizeof(uint32_t) * 2;
417         std::vector<MOS_RESOURCE> vSemaResource{GetDecodeStatusBuf()->m_statusBuffer};
418         m_debugInterface->DetectCorruptionHw(m_hwInterface, &m_frameCountTypeBuf, curIdx, frameCrcOffset, vSemaResource, &cmdBuffer, m_frameNum);
419     }
420 #endif
421 
422     CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
423 
424     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
425 
426     bool syncCompleteFrame = (m_avcPicParams->seq_fields.chroma_format_idc == avcChromaFormatMono && !m_hwInterface->m_noHuC);
427     if (syncCompleteFrame)
428     {
429         syncParams = g_cInitSyncParams;
430         syncParams.GpuContext = m_videoContextForWa;
431         syncParams.presSyncResource = &m_resSyncObjectWaContextInUse;
432 
433         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
434 
435         syncParams = g_cInitSyncParams;
436         syncParams.GpuContext = m_videoContext;
437         syncParams.presSyncResource = &m_resSyncObjectWaContextInUse;
438 
439         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
440     }
441 
442     CODECHAL_DEBUG_TOOL(
443         CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
444             &cmdBuffer,
445             CODECHAL_NUM_MEDIA_STATES,
446             "_DEC"));
447 
448     //CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHal_DbgReplaceAllCommands(
449     //    m_debugInterface,
450     //    &cmdBuffer));
451     )
452 
453     if ( MOS_VE_SUPPORTED(m_osInterface))
454     {
455         CodecHalDecodeSinglePipeVE_PopulateHintParams(m_veState, &cmdBuffer, true);
456     }
457 
458     HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface);
459 
460     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_videoContextUsesNullHw));
461 
462     CODECHAL_DEBUG_TOOL(
463         m_mmc->UpdateUserFeatureKey(&m_destSurface);)
464 #ifdef _DECODE_PROCESSING_SUPPORTED
465     auto decProcessingParams = (DecodeProcessingParams *)m_decodeParams.m_procParams;
466     if (decProcessingParams != nullptr && !m_sfcState->m_sfcPipeOut && (m_isSecondField || m_avcPicParams->seq_fields.mb_adaptive_frame_field_flag))
467     {
468 #ifdef _MMC_SUPPORTED
469         // To Clear invalid aux data of output surface when MMC on
470         if (m_mmc && m_mmc->IsMmcEnabled() &&
471             !Mos_ResourceIsNull(&decProcessingParams->m_outputSurface->OsResource) &&
472             decProcessingParams->m_outputSurface->OsResource.bConvertedFromDDIResource)
473         {
474             CODECHAL_DECODE_VERBOSEMESSAGE("Clear invalid aux data of output surface before frame %d submission", m_frameNum);
475             CODECHAL_DECODE_CHK_STATUS_RETURN(static_cast<CodecHalMmcStateG12 *>(m_mmc)->ClearAuxSurf(
476                 this, m_miInterface, &decProcessingParams->m_outputSurface->OsResource, m_veState));
477         }
478 #endif
479         CODECHAL_DECODE_CHK_STATUS_RETURN(m_fieldScalingInterface->DoFieldScaling(
480             decProcessingParams,
481             m_renderContext,
482             m_disableDecodeSyncLock,
483             m_disableLockForTranscode));
484     }
485     else
486 #endif
487     {
488         if (m_statusQueryReportingEnabled)
489         {
490             CODECHAL_DECODE_CHK_STATUS_RETURN(ResetStatusReport(m_videoContextUsesNullHw));
491         }
492     }
493 
494     // Needs to be re-set for Linux buffer re-use scenarios
495     m_avcRefList[m_avcPicParams->CurrPic.FrameIdx]->resRefPic =
496         m_destSurface.OsResource;
497 
498     // Send the signal to indicate decode completion, in case On-Demand Sync is not present
499     if (!CodecHal_PictureIsField(m_avcPicParams->CurrPic) || m_isSecondField)
500     {
501         syncParams = g_cInitSyncParams;
502         syncParams.GpuContext = m_videoContext;
503         syncParams.presSyncResource = &m_destSurface.OsResource;
504 
505         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceSignal(m_osInterface, &syncParams));
506 #ifdef _DECODE_PROCESSING_SUPPORTED
507         if (decProcessingParams && !m_sfcState->m_sfcPipeOut)
508         {
509             syncParams = g_cInitSyncParams;
510             syncParams.GpuContext = m_renderContext;
511             syncParams.presSyncResource = &decProcessingParams->m_outputSurface->OsResource;
512 
513             CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceSignal(m_osInterface, &syncParams));
514         }
515 #endif
516     }
517 #ifdef _DECODE_PROCESSING_SUPPORTED
518     CODECHAL_DEBUG_TOOL(
519         // Dump out downsampling result
520         if (decProcessingParams && decProcessingParams->m_outputSurface)
521         {
522             MOS_SURFACE dstSurface;
523             MOS_ZeroMemory(&dstSurface, sizeof(dstSurface));
524             dstSurface.Format = Format_NV12;
525             dstSurface.OsResource = decProcessingParams->m_outputSurface->OsResource;
526 
527             CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(
528                 m_osInterface,
529                 &dstSurface));
530 
531             CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
532                 &dstSurface,
533                 CodechalDbgAttr::attrSfcOutputSurface,
534                 "SfcDstSurf"));
535         }
536     )
537 #endif
538         return eStatus;
539 }
540 
CodechalDecodeAvcG12(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface,PCODECHAL_STANDARD_INFO standardInfo)541 CodechalDecodeAvcG12::CodechalDecodeAvcG12(
542     CodechalHwInterface *   hwInterface,
543     CodechalDebugInterface *debugInterface,
544     PCODECHAL_STANDARD_INFO standardInfo) : CodechalDecodeAvc(hwInterface, debugInterface, standardInfo),
545                                             m_veState(nullptr)
546 {
547     CODECHAL_DECODE_FUNCTION_ENTER;
548 
549     CODECHAL_DECODE_CHK_NULL_NO_STATUS_RETURN(m_osInterface);
550 
551     Mos_CheckVirtualEngineSupported(m_osInterface, true, true);
552 }
553 
FormatAvcMonoPicture(PMOS_SURFACE surface)554 MOS_STATUS CodechalDecodeAvcG12::FormatAvcMonoPicture(PMOS_SURFACE surface)
555 {
556     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
557 
558     PCODEC_AVC_PIC_PARAMS picParams = (PCODEC_AVC_PIC_PARAMS)m_avcPicParams;
559     if (picParams->seq_fields.chroma_format_idc != avcChromaFormatMono)
560     {
561         CODECHAL_DECODE_VERBOSEMESSAGE("None mono case");
562         return MOS_STATUS_SUCCESS;
563     }
564 
565     if (surface == nullptr || Mos_ResourceIsNull(&surface->OsResource))
566     {
567         CODECHAL_DECODE_ASSERTMESSAGE("Surface pointer is NULL!");
568         return MOS_STATUS_INVALID_PARAMETER;
569     }
570 
571 #ifdef _MMC_SUPPORTED
572     // Initialize the UV aux data of protected surfaces before HucCopy of UV plane
573     if (m_mmc && m_mmc->IsMmcEnabled() && !MEDIA_IS_WA(m_waTable, Wa_1408785368) &&
574         m_secureDecoder && m_osInterface->osCpInterface->IsHMEnabled())
575     {
576         CODECHAL_DECODE_VERBOSEMESSAGE("Initialize the UV aux data for %d submission", m_frameNum);
577         CODECHAL_DECODE_CHK_STATUS_RETURN(m_secureDecoder->InitAuxSurface(&surface->OsResource, true, true));
578     }
579 #endif
580 
581     return CodechalDecodeAvc::FormatAvcMonoPicture(surface);
582 }
583