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